From 9d46fe0c77b8414f08f8c4ceb7fcaff2783be80a Mon Sep 17 00:00:00 2001 From: vadim-kharin-codefresh <58422638+vadim-kharin-codefresh@users.noreply.github.com> Date: Fri, 6 Dec 2019 17:22:31 +0200 Subject: [PATCH 01/35] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 00bcb6e..7d470ee 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -# test \ No newline at end of file +# testsadf From e34fa69afe19264e802d0bc8582bc54af9b678e6 Mon Sep 17 00:00:00 2001 From: vadim-kharin-codefresh <58422638+vadim-kharin-codefresh@users.noreply.github.com> Date: Thu, 12 Dec 2019 14:43:49 +0200 Subject: [PATCH 02/35] Create Dockerfile --- Dockerfile | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..9552a4f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,3 @@ +FROM scratch +ADD hello / +CMD ["/hello"] From d0fe911118b0fbd97781ff3471339f59bfba4e2e Mon Sep 17 00:00:00 2001 From: Vadim Kharin Date: Thu, 12 Dec 2019 15:09:22 +0200 Subject: [PATCH 03/35] add app --- Dockerfile | 18 ++++++-- app.js | 41 ++++++++++++++++ bin/www | 90 ++++++++++++++++++++++++++++++++++++ package.json | 16 +++++++ public/stylesheets/style.css | 8 ++++ routes/index.js | 9 ++++ routes/users.js | 9 ++++ views/error.pug | 6 +++ views/index.pug | 5 ++ views/layout.pug | 7 +++ 10 files changed, 206 insertions(+), 3 deletions(-) create mode 100644 app.js create mode 100755 bin/www create mode 100644 package.json create mode 100644 public/stylesheets/style.css create mode 100644 routes/index.js create mode 100644 routes/users.js create mode 100644 views/error.pug create mode 100644 views/index.pug create mode 100644 views/layout.pug diff --git a/Dockerfile b/Dockerfile index 9552a4f..947b4af 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1,15 @@ -FROM scratch -ADD hello / -CMD ["/hello"] +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/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/package.json b/package.json new file mode 100644 index 0000000..124b7ab --- /dev/null +++ b/package.json @@ -0,0 +1,16 @@ +{ + "name": "app", + "version": "0.0.0", + "private": true, + "scripts": { + "start": "node ./bin/www" + }, + "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" + } +} 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/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 From 32994a01da08ac342c862d5c0e92b47178a43b75 Mon Sep 17 00:00:00 2001 From: Vadim Kharin Date: Wed, 25 Dec 2019 11:02:40 +0200 Subject: [PATCH 04/35] add test --- .../assets/MaterialIcons-Regular.woff | Bin 0 -> 57620 bytes .../assets/MaterialIcons-Regular.woff2 | Bin 0 -> 44300 bytes mochawesome-report/assets/app.css | 14 + mochawesome-report/assets/app.js | 1 + .../assets/roboto-light-webfont.woff | Bin 0 -> 25772 bytes .../assets/roboto-light-webfont.woff2 | Bin 0 -> 19508 bytes .../assets/roboto-medium-webfont.woff | Bin 0 -> 26292 bytes .../assets/roboto-medium-webfont.woff2 | Bin 0 -> 19944 bytes .../assets/roboto-regular-webfont.woff | Bin 0 -> 26280 bytes .../assets/roboto-regular-webfont.woff2 | Bin 0 -> 19868 bytes mochawesome-report/mochawesome.html | 2 + mochawesome-report/mochawesome.json | 176 +++ package-lock.json | 1004 +++++++++++++++++ package.json | 8 +- test/sum.js | 20 + 15 files changed, 1224 insertions(+), 1 deletion(-) create mode 100644 mochawesome-report/assets/MaterialIcons-Regular.woff create mode 100644 mochawesome-report/assets/MaterialIcons-Regular.woff2 create mode 100644 mochawesome-report/assets/app.css create mode 100644 mochawesome-report/assets/app.js create mode 100644 mochawesome-report/assets/roboto-light-webfont.woff create mode 100644 mochawesome-report/assets/roboto-light-webfont.woff2 create mode 100644 mochawesome-report/assets/roboto-medium-webfont.woff create mode 100644 mochawesome-report/assets/roboto-medium-webfont.woff2 create mode 100644 mochawesome-report/assets/roboto-regular-webfont.woff create mode 100644 mochawesome-report/assets/roboto-regular-webfont.woff2 create mode 100644 mochawesome-report/mochawesome.html create mode 100644 mochawesome-report/mochawesome.json create mode 100644 package-lock.json create mode 100644 test/sum.js diff --git a/mochawesome-report/assets/MaterialIcons-Regular.woff b/mochawesome-report/assets/MaterialIcons-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..b648a3eea2d16b6ce783906d6b7d5f251b9eb56c GIT binary patch literal 57620 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

wF7DI|Kx|V1sBQ9FYs>m5C)C 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 BJ$(QG literal 0 HcmV?d00001 diff --git a/mochawesome-report/assets/MaterialIcons-Regular.woff2 b/mochawesome-report/assets/MaterialIcons-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9fa211252080046a23b2449dbdced6abc2b0bb34 GIT binary patch literal 44300 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 QW8}wPUeo^@jR61v08@RD2LJ#7 literal 0 HcmV?d00001 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+=""}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

kgYV&=aTZp6v>HirW%!Tl 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 literal 0 HcmV?d00001 diff --git a/mochawesome-report/assets/roboto-medium-webfont.woff b/mochawesome-report/assets/roboto-medium-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..38aebe506e576991c27a659b12d7be9d71534618 GIT binary patch literal 26292 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 literal 0 HcmV?d00001 diff --git a/mochawesome-report/assets/roboto-medium-webfont.woff2 b/mochawesome-report/assets/roboto-medium-webfont.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..6b22807f64e95721daccc8fb8a670f4b7c2cea7f GIT binary patch literal 19944 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 literal 0 HcmV?d00001 diff --git a/mochawesome-report/assets/roboto-regular-webfont.woff b/mochawesome-report/assets/roboto-regular-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..d0890af2110f6be98594dc5f96f1c950a1d58ecd GIT binary patch literal 26280 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 +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/package-lock.json b/package-lock.json new file mode 100644 index 0000000..4e3ce97 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1004 @@ +{ + "name": "app", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "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" + } + }, + "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 + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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 + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "chai": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" + } + }, + "chalk": { + "version": "2.4.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" + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "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 + }, + "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 + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "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" + } + }, + "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 + }, + "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 + }, + "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-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 + }, + "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" + } + }, + "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==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "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 + }, + "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==", + "dev": true, + "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 + }, + "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 + }, + "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-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-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "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-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" + } + }, + "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" + } + }, + "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==", + "dev": true + }, + "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" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "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" + } + }, + "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 + }, + "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=", + "dev": true + }, + "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" + } + }, + "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 + }, + "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 + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "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" + } + }, + "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 + }, + "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 + }, + "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 + }, + "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 + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "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" + } + }, + "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 + }, + "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 + }, + "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 + }, + "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" + } + } + } + }, + "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 + }, + "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 index 124b7ab..046642b 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,8 @@ "version": "0.0.0", "private": true, "scripts": { - "start": "node ./bin/www" + "start": "node ./bin/www", + "test": "mocha --reporter mochawesome" }, "dependencies": { "cookie-parser": "~1.4.4", @@ -12,5 +13,10 @@ "http-errors": "~1.6.3", "morgan": "~1.9.1", "pug": "2.0.0-beta11" + }, + "devDependencies": { + "chai": "^4.2.0", + "mocha": "^6.2.2", + "mochawesome": "^4.1.0" } } diff --git a/test/sum.js b/test/sum.js new file mode 100644 index 0000000..ab62bc8 --- /dev/null +++ b/test/sum.js @@ -0,0 +1,20 @@ +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() { + expect(15).to.equal(15) + }) + + it('should return argument when only one argument is passed', function() { + expect(5).to.equal(5) + }) + }) +}) From 3297eaa1793f4996d14ca142b2138ac2742e9559 Mon Sep 17 00:00:00 2001 From: vadim-kharin-codefresh <58422638+vadim-kharin-codefresh@users.noreply.github.com> Date: Tue, 28 Jan 2020 18:21:13 +0200 Subject: [PATCH 05/35] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7d470ee..4c7c31e 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -# testsadf +# version From 029558d0d238e3b6283e376b6b06a8c32efe0b4b Mon Sep 17 00:00:00 2001 From: vadim-kharin-codefresh <58422638+vadim-kharin-codefresh@users.noreply.github.com> Date: Tue, 28 Jan 2020 18:30:48 +0200 Subject: [PATCH 06/35] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4c7c31e..1cc2521 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -# version +# version 1 From e4da4075d3b81342d5e8f85fd5a4571a0c3ee744 Mon Sep 17 00:00:00 2001 From: vadim-kharin-codefresh <58422638+vadim-kharin-codefresh@users.noreply.github.com> Date: Wed, 29 Jan 2020 10:54:05 +0200 Subject: [PATCH 07/35] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1cc2521..b93db03 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -# version 1 +# version 1.1 From 969749acaa65276ec6b99a49b610352b4d927b89 Mon Sep 17 00:00:00 2001 From: vadim-kharin-codefresh <58422638+vadim-kharin-codefresh@users.noreply.github.com> Date: Wed, 29 Jan 2020 10:57:52 +0200 Subject: [PATCH 08/35] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b93db03..d559f7a 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -# version 1.1 +# version 1.2 From 6441e731edcc015f566edfe83feca24187a21f8c Mon Sep 17 00:00:00 2001 From: vadim-kharin-codefresh <58422638+vadim-kharin-codefresh@users.noreply.github.com> Date: Wed, 29 Jan 2020 11:00:28 +0200 Subject: [PATCH 09/35] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d559f7a..adc971a 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -# version 1.2 +# version 1.3 From 8038f4101e8a1f2e88459190b664a8773af504ec Mon Sep 17 00:00:00 2001 From: vadim-kharin-codefresh <58422638+vadim-kharin-codefresh@users.noreply.github.com> Date: Wed, 29 Jan 2020 11:14:58 +0200 Subject: [PATCH 10/35] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index adc971a..ec8766d 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -# version 1.3 +# version 1.4 From defb606270457557b240a30435395e25e1f5c78c Mon Sep 17 00:00:00 2001 From: vadim-kharin-codefresh <58422638+vadim-kharin-codefresh@users.noreply.github.com> Date: Wed, 29 Jan 2020 11:16:22 +0200 Subject: [PATCH 11/35] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ec8766d..1294fae 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -# version 1.4 +# version 1.5 From 06c663c40978e4204b36e71b839ea62c31915d02 Mon Sep 17 00:00:00 2001 From: vadim-kharin-codefresh <58422638+vadim-kharin-codefresh@users.noreply.github.com> Date: Wed, 29 Jan 2020 11:42:15 +0200 Subject: [PATCH 12/35] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1294fae..446169f 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -# version 1.5 +# version 1.6 From 28b3ef3939431504c37af96455e68140c46f89d1 Mon Sep 17 00:00:00 2001 From: vadim-kharin-codefresh <58422638+vadim-kharin-codefresh@users.noreply.github.com> Date: Wed, 29 Jan 2020 11:55:25 +0200 Subject: [PATCH 13/35] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 446169f..9a73bec 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -# version 1.6 +# version 1.7 From a56e20880ce340ff0a2eedce3ee2dc56b8e877b6 Mon Sep 17 00:00:00 2001 From: vadim-kharin-codefresh <58422638+vadim-kharin-codefresh@users.noreply.github.com> Date: Fri, 31 Jan 2020 15:00:42 +0200 Subject: [PATCH 14/35] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9a73bec..a122d3c 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -# version 1.7 +# version 1.8 From 8442a6c6f3e44e0ebfb6f81fad2ba54ad1b56712 Mon Sep 17 00:00:00 2001 From: vadim-kharin-codefresh <58422638+vadim-kharin-codefresh@users.noreply.github.com> Date: Mon, 3 Feb 2020 14:33:32 +0200 Subject: [PATCH 15/35] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a122d3c..a64e713 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -# version 1.8 +# version 1.9 From 215c9bda370f1020dfd0b4830a3e8e52a25d958b Mon Sep 17 00:00:00 2001 From: vadim-kharin-codefresh <58422638+vadim-kharin-codefresh@users.noreply.github.com> Date: Mon, 3 Feb 2020 14:35:41 +0200 Subject: [PATCH 16/35] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a64e713..499cc57 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -# version 1.9 +# version 1.10 From ae4a61c8ae2cac830d6d640aedf933d8ed9eba0c Mon Sep 17 00:00:00 2001 From: vadim-kharin-codefresh <58422638+vadim-kharin-codefresh@users.noreply.github.com> Date: Mon, 24 Feb 2020 16:33:28 +0200 Subject: [PATCH 17/35] Create pipeline.yml --- pipeline.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 pipeline.yml 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" From ddf0915c733f3b47400337e7598383ff372df6da Mon Sep 17 00:00:00 2001 From: Vadim Kharin Date: Fri, 28 Feb 2020 17:21:29 +0200 Subject: [PATCH 18/35] add mychart --- mychart/.helmignore | 23 +++++++ mychart/Chart.yaml | 21 ++++++ mychart/templates/NOTES.txt | 21 ++++++ mychart/templates/_helpers.tpl | 63 ++++++++++++++++++ mychart/templates/deployment.yaml | 55 ++++++++++++++++ mychart/templates/ingress.yaml | 41 ++++++++++++ mychart/templates/service.yaml | 15 +++++ mychart/templates/serviceaccount.yaml | 12 ++++ mychart/templates/tests/test-connection.yaml | 15 +++++ mychart/values.yaml | 68 ++++++++++++++++++++ 10 files changed, 334 insertions(+) create mode 100644 mychart/.helmignore create mode 100644 mychart/Chart.yaml create mode 100644 mychart/templates/NOTES.txt create mode 100644 mychart/templates/_helpers.tpl create mode 100644 mychart/templates/deployment.yaml create mode 100644 mychart/templates/ingress.yaml create mode 100644 mychart/templates/service.yaml create mode 100644 mychart/templates/serviceaccount.yaml create mode 100644 mychart/templates/tests/test-connection.yaml create mode 100644 mychart/values.yaml 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: {} From 2c6183e2d4a2614f5bd16c0fccd8401e81f23402 Mon Sep 17 00:00:00 2001 From: Vadim Kharin Date: Fri, 11 Sep 2020 12:50:43 +0300 Subject: [PATCH 19/35] add allure report --- ...-574a-41d3-8671-247236919c53-testsuite.xml | 15 + ...-322a-4996-918d-35150d501f11-testsuite.xml | 23 + ...-758d-44ad-8bed-c83ad8dccb6e-testsuite.xml | 15 + ...-74fb-49a5-b0e2-44d91784317b-testsuite.xml | 23 + package-lock.json | 926 +++++++++++++++++- package.json | 4 +- 6 files changed, 995 insertions(+), 11 deletions(-) create mode 100644 allure-results/1b436d0d-574a-41d3-8671-247236919c53-testsuite.xml create mode 100644 allure-results/22cce3cf-322a-4996-918d-35150d501f11-testsuite.xml create mode 100644 allure-results/3f548ac4-758d-44ad-8bed-c83ad8dccb6e-testsuite.xml create mode 100644 allure-results/d36e9d1f-74fb-49a5-b0e2-44d91784317b-testsuite.xml 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/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/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/package-lock.json b/package-lock.json index 4e3ce97..2fe278e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,96 @@ "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", @@ -34,18 +124,78 @@ "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", @@ -62,12 +212,26 @@ "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", @@ -93,12 +257,29 @@ "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", @@ -125,23 +306,90 @@ "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=", - "dev": true + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "deep-eql": { "version": "3.0.1", @@ -161,18 +409,43 @@ "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", @@ -203,6 +476,11 @@ "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", @@ -215,6 +493,80 @@ "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", @@ -233,6 +585,16 @@ "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", @@ -259,8 +621,7 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "get-caller-file": { "version": "2.0.5", @@ -294,6 +655,11 @@ "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", @@ -304,7 +670,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -327,6 +692,32 @@ "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", @@ -343,6 +734,11 @@ "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", @@ -361,17 +757,37 @@ "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==", - "dev": true, "requires": { "has": "^1.0.3" } @@ -391,6 +807,11 @@ "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", @@ -407,6 +828,15 @@ "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", @@ -422,6 +852,35 @@ "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", @@ -435,8 +894,7 @@ "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, "lodash.isempty": { "version": "4.4.0", @@ -471,6 +929,11 @@ "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", @@ -480,6 +943,39 @@ "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", @@ -561,6 +1057,15 @@ } } }, + "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", @@ -600,12 +1105,29 @@ "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", @@ -619,8 +1141,7 @@ "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-inspect": { "version": "1.7.0", @@ -656,6 +1177,19 @@ "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", @@ -695,6 +1229,11 @@ "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", @@ -707,12 +1246,30 @@ "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", @@ -724,6 +1281,150 @@ "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", @@ -753,6 +1454,16 @@ "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", @@ -765,6 +1476,32 @@ "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", @@ -781,18 +1518,74 @@ "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", @@ -863,18 +1656,96 @@ "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", @@ -887,6 +1758,16 @@ "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", @@ -938,6 +1819,25 @@ } } }, + "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", @@ -955,6 +1855,12 @@ "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", diff --git a/package.json b/package.json index 046642b..d0c6af2 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,8 @@ "private": true, "scripts": { "start": "node ./bin/www", - "test": "mocha --reporter mochawesome" + "test": "mocha --reporter mochawesome", + "allure-test": "mocha --reporter mocha-allure-reporter" }, "dependencies": { "cookie-parser": "~1.4.4", @@ -17,6 +18,7 @@ "devDependencies": { "chai": "^4.2.0", "mocha": "^6.2.2", + "mocha-allure-reporter": "^1.4.0", "mochawesome": "^4.1.0" } } From 435bdc6ea8cc7d333daaee7443f700bec40b691d Mon Sep 17 00:00:00 2001 From: Vadim Kharin Date: Thu, 2 Sep 2021 12:04:44 +0300 Subject: [PATCH 20/35] add chart --- nginx-ingress/.helmignore | 21 + nginx-ingress/Chart.yaml | 15 + nginx-ingress/README.md | 464 ++++++++++++++ .../ci/daemonset-customconfig-values.yaml | 4 + .../ci/daemonset-customnodeport-values.yaml | 15 + .../ci/daemonset-headers-values.yaml | 6 + .../ci/daemonset-internal-lb-values.yaml | 7 + .../ci/daemonset-nodeport-values.yaml | 4 + ...set-tcp-udp-configMapNamespace-values.yaml | 14 + .../ci/daemonset-tcp-udp-values.yaml | 10 + nginx-ingress/ci/daemonset-tcp-values.yaml | 6 + .../ci/deamonset-default-values.yaml | 2 + .../ci/deamonset-metrics-values.yaml | 4 + nginx-ingress/ci/deamonset-psp-values.yaml | 5 + .../ci/deamonset-webhook-and-psp-values.yaml | 7 + .../ci/deamonset-webhook-values.yaml | 4 + .../ci/deployment-autoscaling-values.yaml | 3 + .../ci/deployment-customconfig-values.yaml | 3 + .../ci/deployment-customnodeport-values.yaml | 14 + .../ci/deployment-default-values.yaml | 1 + .../ci/deployment-headers-values.yaml | 5 + .../ci/deployment-internal-lb-values.yaml | 6 + .../ci/deployment-metrics-values.yaml | 3 + .../ci/deployment-nodeport-values.yaml | 3 + nginx-ingress/ci/deployment-psp-values.yaml | 2 + ...ent-tcp-udp-configMapNamespace-values.yaml | 13 + .../ci/deployment-tcp-udp-values.yaml | 9 + nginx-ingress/ci/deployment-tcp-values.yaml | 3 + .../ci/deployment-webhook-and-psp-values.yaml | 6 + .../ci/deployment-webhook-values.yaml | 3 + nginx-ingress/templates/NOTES.txt | 76 +++ nginx-ingress/templates/_helpers.tpl | 125 ++++ .../templates/addheaders-configmap.yaml | 14 + .../job-patch/clusterrole.yaml | 30 + .../job-patch/clusterrolebinding.yaml | 23 + .../job-patch/job-createSecret.yaml | 61 ++ .../job-patch/job-patchWebhook.yaml | 63 ++ .../admission-webhooks/job-patch/psp.yaml | 39 ++ .../admission-webhooks/job-patch/role.yaml | 23 + .../job-patch/rolebinding.yaml | 23 + .../job-patch/serviceaccount.yaml | 15 + .../validating-webhook.yaml | 31 + nginx-ingress/templates/clusterrole.yaml | 71 ++ .../templates/clusterrolebinding.yaml | 19 + .../templates/controller-configmap.yaml | 22 + .../templates/controller-daemonset.yaml | 259 ++++++++ .../templates/controller-deployment.yaml | 261 ++++++++ nginx-ingress/templates/controller-hpa.yaml | 34 + .../templates/controller-metrics-service.yaml | 47 ++ .../controller-poddisruptionbudget.yaml | 19 + .../templates/controller-prometheusrules.yaml | 24 + nginx-ingress/templates/controller-psp.yaml | 80 +++ nginx-ingress/templates/controller-role.yaml | 91 +++ .../templates/controller-rolebinding.yaml | 19 + .../controller-service-internal.yaml | 45 ++ .../templates/controller-service.yaml | 94 +++ .../templates/controller-serviceaccount.yaml | 15 + .../templates/controller-servicemonitor.yaml | 38 ++ .../templates/controller-webhook-service.yaml | 44 ++ .../templates/default-backend-deployment.yaml | 114 ++++ .../templates/default-backend-hpa.yaml | 32 + .../default-backend-poddisruptionbudget.yaml | 19 + .../templates/default-backend-psp.yaml | 35 + .../templates/default-backend-role.yaml | 16 + .../default-backend-rolebinding.yaml | 19 + .../templates/default-backend-service.yaml | 45 ++ .../default-backend-serviceaccount.yaml | 11 + .../templates/proxyheaders-configmap.yaml | 18 + nginx-ingress/templates/tcp-configmap.yaml | 14 + nginx-ingress/templates/udp-configmap.yaml | 14 + nginx-ingress/values.yaml | 606 ++++++++++++++++++ 71 files changed, 3310 insertions(+) create mode 100644 nginx-ingress/.helmignore create mode 100644 nginx-ingress/Chart.yaml create mode 100644 nginx-ingress/README.md create mode 100644 nginx-ingress/ci/daemonset-customconfig-values.yaml create mode 100644 nginx-ingress/ci/daemonset-customnodeport-values.yaml create mode 100644 nginx-ingress/ci/daemonset-headers-values.yaml create mode 100644 nginx-ingress/ci/daemonset-internal-lb-values.yaml create mode 100644 nginx-ingress/ci/daemonset-nodeport-values.yaml create mode 100644 nginx-ingress/ci/daemonset-tcp-udp-configMapNamespace-values.yaml create mode 100644 nginx-ingress/ci/daemonset-tcp-udp-values.yaml create mode 100644 nginx-ingress/ci/daemonset-tcp-values.yaml create mode 100644 nginx-ingress/ci/deamonset-default-values.yaml create mode 100644 nginx-ingress/ci/deamonset-metrics-values.yaml create mode 100644 nginx-ingress/ci/deamonset-psp-values.yaml create mode 100644 nginx-ingress/ci/deamonset-webhook-and-psp-values.yaml create mode 100644 nginx-ingress/ci/deamonset-webhook-values.yaml create mode 100644 nginx-ingress/ci/deployment-autoscaling-values.yaml create mode 100644 nginx-ingress/ci/deployment-customconfig-values.yaml create mode 100644 nginx-ingress/ci/deployment-customnodeport-values.yaml create mode 100644 nginx-ingress/ci/deployment-default-values.yaml create mode 100644 nginx-ingress/ci/deployment-headers-values.yaml create mode 100644 nginx-ingress/ci/deployment-internal-lb-values.yaml create mode 100644 nginx-ingress/ci/deployment-metrics-values.yaml create mode 100644 nginx-ingress/ci/deployment-nodeport-values.yaml create mode 100644 nginx-ingress/ci/deployment-psp-values.yaml create mode 100644 nginx-ingress/ci/deployment-tcp-udp-configMapNamespace-values.yaml create mode 100644 nginx-ingress/ci/deployment-tcp-udp-values.yaml create mode 100644 nginx-ingress/ci/deployment-tcp-values.yaml create mode 100644 nginx-ingress/ci/deployment-webhook-and-psp-values.yaml create mode 100644 nginx-ingress/ci/deployment-webhook-values.yaml create mode 100644 nginx-ingress/templates/NOTES.txt create mode 100644 nginx-ingress/templates/_helpers.tpl create mode 100644 nginx-ingress/templates/addheaders-configmap.yaml create mode 100644 nginx-ingress/templates/admission-webhooks/job-patch/clusterrole.yaml create mode 100644 nginx-ingress/templates/admission-webhooks/job-patch/clusterrolebinding.yaml create mode 100644 nginx-ingress/templates/admission-webhooks/job-patch/job-createSecret.yaml create mode 100644 nginx-ingress/templates/admission-webhooks/job-patch/job-patchWebhook.yaml create mode 100644 nginx-ingress/templates/admission-webhooks/job-patch/psp.yaml create mode 100644 nginx-ingress/templates/admission-webhooks/job-patch/role.yaml create mode 100644 nginx-ingress/templates/admission-webhooks/job-patch/rolebinding.yaml create mode 100644 nginx-ingress/templates/admission-webhooks/job-patch/serviceaccount.yaml create mode 100644 nginx-ingress/templates/admission-webhooks/validating-webhook.yaml create mode 100644 nginx-ingress/templates/clusterrole.yaml create mode 100644 nginx-ingress/templates/clusterrolebinding.yaml create mode 100644 nginx-ingress/templates/controller-configmap.yaml create mode 100644 nginx-ingress/templates/controller-daemonset.yaml create mode 100644 nginx-ingress/templates/controller-deployment.yaml create mode 100644 nginx-ingress/templates/controller-hpa.yaml create mode 100644 nginx-ingress/templates/controller-metrics-service.yaml create mode 100644 nginx-ingress/templates/controller-poddisruptionbudget.yaml create mode 100644 nginx-ingress/templates/controller-prometheusrules.yaml create mode 100644 nginx-ingress/templates/controller-psp.yaml create mode 100644 nginx-ingress/templates/controller-role.yaml create mode 100644 nginx-ingress/templates/controller-rolebinding.yaml create mode 100644 nginx-ingress/templates/controller-service-internal.yaml create mode 100644 nginx-ingress/templates/controller-service.yaml create mode 100644 nginx-ingress/templates/controller-serviceaccount.yaml create mode 100644 nginx-ingress/templates/controller-servicemonitor.yaml create mode 100644 nginx-ingress/templates/controller-webhook-service.yaml create mode 100644 nginx-ingress/templates/default-backend-deployment.yaml create mode 100644 nginx-ingress/templates/default-backend-hpa.yaml create mode 100644 nginx-ingress/templates/default-backend-poddisruptionbudget.yaml create mode 100644 nginx-ingress/templates/default-backend-psp.yaml create mode 100644 nginx-ingress/templates/default-backend-role.yaml create mode 100644 nginx-ingress/templates/default-backend-rolebinding.yaml create mode 100644 nginx-ingress/templates/default-backend-service.yaml create mode 100644 nginx-ingress/templates/default-backend-serviceaccount.yaml create mode 100644 nginx-ingress/templates/proxyheaders-configmap.yaml create mode 100644 nginx-ingress/templates/tcp-configmap.yaml create mode 100644 nginx-ingress/templates/udp-configmap.yaml create mode 100644 nginx-ingress/values.yaml 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" From 21161c8f39435f29b79d47a8c9c3962008bae419 Mon Sep 17 00:00:00 2001 From: Vadim Kharin Date: Mon, 21 Mar 2022 18:00:49 +0200 Subject: [PATCH 21/35] Add deployment.yml --- deployment.yml | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 deployment.yml diff --git a/deployment.yml b/deployment.yml new file mode 100644 index 0000000..5f4a699 --- /dev/null +++ b/deployment.yml @@ -0,0 +1,32 @@ +kind: Deployment +apiVersion: extensions/v1beta1 +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: 3 + + # 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 From 1863b5b29d57d3797601170ece4af4f39b8cb705 Mon Sep 17 00:00:00 2001 From: Vadim Kharin Date: Mon, 21 Mar 2022 18:14:30 +0200 Subject: [PATCH 22/35] Add deployment2.yml --- deployment2.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 deployment2.yml diff --git a/deployment2.yml b/deployment2.yml new file mode 100644 index 0000000..e3db6b7 --- /dev/null +++ b/deployment2.yml @@ -0,0 +1,19 @@ +apiVersion: extensions/v1beta1 +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 From bc1dd10cf6a26a5561a590ca5ca81ec8a67c8cee Mon Sep 17 00:00:00 2001 From: Vadim Kharin Date: Mon, 21 Mar 2022 18:20:34 +0200 Subject: [PATCH 23/35] Add deployment2.yml --- deployment2.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment2.yml b/deployment2.yml index e3db6b7..0b2224e 100644 --- a/deployment2.yml +++ b/deployment2.yml @@ -1,4 +1,4 @@ -apiVersion: extensions/v1beta1 +apiVersion: apps/v1 kind: Deployment metadata: name: my-demo-app From 2863e96f87f6049e9a70a2fe7e2b89c2c2be0bef Mon Sep 17 00:00:00 2001 From: Vadim Kharin Date: Mon, 21 Mar 2022 18:26:52 +0200 Subject: [PATCH 24/35] Add deployment.yml --- deployment.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deployment.yml b/deployment.yml index 5f4a699..0269849 100644 --- a/deployment.yml +++ b/deployment.yml @@ -1,5 +1,5 @@ kind: Deployment -apiVersion: extensions/v1beta1 +apiVersion: v1 metadata: name: nginx-deployment spec: @@ -7,7 +7,7 @@ spec: # has a few useful options # 1. How many copies of each pod do we want? - replicas: 3 + replicas: 1 # 2. How do want to update the pods? strategy: Recreate From f3c140474f105f62c7d308227835fa2b1e6d00b4 Mon Sep 17 00:00:00 2001 From: Vadim Kharin Date: Mon, 21 Mar 2022 18:30:34 +0200 Subject: [PATCH 25/35] Add deployment.yml --- deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment.yml b/deployment.yml index 0269849..8a7fa78 100644 --- a/deployment.yml +++ b/deployment.yml @@ -1,5 +1,5 @@ kind: Deployment -apiVersion: v1 +apiVersion: apps/v1 metadata: name: nginx-deployment spec: From 60974d8ec62d01fcb52c49d2308eec033f82aa8d Mon Sep 17 00:00:00 2001 From: Vadim Kharin Date: Mon, 21 Mar 2022 18:34:27 +0200 Subject: [PATCH 26/35] Add deployment3.yml --- deployment3.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 deployment3.yml 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 From 0ea3a19ad3365fbb2239180a7cd3f8426c55a6f5 Mon Sep 17 00:00:00 2001 From: Vadim Kharin Date: Mon, 4 Sep 2023 15:20:37 +0300 Subject: [PATCH 27/35] allure test --- .../d36e9d1f-74fb-49a5-b0e2-44d91784317b-testsuite.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/allure-results/d36e9d1f-74fb-49a5-b0e2-44d91784317b-testsuite.xml b/allure-results/d36e9d1f-74fb-49a5-b0e2-44d91784317b-testsuite.xml index ff513e3..adf5722 100644 --- a/allure-results/d36e9d1f-74fb-49a5-b0e2-44d91784317b-testsuite.xml +++ b/allure-results/d36e9d1f-74fb-49a5-b0e2-44d91784317b-testsuite.xml @@ -17,6 +17,7 @@ + From 0a8ff31fcb8fcf42655ff8da6a81213ae59a7905 Mon Sep 17 00:00:00 2001 From: Vadim Kharin Date: Mon, 4 Sep 2023 17:33:04 +0300 Subject: [PATCH 28/35] allure test --- ...-ea8d-4ded-a0b5-43b981581590-testsuite.xml | 15 +++++++++++ ...adb7-4932-93cb-9c2bc2e34bd0-attachment.txt | 1 + ...-bf00-432b-bb51-3eaf00926753-testsuite.xml | 25 +++++++++++++++++++ ...-74fb-49a5-b0e2-44d91784317b-testsuite.xml | 1 - test/sum.js | 1 + 5 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 allure-results/60731f8a-ea8d-4ded-a0b5-43b981581590-testsuite.xml create mode 100644 allure-results/76a8b218-adb7-4932-93cb-9c2bc2e34bd0-attachment.txt create mode 100644 allure-results/990ed676-bf00-432b-bb51-3eaf00926753-testsuite.xml 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/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/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 index adf5722..ff513e3 100644 --- a/allure-results/d36e9d1f-74fb-49a5-b0e2-44d91784317b-testsuite.xml +++ b/allure-results/d36e9d1f-74fb-49a5-b0e2-44d91784317b-testsuite.xml @@ -17,7 +17,6 @@ - diff --git a/test/sum.js b/test/sum.js index ab62bc8..8984624 100644 --- a/test/sum.js +++ b/test/sum.js @@ -10,6 +10,7 @@ describe('#test()', function() { context('with number arguments', function() { it('should return sum of arguments', function() { + allure.createAttachment('test.html', ' ') expect(15).to.equal(15) }) From 62f822c1cb26eaf2e8d85df3d5c4738fa225e31a Mon Sep 17 00:00:00 2001 From: Vadim Kharin Date: Mon, 4 Sep 2023 18:02:35 +0300 Subject: [PATCH 29/35] allure test --- ...-7b3f-40da-95cb-a4a6d813b0d9-testsuite.xml | 15 +++++++++++ ...-cc06-4b69-b958-7587c10ea52d-testsuite.xml | 25 +++++++++++++++++++ ...d92-4d1a-8fcb-a2738edcdcaf-attachment.html | 1 + test/sum.js | 2 +- 4 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 allure-results/2b665c35-7b3f-40da-95cb-a4a6d813b0d9-testsuite.xml create mode 100644 allure-results/5234a2a4-cc06-4b69-b958-7587c10ea52d-testsuite.xml create mode 100644 allure-results/9413333d-ed92-4d1a-8fcb-a2738edcdcaf-attachment.html 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/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/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/test/sum.js b/test/sum.js index 8984624..2adef1f 100644 --- a/test/sum.js +++ b/test/sum.js @@ -10,7 +10,7 @@ describe('#test()', function() { context('with number arguments', function() { it('should return sum of arguments', function() { - allure.createAttachment('test.html', ' ') + allure.createAttachment('test.html', '', 'text/html') expect(15).to.equal(15) }) From f927e504b871dde3ad779f0fa31a73167eccaa07 Mon Sep 17 00:00:00 2001 From: Vadim Kharin Date: Mon, 4 Sep 2023 18:07:37 +0300 Subject: [PATCH 30/35] allure test steps --- ...-b0e1-405b-84d2-2798d80a98d2-testsuite.xml | 25 +++++++++++++++++++ ...563-44b8-a9be-fe4ab27cff69-attachment.html | 1 + ...-31b8-4673-9ed6-a9fec2affe81-testsuite.xml | 15 +++++++++++ test/sum.js | 2 +- 4 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 allure-results/3fee2627-b0e1-405b-84d2-2798d80a98d2-testsuite.xml create mode 100644 allure-results/70e6b7e9-f563-44b8-a9be-fe4ab27cff69-attachment.html create mode 100644 allure-results/f0bb6347-31b8-4673-9ed6-a9fec2affe81-testsuite.xml 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/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/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/test/sum.js b/test/sum.js index 2adef1f..84ae937 100644 --- a/test/sum.js +++ b/test/sum.js @@ -10,7 +10,7 @@ describe('#test()', function() { context('with number arguments', function() { it('should return sum of arguments', function() { - allure.createAttachment('test.html', '', 'text/html') + allure.createAttachment('test.html', '', 'text/html') expect(15).to.equal(15) }) From 7a191cf6748f2328a90b76260a01ab5e4e75e0a7 Mon Sep 17 00:00:00 2001 From: Vadim Kharin Date: Mon, 25 Sep 2023 16:36:54 +0300 Subject: [PATCH 31/35] add test data --- .../0/html/index.html | 11 ++ .../1/0/html/index.html | 11 ++ .../1/html/index.html | 11 ++ .../10/html/index.html | 11 ++ .../100/html/index.html | 11 ++ .../101/html/index.html | 11 ++ .../102/html/index.html | 11 ++ .../103/html/index.html | 11 ++ .../104/html/index.html | 11 ++ .../105/html/index.html | 11 ++ .../106/html/index.html | 11 ++ .../107/html/index.html | 11 ++ .../108/html/index.html | 11 ++ .../109/html/index.html | 11 ++ .../11/html/index.html | 11 ++ .../110/html/index.html | 11 ++ .../111/html/index.html | 11 ++ .../112/html/index.html | 11 ++ .../113/html/index.html | 11 ++ .../114/html/index.html | 11 ++ .../115/html/index.html | 11 ++ .../116/html/index.html | 11 ++ .../117/html/index.html | 11 ++ .../118/html/index.html | 11 ++ .../119/html/index.html | 11 ++ .../12/html/index.html | 11 ++ .../120/html/index.html | 11 ++ .../121/html/index.html | 11 ++ .../122/html/index.html | 11 ++ .../123/html/index.html | 11 ++ .../124/html/index.html | 11 ++ .../125/html/index.html | 11 ++ .../126/html/index.html | 11 ++ .../127/html/index.html | 11 ++ .../128/html/index.html | 11 ++ .../129/html/index.html | 11 ++ .../13/html/index.html | 11 ++ .../130/html/index.html | 11 ++ .../131/html/index.html | 11 ++ .../132/html/index.html | 11 ++ .../133/html/index.html | 11 ++ .../134/html/index.html | 11 ++ .../135/html/index.html | 11 ++ .../136/html/index.html | 11 ++ .../137/html/index.html | 11 ++ .../138/html/index.html | 11 ++ .../139/html/index.html | 11 ++ .../14/html/index.html | 11 ++ .../140/html/index.html | 11 ++ .../141/html/index.html | 11 ++ .../142/html/index.html | 11 ++ .../143/html/index.html | 11 ++ .../144/html/index.html | 11 ++ .../145/html/index.html | 11 ++ .../146/html/index.html | 11 ++ .../147/html/index.html | 11 ++ .../148/html/index.html | 11 ++ .../149/html/index.html | 11 ++ .../15/html/index.html | 11 ++ .../150/html/index.html | 11 ++ .../16/html/index.html | 11 ++ .../17/html/index.html | 11 ++ .../18/html/index.html | 11 ++ .../19/html/index.html | 11 ++ .../2/html/index.html | 11 ++ .../20/html/index.html | 11 ++ .../21/html/index.html | 11 ++ .../22/html/index.html | 11 ++ .../23/html/index.html | 11 ++ .../24/html/index.html | 11 ++ .../25/html/index.html | 11 ++ .../26/html/index.html | 11 ++ .../27/html/index.html | 11 ++ .../28/html/index.html | 11 ++ .../29/html/index.html | 11 ++ .../3/html/index.html | 11 ++ .../30/html/index.html | 11 ++ .../31/html/index.html | 11 ++ .../32/html/index.html | 11 ++ .../33/html/index.html | 11 ++ .../34/html/index.html | 11 ++ .../35/html/index.html | 11 ++ .../36/html/index.html | 11 ++ .../37/html/index.html | 11 ++ .../38/html/index.html | 11 ++ .../39/html/index.html | 11 ++ .../4/html/index.html | 11 ++ .../40/html/index.html | 11 ++ .../41/html/index.html | 11 ++ .../42/html/index.html | 11 ++ .../43/html/index.html | 11 ++ .../44/html/index.html | 11 ++ .../45/html/index.html | 11 ++ .../46/html/index.html | 11 ++ .../47/html/index.html | 11 ++ .../48/html/index.html | 11 ++ .../49/html/index.html | 11 ++ .../5/html/index.html | 11 ++ .../50/html/index.html | 11 ++ .../51/html/index.html | 11 ++ .../52/html/index.html | 11 ++ .../53/html/index.html | 11 ++ .../54/html/index.html | 11 ++ .../55/html/index.html | 11 ++ .../56/html/index.html | 11 ++ .../57/html/index.html | 11 ++ .../58/html/index.html | 11 ++ .../59/html/index.html | 11 ++ .../6/html/index.html | 11 ++ .../60/html/index.html | 11 ++ .../61/html/index.html | 11 ++ .../62/html/index.html | 11 ++ .../63/html/index.html | 11 ++ .../64/html/index.html | 11 ++ .../65/html/index.html | 11 ++ .../66/html/index.html | 11 ++ .../67/html/index.html | 11 ++ .../68/html/index.html | 11 ++ .../69/html/index.html | 11 ++ .../7/html/index.html | 11 ++ .../70/html/index.html | 11 ++ .../71/html/index.html | 11 ++ .../72/html/index.html | 11 ++ .../73/html/index.html | 11 ++ .../74/html/index.html | 11 ++ .../75/html/index.html | 11 ++ .../76/html/index.html | 11 ++ .../77/html/index.html | 11 ++ .../78/html/index.html | 11 ++ .../79/html/index.html | 11 ++ .../8/html/index.html | 11 ++ .../80/html/index.html | 11 ++ .../81/html/index.html | 11 ++ .../82/html/index.html | 11 ++ .../83/html/index.html | 11 ++ .../84/html/index.html | 11 ++ .../85/html/index.html | 11 ++ .../86/html/index.html | 11 ++ .../87/html/index.html | 11 ++ .../88/html/index.html | 11 ++ .../89/html/index.html | 11 ++ .../9/html/index.html | 11 ++ .../90/html/index.html | 11 ++ .../91/html/index.html | 11 ++ .../92/html/index.html | 11 ++ .../93/html/index.html | 11 ++ .../94/html/index.html | 11 ++ .../95/html/index.html | 11 ++ .../96/html/index.html | 11 ++ .../97/html/index.html | 11 ++ .../98/html/index.html | 11 ++ .../99/html/index.html | 11 ++ coverage_data/unified_coverage_reports/gen.sh | 5 + .../unified_coverage_reports/index.html | 161 ++++++++++++++++++ 154 files changed, 1838 insertions(+) create mode 100644 coverage_data/unified_coverage_reports/0/html/index.html create mode 100644 coverage_data/unified_coverage_reports/1/0/html/index.html create mode 100644 coverage_data/unified_coverage_reports/1/html/index.html create mode 100644 coverage_data/unified_coverage_reports/10/html/index.html create mode 100644 coverage_data/unified_coverage_reports/100/html/index.html create mode 100644 coverage_data/unified_coverage_reports/101/html/index.html create mode 100644 coverage_data/unified_coverage_reports/102/html/index.html create mode 100644 coverage_data/unified_coverage_reports/103/html/index.html create mode 100644 coverage_data/unified_coverage_reports/104/html/index.html create mode 100644 coverage_data/unified_coverage_reports/105/html/index.html create mode 100644 coverage_data/unified_coverage_reports/106/html/index.html create mode 100644 coverage_data/unified_coverage_reports/107/html/index.html create mode 100644 coverage_data/unified_coverage_reports/108/html/index.html create mode 100644 coverage_data/unified_coverage_reports/109/html/index.html create mode 100644 coverage_data/unified_coverage_reports/11/html/index.html create mode 100644 coverage_data/unified_coverage_reports/110/html/index.html create mode 100644 coverage_data/unified_coverage_reports/111/html/index.html create mode 100644 coverage_data/unified_coverage_reports/112/html/index.html create mode 100644 coverage_data/unified_coverage_reports/113/html/index.html create mode 100644 coverage_data/unified_coverage_reports/114/html/index.html create mode 100644 coverage_data/unified_coverage_reports/115/html/index.html create mode 100644 coverage_data/unified_coverage_reports/116/html/index.html create mode 100644 coverage_data/unified_coverage_reports/117/html/index.html create mode 100644 coverage_data/unified_coverage_reports/118/html/index.html create mode 100644 coverage_data/unified_coverage_reports/119/html/index.html create mode 100644 coverage_data/unified_coverage_reports/12/html/index.html create mode 100644 coverage_data/unified_coverage_reports/120/html/index.html create mode 100644 coverage_data/unified_coverage_reports/121/html/index.html create mode 100644 coverage_data/unified_coverage_reports/122/html/index.html create mode 100644 coverage_data/unified_coverage_reports/123/html/index.html create mode 100644 coverage_data/unified_coverage_reports/124/html/index.html create mode 100644 coverage_data/unified_coverage_reports/125/html/index.html create mode 100644 coverage_data/unified_coverage_reports/126/html/index.html create mode 100644 coverage_data/unified_coverage_reports/127/html/index.html create mode 100644 coverage_data/unified_coverage_reports/128/html/index.html create mode 100644 coverage_data/unified_coverage_reports/129/html/index.html create mode 100644 coverage_data/unified_coverage_reports/13/html/index.html create mode 100644 coverage_data/unified_coverage_reports/130/html/index.html create mode 100644 coverage_data/unified_coverage_reports/131/html/index.html create mode 100644 coverage_data/unified_coverage_reports/132/html/index.html create mode 100644 coverage_data/unified_coverage_reports/133/html/index.html create mode 100644 coverage_data/unified_coverage_reports/134/html/index.html create mode 100644 coverage_data/unified_coverage_reports/135/html/index.html create mode 100644 coverage_data/unified_coverage_reports/136/html/index.html create mode 100644 coverage_data/unified_coverage_reports/137/html/index.html create mode 100644 coverage_data/unified_coverage_reports/138/html/index.html create mode 100644 coverage_data/unified_coverage_reports/139/html/index.html create mode 100644 coverage_data/unified_coverage_reports/14/html/index.html create mode 100644 coverage_data/unified_coverage_reports/140/html/index.html create mode 100644 coverage_data/unified_coverage_reports/141/html/index.html create mode 100644 coverage_data/unified_coverage_reports/142/html/index.html create mode 100644 coverage_data/unified_coverage_reports/143/html/index.html create mode 100644 coverage_data/unified_coverage_reports/144/html/index.html create mode 100644 coverage_data/unified_coverage_reports/145/html/index.html create mode 100644 coverage_data/unified_coverage_reports/146/html/index.html create mode 100644 coverage_data/unified_coverage_reports/147/html/index.html create mode 100644 coverage_data/unified_coverage_reports/148/html/index.html create mode 100644 coverage_data/unified_coverage_reports/149/html/index.html create mode 100644 coverage_data/unified_coverage_reports/15/html/index.html create mode 100644 coverage_data/unified_coverage_reports/150/html/index.html create mode 100644 coverage_data/unified_coverage_reports/16/html/index.html create mode 100644 coverage_data/unified_coverage_reports/17/html/index.html create mode 100644 coverage_data/unified_coverage_reports/18/html/index.html create mode 100644 coverage_data/unified_coverage_reports/19/html/index.html create mode 100644 coverage_data/unified_coverage_reports/2/html/index.html create mode 100644 coverage_data/unified_coverage_reports/20/html/index.html create mode 100644 coverage_data/unified_coverage_reports/21/html/index.html create mode 100644 coverage_data/unified_coverage_reports/22/html/index.html create mode 100644 coverage_data/unified_coverage_reports/23/html/index.html create mode 100644 coverage_data/unified_coverage_reports/24/html/index.html create mode 100644 coverage_data/unified_coverage_reports/25/html/index.html create mode 100644 coverage_data/unified_coverage_reports/26/html/index.html create mode 100644 coverage_data/unified_coverage_reports/27/html/index.html create mode 100644 coverage_data/unified_coverage_reports/28/html/index.html create mode 100644 coverage_data/unified_coverage_reports/29/html/index.html create mode 100644 coverage_data/unified_coverage_reports/3/html/index.html create mode 100644 coverage_data/unified_coverage_reports/30/html/index.html create mode 100644 coverage_data/unified_coverage_reports/31/html/index.html create mode 100644 coverage_data/unified_coverage_reports/32/html/index.html create mode 100644 coverage_data/unified_coverage_reports/33/html/index.html create mode 100644 coverage_data/unified_coverage_reports/34/html/index.html create mode 100644 coverage_data/unified_coverage_reports/35/html/index.html create mode 100644 coverage_data/unified_coverage_reports/36/html/index.html create mode 100644 coverage_data/unified_coverage_reports/37/html/index.html create mode 100644 coverage_data/unified_coverage_reports/38/html/index.html create mode 100644 coverage_data/unified_coverage_reports/39/html/index.html create mode 100644 coverage_data/unified_coverage_reports/4/html/index.html create mode 100644 coverage_data/unified_coverage_reports/40/html/index.html create mode 100644 coverage_data/unified_coverage_reports/41/html/index.html create mode 100644 coverage_data/unified_coverage_reports/42/html/index.html create mode 100644 coverage_data/unified_coverage_reports/43/html/index.html create mode 100644 coverage_data/unified_coverage_reports/44/html/index.html create mode 100644 coverage_data/unified_coverage_reports/45/html/index.html create mode 100644 coverage_data/unified_coverage_reports/46/html/index.html create mode 100644 coverage_data/unified_coverage_reports/47/html/index.html create mode 100644 coverage_data/unified_coverage_reports/48/html/index.html create mode 100644 coverage_data/unified_coverage_reports/49/html/index.html create mode 100644 coverage_data/unified_coverage_reports/5/html/index.html create mode 100644 coverage_data/unified_coverage_reports/50/html/index.html create mode 100644 coverage_data/unified_coverage_reports/51/html/index.html create mode 100644 coverage_data/unified_coverage_reports/52/html/index.html create mode 100644 coverage_data/unified_coverage_reports/53/html/index.html create mode 100644 coverage_data/unified_coverage_reports/54/html/index.html create mode 100644 coverage_data/unified_coverage_reports/55/html/index.html create mode 100644 coverage_data/unified_coverage_reports/56/html/index.html create mode 100644 coverage_data/unified_coverage_reports/57/html/index.html create mode 100644 coverage_data/unified_coverage_reports/58/html/index.html create mode 100644 coverage_data/unified_coverage_reports/59/html/index.html create mode 100644 coverage_data/unified_coverage_reports/6/html/index.html create mode 100644 coverage_data/unified_coverage_reports/60/html/index.html create mode 100644 coverage_data/unified_coverage_reports/61/html/index.html create mode 100644 coverage_data/unified_coverage_reports/62/html/index.html create mode 100644 coverage_data/unified_coverage_reports/63/html/index.html create mode 100644 coverage_data/unified_coverage_reports/64/html/index.html create mode 100644 coverage_data/unified_coverage_reports/65/html/index.html create mode 100644 coverage_data/unified_coverage_reports/66/html/index.html create mode 100644 coverage_data/unified_coverage_reports/67/html/index.html create mode 100644 coverage_data/unified_coverage_reports/68/html/index.html create mode 100644 coverage_data/unified_coverage_reports/69/html/index.html create mode 100644 coverage_data/unified_coverage_reports/7/html/index.html create mode 100644 coverage_data/unified_coverage_reports/70/html/index.html create mode 100644 coverage_data/unified_coverage_reports/71/html/index.html create mode 100644 coverage_data/unified_coverage_reports/72/html/index.html create mode 100644 coverage_data/unified_coverage_reports/73/html/index.html create mode 100644 coverage_data/unified_coverage_reports/74/html/index.html create mode 100644 coverage_data/unified_coverage_reports/75/html/index.html create mode 100644 coverage_data/unified_coverage_reports/76/html/index.html create mode 100644 coverage_data/unified_coverage_reports/77/html/index.html create mode 100644 coverage_data/unified_coverage_reports/78/html/index.html create mode 100644 coverage_data/unified_coverage_reports/79/html/index.html create mode 100644 coverage_data/unified_coverage_reports/8/html/index.html create mode 100644 coverage_data/unified_coverage_reports/80/html/index.html create mode 100644 coverage_data/unified_coverage_reports/81/html/index.html create mode 100644 coverage_data/unified_coverage_reports/82/html/index.html create mode 100644 coverage_data/unified_coverage_reports/83/html/index.html create mode 100644 coverage_data/unified_coverage_reports/84/html/index.html create mode 100644 coverage_data/unified_coverage_reports/85/html/index.html create mode 100644 coverage_data/unified_coverage_reports/86/html/index.html create mode 100644 coverage_data/unified_coverage_reports/87/html/index.html create mode 100644 coverage_data/unified_coverage_reports/88/html/index.html create mode 100644 coverage_data/unified_coverage_reports/89/html/index.html create mode 100644 coverage_data/unified_coverage_reports/9/html/index.html create mode 100644 coverage_data/unified_coverage_reports/90/html/index.html create mode 100644 coverage_data/unified_coverage_reports/91/html/index.html create mode 100644 coverage_data/unified_coverage_reports/92/html/index.html create mode 100644 coverage_data/unified_coverage_reports/93/html/index.html create mode 100644 coverage_data/unified_coverage_reports/94/html/index.html create mode 100644 coverage_data/unified_coverage_reports/95/html/index.html create mode 100644 coverage_data/unified_coverage_reports/96/html/index.html create mode 100644 coverage_data/unified_coverage_reports/97/html/index.html create mode 100644 coverage_data/unified_coverage_reports/98/html/index.html create mode 100644 coverage_data/unified_coverage_reports/99/html/index.html create mode 100755 coverage_data/unified_coverage_reports/gen.sh create mode 100644 coverage_data/unified_coverage_reports/index.html 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 + + + + From 18d32bf1aa106e3db52195bf8a6eaf9d61afbe0f Mon Sep 17 00:00:00 2001 From: Vadim Kharin Date: Thu, 28 Sep 2023 16:07:40 +0300 Subject: [PATCH 32/35] add coverage data --- .../unified_coverage_reports/0/html/index.html | 11 +++++++++++ .../unified_coverage_reports/1/0/html/index.html | 11 +++++++++++ .../unified_coverage_reports/1/html/index.html | 11 +++++++++++ .../unified_coverage_reports/2/html/index.html | 11 +++++++++++ .../unified_coverage_reports/3/html/index.html | 11 +++++++++++ .../unified_coverage_reports/4/html/index.html | 11 +++++++++++ .../unified_coverage_reports/5/html/index.html | 11 +++++++++++ .../unified_coverage_reports/6/html/index.html | 11 +++++++++++ .../unified_coverage_reports/7/html/index.html | 11 +++++++++++ .../unified_coverage_reports/8/html/index.html | 11 +++++++++++ .../unified_coverage_reports/9/html/index.html | 11 +++++++++++ .../unified_coverage_reports/0/html/index.html | 11 +++++++++++ .../unified_coverage_reports/1/0/html/index.html | 11 +++++++++++ .../unified_coverage_reports/1/html/index.html | 11 +++++++++++ .../unified_coverage_reports/10/html/index.html | 11 +++++++++++ .../unified_coverage_reports/11/html/index.html | 11 +++++++++++ .../unified_coverage_reports/12/html/index.html | 11 +++++++++++ .../unified_coverage_reports/13/html/index.html | 11 +++++++++++ .../unified_coverage_reports/14/html/index.html | 11 +++++++++++ .../unified_coverage_reports/15/html/index.html | 11 +++++++++++ .../unified_coverage_reports/16/html/index.html | 11 +++++++++++ .../unified_coverage_reports/17/html/index.html | 11 +++++++++++ .../unified_coverage_reports/18/html/index.html | 11 +++++++++++ .../unified_coverage_reports/19/html/index.html | 11 +++++++++++ .../unified_coverage_reports/2/html/index.html | 11 +++++++++++ .../unified_coverage_reports/20/html/index.html | 11 +++++++++++ .../unified_coverage_reports/21/html/index.html | 11 +++++++++++ .../unified_coverage_reports/22/html/index.html | 11 +++++++++++ .../unified_coverage_reports/23/html/index.html | 11 +++++++++++ .../unified_coverage_reports/3/html/index.html | 11 +++++++++++ .../unified_coverage_reports/4/html/index.html | 11 +++++++++++ .../unified_coverage_reports/5/html/index.html | 11 +++++++++++ .../unified_coverage_reports/6/html/index.html | 11 +++++++++++ .../unified_coverage_reports/7/html/index.html | 11 +++++++++++ .../unified_coverage_reports/8/html/index.html | 11 +++++++++++ .../unified_coverage_reports/9/html/index.html | 11 +++++++++++ coverage_data 2/unified_coverage_reports/gen.sh | 5 +++++ 37 files changed, 401 insertions(+) create mode 100644 coverage_data 1/unified_coverage_reports/0/html/index.html create mode 100644 coverage_data 1/unified_coverage_reports/1/0/html/index.html create mode 100644 coverage_data 1/unified_coverage_reports/1/html/index.html create mode 100644 coverage_data 1/unified_coverage_reports/2/html/index.html create mode 100644 coverage_data 1/unified_coverage_reports/3/html/index.html create mode 100644 coverage_data 1/unified_coverage_reports/4/html/index.html create mode 100644 coverage_data 1/unified_coverage_reports/5/html/index.html create mode 100644 coverage_data 1/unified_coverage_reports/6/html/index.html create mode 100644 coverage_data 1/unified_coverage_reports/7/html/index.html create mode 100644 coverage_data 1/unified_coverage_reports/8/html/index.html create mode 100644 coverage_data 1/unified_coverage_reports/9/html/index.html create mode 100644 coverage_data 2/unified_coverage_reports/0/html/index.html create mode 100644 coverage_data 2/unified_coverage_reports/1/0/html/index.html create mode 100644 coverage_data 2/unified_coverage_reports/1/html/index.html create mode 100644 coverage_data 2/unified_coverage_reports/10/html/index.html create mode 100644 coverage_data 2/unified_coverage_reports/11/html/index.html create mode 100644 coverage_data 2/unified_coverage_reports/12/html/index.html create mode 100644 coverage_data 2/unified_coverage_reports/13/html/index.html create mode 100644 coverage_data 2/unified_coverage_reports/14/html/index.html create mode 100644 coverage_data 2/unified_coverage_reports/15/html/index.html create mode 100644 coverage_data 2/unified_coverage_reports/16/html/index.html create mode 100644 coverage_data 2/unified_coverage_reports/17/html/index.html create mode 100644 coverage_data 2/unified_coverage_reports/18/html/index.html create mode 100644 coverage_data 2/unified_coverage_reports/19/html/index.html create mode 100644 coverage_data 2/unified_coverage_reports/2/html/index.html create mode 100644 coverage_data 2/unified_coverage_reports/20/html/index.html create mode 100644 coverage_data 2/unified_coverage_reports/21/html/index.html create mode 100644 coverage_data 2/unified_coverage_reports/22/html/index.html create mode 100644 coverage_data 2/unified_coverage_reports/23/html/index.html create mode 100644 coverage_data 2/unified_coverage_reports/3/html/index.html create mode 100644 coverage_data 2/unified_coverage_reports/4/html/index.html create mode 100644 coverage_data 2/unified_coverage_reports/5/html/index.html create mode 100644 coverage_data 2/unified_coverage_reports/6/html/index.html create mode 100644 coverage_data 2/unified_coverage_reports/7/html/index.html create mode 100644 coverage_data 2/unified_coverage_reports/8/html/index.html create mode 100644 coverage_data 2/unified_coverage_reports/9/html/index.html create mode 100755 coverage_data 2/unified_coverage_reports/gen.sh 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 From bedd5f296f0a9a86671f2db5930cc0447b37f0b3 Mon Sep 17 00:00:00 2001 From: Vadim Kharin Date: Thu, 28 Sep 2023 16:17:38 +0300 Subject: [PATCH 33/35] add coverage data --- .../unified_coverage_reports/0/html/index.html | 0 .../unified_coverage_reports/1/0/html/index.html | 0 .../unified_coverage_reports/1/html/index.html | 0 .../unified_coverage_reports/2/html/index.html | 0 .../unified_coverage_reports/3/html/index.html | 0 .../unified_coverage_reports/4/html/index.html | 0 .../unified_coverage_reports/5/html/index.html | 0 .../unified_coverage_reports/6/html/index.html | 0 .../unified_coverage_reports/7/html/index.html | 0 .../unified_coverage_reports/8/html/index.html | 0 .../unified_coverage_reports/9/html/index.html | 0 .../unified_coverage_reports/0/html/index.html | 0 .../unified_coverage_reports/1/0/html/index.html | 0 .../unified_coverage_reports/1/html/index.html | 0 .../unified_coverage_reports/10/html/index.html | 0 .../unified_coverage_reports/11/html/index.html | 0 .../unified_coverage_reports/12/html/index.html | 0 .../unified_coverage_reports/13/html/index.html | 0 .../unified_coverage_reports/14/html/index.html | 0 .../unified_coverage_reports/15/html/index.html | 0 .../unified_coverage_reports/16/html/index.html | 0 .../unified_coverage_reports/17/html/index.html | 0 .../unified_coverage_reports/18/html/index.html | 0 .../unified_coverage_reports/19/html/index.html | 0 .../unified_coverage_reports/2/html/index.html | 0 .../unified_coverage_reports/20/html/index.html | 0 .../unified_coverage_reports/21/html/index.html | 0 .../unified_coverage_reports/22/html/index.html | 0 .../unified_coverage_reports/23/html/index.html | 0 .../unified_coverage_reports/3/html/index.html | 0 .../unified_coverage_reports/4/html/index.html | 0 .../unified_coverage_reports/5/html/index.html | 0 .../unified_coverage_reports/6/html/index.html | 0 .../unified_coverage_reports/7/html/index.html | 0 .../unified_coverage_reports/8/html/index.html | 0 .../unified_coverage_reports/9/html/index.html | 0 .../unified_coverage_reports/gen.sh | 0 37 files changed, 0 insertions(+), 0 deletions(-) rename {coverage_data 1 => coverage_data_1}/unified_coverage_reports/0/html/index.html (100%) rename {coverage_data 1 => coverage_data_1}/unified_coverage_reports/1/0/html/index.html (100%) rename {coverage_data 1 => coverage_data_1}/unified_coverage_reports/1/html/index.html (100%) rename {coverage_data 1 => coverage_data_1}/unified_coverage_reports/2/html/index.html (100%) rename {coverage_data 1 => coverage_data_1}/unified_coverage_reports/3/html/index.html (100%) rename {coverage_data 1 => coverage_data_1}/unified_coverage_reports/4/html/index.html (100%) rename {coverage_data 1 => coverage_data_1}/unified_coverage_reports/5/html/index.html (100%) rename {coverage_data 1 => coverage_data_1}/unified_coverage_reports/6/html/index.html (100%) rename {coverage_data 1 => coverage_data_1}/unified_coverage_reports/7/html/index.html (100%) rename {coverage_data 1 => coverage_data_1}/unified_coverage_reports/8/html/index.html (100%) rename {coverage_data 1 => coverage_data_1}/unified_coverage_reports/9/html/index.html (100%) rename {coverage_data 2 => coverage_data_2}/unified_coverage_reports/0/html/index.html (100%) rename {coverage_data 2 => coverage_data_2}/unified_coverage_reports/1/0/html/index.html (100%) rename {coverage_data 2 => coverage_data_2}/unified_coverage_reports/1/html/index.html (100%) rename {coverage_data 2 => coverage_data_2}/unified_coverage_reports/10/html/index.html (100%) rename {coverage_data 2 => coverage_data_2}/unified_coverage_reports/11/html/index.html (100%) rename {coverage_data 2 => coverage_data_2}/unified_coverage_reports/12/html/index.html (100%) rename {coverage_data 2 => coverage_data_2}/unified_coverage_reports/13/html/index.html (100%) rename {coverage_data 2 => coverage_data_2}/unified_coverage_reports/14/html/index.html (100%) rename {coverage_data 2 => coverage_data_2}/unified_coverage_reports/15/html/index.html (100%) rename {coverage_data 2 => coverage_data_2}/unified_coverage_reports/16/html/index.html (100%) rename {coverage_data 2 => coverage_data_2}/unified_coverage_reports/17/html/index.html (100%) rename {coverage_data 2 => coverage_data_2}/unified_coverage_reports/18/html/index.html (100%) rename {coverage_data 2 => coverage_data_2}/unified_coverage_reports/19/html/index.html (100%) rename {coverage_data 2 => coverage_data_2}/unified_coverage_reports/2/html/index.html (100%) rename {coverage_data 2 => coverage_data_2}/unified_coverage_reports/20/html/index.html (100%) rename {coverage_data 2 => coverage_data_2}/unified_coverage_reports/21/html/index.html (100%) rename {coverage_data 2 => coverage_data_2}/unified_coverage_reports/22/html/index.html (100%) rename {coverage_data 2 => coverage_data_2}/unified_coverage_reports/23/html/index.html (100%) rename {coverage_data 2 => coverage_data_2}/unified_coverage_reports/3/html/index.html (100%) rename {coverage_data 2 => coverage_data_2}/unified_coverage_reports/4/html/index.html (100%) rename {coverage_data 2 => coverage_data_2}/unified_coverage_reports/5/html/index.html (100%) rename {coverage_data 2 => coverage_data_2}/unified_coverage_reports/6/html/index.html (100%) rename {coverage_data 2 => coverage_data_2}/unified_coverage_reports/7/html/index.html (100%) rename {coverage_data 2 => coverage_data_2}/unified_coverage_reports/8/html/index.html (100%) rename {coverage_data 2 => coverage_data_2}/unified_coverage_reports/9/html/index.html (100%) rename {coverage_data 2 => coverage_data_2}/unified_coverage_reports/gen.sh (100%) diff --git a/coverage_data 1/unified_coverage_reports/0/html/index.html b/coverage_data_1/unified_coverage_reports/0/html/index.html similarity index 100% rename from coverage_data 1/unified_coverage_reports/0/html/index.html rename to coverage_data_1/unified_coverage_reports/0/html/index.html 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 similarity index 100% rename from coverage_data 1/unified_coverage_reports/1/0/html/index.html rename to coverage_data_1/unified_coverage_reports/1/0/html/index.html diff --git a/coverage_data 1/unified_coverage_reports/1/html/index.html b/coverage_data_1/unified_coverage_reports/1/html/index.html similarity index 100% rename from coverage_data 1/unified_coverage_reports/1/html/index.html rename to coverage_data_1/unified_coverage_reports/1/html/index.html diff --git a/coverage_data 1/unified_coverage_reports/2/html/index.html b/coverage_data_1/unified_coverage_reports/2/html/index.html similarity index 100% rename from coverage_data 1/unified_coverage_reports/2/html/index.html rename to coverage_data_1/unified_coverage_reports/2/html/index.html diff --git a/coverage_data 1/unified_coverage_reports/3/html/index.html b/coverage_data_1/unified_coverage_reports/3/html/index.html similarity index 100% rename from coverage_data 1/unified_coverage_reports/3/html/index.html rename to coverage_data_1/unified_coverage_reports/3/html/index.html diff --git a/coverage_data 1/unified_coverage_reports/4/html/index.html b/coverage_data_1/unified_coverage_reports/4/html/index.html similarity index 100% rename from coverage_data 1/unified_coverage_reports/4/html/index.html rename to coverage_data_1/unified_coverage_reports/4/html/index.html diff --git a/coverage_data 1/unified_coverage_reports/5/html/index.html b/coverage_data_1/unified_coverage_reports/5/html/index.html similarity index 100% rename from coverage_data 1/unified_coverage_reports/5/html/index.html rename to coverage_data_1/unified_coverage_reports/5/html/index.html diff --git a/coverage_data 1/unified_coverage_reports/6/html/index.html b/coverage_data_1/unified_coverage_reports/6/html/index.html similarity index 100% rename from coverage_data 1/unified_coverage_reports/6/html/index.html rename to coverage_data_1/unified_coverage_reports/6/html/index.html diff --git a/coverage_data 1/unified_coverage_reports/7/html/index.html b/coverage_data_1/unified_coverage_reports/7/html/index.html similarity index 100% rename from coverage_data 1/unified_coverage_reports/7/html/index.html rename to coverage_data_1/unified_coverage_reports/7/html/index.html diff --git a/coverage_data 1/unified_coverage_reports/8/html/index.html b/coverage_data_1/unified_coverage_reports/8/html/index.html similarity index 100% rename from coverage_data 1/unified_coverage_reports/8/html/index.html rename to coverage_data_1/unified_coverage_reports/8/html/index.html diff --git a/coverage_data 1/unified_coverage_reports/9/html/index.html b/coverage_data_1/unified_coverage_reports/9/html/index.html similarity index 100% rename from coverage_data 1/unified_coverage_reports/9/html/index.html rename to coverage_data_1/unified_coverage_reports/9/html/index.html diff --git a/coverage_data 2/unified_coverage_reports/0/html/index.html b/coverage_data_2/unified_coverage_reports/0/html/index.html similarity index 100% rename from coverage_data 2/unified_coverage_reports/0/html/index.html rename to coverage_data_2/unified_coverage_reports/0/html/index.html 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 similarity index 100% rename from coverage_data 2/unified_coverage_reports/1/0/html/index.html rename to coverage_data_2/unified_coverage_reports/1/0/html/index.html diff --git a/coverage_data 2/unified_coverage_reports/1/html/index.html b/coverage_data_2/unified_coverage_reports/1/html/index.html similarity index 100% rename from coverage_data 2/unified_coverage_reports/1/html/index.html rename to coverage_data_2/unified_coverage_reports/1/html/index.html diff --git a/coverage_data 2/unified_coverage_reports/10/html/index.html b/coverage_data_2/unified_coverage_reports/10/html/index.html similarity index 100% rename from coverage_data 2/unified_coverage_reports/10/html/index.html rename to coverage_data_2/unified_coverage_reports/10/html/index.html diff --git a/coverage_data 2/unified_coverage_reports/11/html/index.html b/coverage_data_2/unified_coverage_reports/11/html/index.html similarity index 100% rename from coverage_data 2/unified_coverage_reports/11/html/index.html rename to coverage_data_2/unified_coverage_reports/11/html/index.html diff --git a/coverage_data 2/unified_coverage_reports/12/html/index.html b/coverage_data_2/unified_coverage_reports/12/html/index.html similarity index 100% rename from coverage_data 2/unified_coverage_reports/12/html/index.html rename to coverage_data_2/unified_coverage_reports/12/html/index.html diff --git a/coverage_data 2/unified_coverage_reports/13/html/index.html b/coverage_data_2/unified_coverage_reports/13/html/index.html similarity index 100% rename from coverage_data 2/unified_coverage_reports/13/html/index.html rename to coverage_data_2/unified_coverage_reports/13/html/index.html diff --git a/coverage_data 2/unified_coverage_reports/14/html/index.html b/coverage_data_2/unified_coverage_reports/14/html/index.html similarity index 100% rename from coverage_data 2/unified_coverage_reports/14/html/index.html rename to coverage_data_2/unified_coverage_reports/14/html/index.html diff --git a/coverage_data 2/unified_coverage_reports/15/html/index.html b/coverage_data_2/unified_coverage_reports/15/html/index.html similarity index 100% rename from coverage_data 2/unified_coverage_reports/15/html/index.html rename to coverage_data_2/unified_coverage_reports/15/html/index.html diff --git a/coverage_data 2/unified_coverage_reports/16/html/index.html b/coverage_data_2/unified_coverage_reports/16/html/index.html similarity index 100% rename from coverage_data 2/unified_coverage_reports/16/html/index.html rename to coverage_data_2/unified_coverage_reports/16/html/index.html diff --git a/coverage_data 2/unified_coverage_reports/17/html/index.html b/coverage_data_2/unified_coverage_reports/17/html/index.html similarity index 100% rename from coverage_data 2/unified_coverage_reports/17/html/index.html rename to coverage_data_2/unified_coverage_reports/17/html/index.html diff --git a/coverage_data 2/unified_coverage_reports/18/html/index.html b/coverage_data_2/unified_coverage_reports/18/html/index.html similarity index 100% rename from coverage_data 2/unified_coverage_reports/18/html/index.html rename to coverage_data_2/unified_coverage_reports/18/html/index.html diff --git a/coverage_data 2/unified_coverage_reports/19/html/index.html b/coverage_data_2/unified_coverage_reports/19/html/index.html similarity index 100% rename from coverage_data 2/unified_coverage_reports/19/html/index.html rename to coverage_data_2/unified_coverage_reports/19/html/index.html diff --git a/coverage_data 2/unified_coverage_reports/2/html/index.html b/coverage_data_2/unified_coverage_reports/2/html/index.html similarity index 100% rename from coverage_data 2/unified_coverage_reports/2/html/index.html rename to coverage_data_2/unified_coverage_reports/2/html/index.html diff --git a/coverage_data 2/unified_coverage_reports/20/html/index.html b/coverage_data_2/unified_coverage_reports/20/html/index.html similarity index 100% rename from coverage_data 2/unified_coverage_reports/20/html/index.html rename to coverage_data_2/unified_coverage_reports/20/html/index.html diff --git a/coverage_data 2/unified_coverage_reports/21/html/index.html b/coverage_data_2/unified_coverage_reports/21/html/index.html similarity index 100% rename from coverage_data 2/unified_coverage_reports/21/html/index.html rename to coverage_data_2/unified_coverage_reports/21/html/index.html diff --git a/coverage_data 2/unified_coverage_reports/22/html/index.html b/coverage_data_2/unified_coverage_reports/22/html/index.html similarity index 100% rename from coverage_data 2/unified_coverage_reports/22/html/index.html rename to coverage_data_2/unified_coverage_reports/22/html/index.html diff --git a/coverage_data 2/unified_coverage_reports/23/html/index.html b/coverage_data_2/unified_coverage_reports/23/html/index.html similarity index 100% rename from coverage_data 2/unified_coverage_reports/23/html/index.html rename to coverage_data_2/unified_coverage_reports/23/html/index.html diff --git a/coverage_data 2/unified_coverage_reports/3/html/index.html b/coverage_data_2/unified_coverage_reports/3/html/index.html similarity index 100% rename from coverage_data 2/unified_coverage_reports/3/html/index.html rename to coverage_data_2/unified_coverage_reports/3/html/index.html diff --git a/coverage_data 2/unified_coverage_reports/4/html/index.html b/coverage_data_2/unified_coverage_reports/4/html/index.html similarity index 100% rename from coverage_data 2/unified_coverage_reports/4/html/index.html rename to coverage_data_2/unified_coverage_reports/4/html/index.html diff --git a/coverage_data 2/unified_coverage_reports/5/html/index.html b/coverage_data_2/unified_coverage_reports/5/html/index.html similarity index 100% rename from coverage_data 2/unified_coverage_reports/5/html/index.html rename to coverage_data_2/unified_coverage_reports/5/html/index.html diff --git a/coverage_data 2/unified_coverage_reports/6/html/index.html b/coverage_data_2/unified_coverage_reports/6/html/index.html similarity index 100% rename from coverage_data 2/unified_coverage_reports/6/html/index.html rename to coverage_data_2/unified_coverage_reports/6/html/index.html diff --git a/coverage_data 2/unified_coverage_reports/7/html/index.html b/coverage_data_2/unified_coverage_reports/7/html/index.html similarity index 100% rename from coverage_data 2/unified_coverage_reports/7/html/index.html rename to coverage_data_2/unified_coverage_reports/7/html/index.html diff --git a/coverage_data 2/unified_coverage_reports/8/html/index.html b/coverage_data_2/unified_coverage_reports/8/html/index.html similarity index 100% rename from coverage_data 2/unified_coverage_reports/8/html/index.html rename to coverage_data_2/unified_coverage_reports/8/html/index.html diff --git a/coverage_data 2/unified_coverage_reports/9/html/index.html b/coverage_data_2/unified_coverage_reports/9/html/index.html similarity index 100% rename from coverage_data 2/unified_coverage_reports/9/html/index.html rename to coverage_data_2/unified_coverage_reports/9/html/index.html diff --git a/coverage_data 2/unified_coverage_reports/gen.sh b/coverage_data_2/unified_coverage_reports/gen.sh similarity index 100% rename from coverage_data 2/unified_coverage_reports/gen.sh rename to coverage_data_2/unified_coverage_reports/gen.sh From 530cfade0229a588aeb626e6d66ca1c3316b65f9 Mon Sep 17 00:00:00 2001 From: vadim-kharin-codefresh Date: Mon, 5 Aug 2024 13:40:20 +0300 Subject: [PATCH 34/35] Update test.txt --- test.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/test.txt b/test.txt index 9daeafb..dec2cbe 100644 --- a/test.txt +++ b/test.txt @@ -1 +1,2 @@ test +test From 4f0578a2e712c093e70460f17f179d5006c9cb96 Mon Sep 17 00:00:00 2001 From: vadim-kharin-codefresh Date: Tue, 10 Sep 2024 13:49:58 +0300 Subject: [PATCH 35/35] [skip ci] Update test.txt --- test.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/test.txt b/test.txt index dec2cbe..0867e73 100644 --- a/test.txt +++ b/test.txt @@ -1,2 +1,3 @@ test test +test