diff --git a/borestop/.editorconfig b/borestop/.editorconfig new file mode 100644 index 0000000000000000000000000000000000000000..0439866388e5e324dfd589ebbd8e594377dd6b08 --- /dev/null +++ b/borestop/.editorconfig @@ -0,0 +1,23 @@ +# EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# editorconfig.org + +root = true + +[*] + +# We recommend you to keep these unchanged +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +# Change these settings to your own preference +indent_style = space +indent_size = 4 + +[*.{ts,tsx,js,jsx,json,css,scss,yml}] +indent_size = 2 + +[*.md] +trim_trailing_whitespace = false diff --git a/borestop/.eslintignore b/borestop/.eslintignore new file mode 100644 index 0000000000000000000000000000000000000000..c8d1f55775fb14da4fe1674ec1d7e7fc1d02f528 --- /dev/null +++ b/borestop/.eslintignore @@ -0,0 +1,9 @@ +node_modules/ +src/main/docker/ +src/test/javascript/protractor.conf.js +src/test/javascript/jest.conf.js +webpack/ +target/ +build/ +node/ +postcss.config.js diff --git a/borestop/.eslintrc.json b/borestop/.eslintrc.json new file mode 100644 index 0000000000000000000000000000000000000000..43c1cf27258c05a548dbb17d85b84cc8ca1e3e12 --- /dev/null +++ b/borestop/.eslintrc.json @@ -0,0 +1,24 @@ +{ + "plugins": ["@typescript-eslint/tslint"], + "extends": ["jhipster"], + "parserOptions": { + "project": "./tsconfig.base.json" + }, + "rules": { + "@typescript-eslint/tslint/config": [ + "error", + { + "lintFile": "./tslint.json" + } + ], + "@typescript-eslint/no-unused-vars": [ + "warn", + { + "vars": "all", + "args": "after-used", + "ignoreRestSiblings": false + } + ], + "@typescript-eslint/no-non-null-assertion": "off" + } +} diff --git a/borestop/.gitattributes b/borestop/.gitattributes new file mode 100644 index 0000000000000000000000000000000000000000..ca61722de2dea1a75268fb31316dffbeb055b2cf --- /dev/null +++ b/borestop/.gitattributes @@ -0,0 +1,150 @@ +# This file is inspired by https://github.com/alexkaratarakis/gitattributes +# +# Auto detect text files and perform LF normalization +# http://davidlaing.com/2012/09/19/customise-your-gitattributes-to-become-a-git-ninja/ +* text=auto + +# The above will handle all files NOT found below +# These files are text and should be normalized (Convert crlf => lf) + +*.bat text eol=crlf +*.cmd text eol=crlf +*.ps1 text eol=crlf +*.coffee text +*.css text +*.cql text +*.df text +*.ejs text +*.html text +*.java text +*.js text +*.json text +*.less text +*.properties text +*.sass text +*.scss text +*.sh text eol=lf +*.sql text +*.txt text +*.ts text +*.xml text +*.yaml text +*.yml text + +# Documents +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain +*.markdown text +*.md text +*.adoc text +*.textile text +*.mustache text +*.csv text +*.tab text +*.tsv text +*.txt text +AUTHORS text +CHANGELOG text +CHANGES text +CONTRIBUTING text +COPYING text +copyright text +*COPYRIGHT* text +INSTALL text +license text +LICENSE text +NEWS text +readme text +*README* text +TODO text + +# Graphics +*.png binary +*.jpg binary +*.jpeg binary +*.gif binary +*.tif binary +*.tiff binary +*.ico binary +# SVG treated as an asset (binary) by default. If you want to treat it as text, +# comment-out the following line and uncomment the line after. +*.svg binary +#*.svg text +*.eps binary + +# These files are binary and should be left untouched +# (binary is a macro for -text -diff) +*.class binary +*.jar binary +*.war binary + +## LINTERS +.csslintrc text +.eslintrc text +.jscsrc text +.jshintrc text +.jshintignore text +.stylelintrc text + +## CONFIGS +*.conf text +*.config text +.editorconfig text +.gitattributes text +.gitconfig text +.gitignore text +.htaccess text +*.npmignore text + +## HEROKU +Procfile text +.slugignore text + +## AUDIO +*.kar binary +*.m4a binary +*.mid binary +*.midi binary +*.mp3 binary +*.ogg binary +*.ra binary + +## VIDEO +*.3gpp binary +*.3gp binary +*.as binary +*.asf binary +*.asx binary +*.fla binary +*.flv binary +*.m4v binary +*.mng binary +*.mov binary +*.mp4 binary +*.mpeg binary +*.mpg binary +*.swc binary +*.swf binary +*.webm binary + +## ARCHIVES +*.7z binary +*.gz binary +*.rar binary +*.tar binary +*.zip binary + +## FONTS +*.ttf binary +*.eot binary +*.otf binary +*.woff binary +*.woff2 binary diff --git a/borestop/.gitignore b/borestop/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..520491fa3c3a9ab8b0583422b7ffb0b78e0fb0ce --- /dev/null +++ b/borestop/.gitignore @@ -0,0 +1,148 @@ +###################### +# Project Specific +###################### +/src/main/webapp/content/css/main.css +/target/classes/static/** +/src/test/javascript/coverage/ + +###################### +# Node +###################### +/node/ +node_tmp/ +node_modules/ +npm-debug.log.* +/.awcache/* +/.cache-loader/* + +###################### +# SASS +###################### +.sass-cache/ + +###################### +# Eclipse +###################### +*.pydevproject +.project +.metadata +tmp/ +tmp/**/* +*.tmp +*.bak +*.swp +*~.nib +local.properties +.classpath +.settings/ +.loadpath +.factorypath +/src/main/resources/rebel.xml + +# External tool builders +.externalToolBuilders/** + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# PDT-specific +.buildpath + +# STS-specific +/.sts4-cache/* + +###################### +# IntelliJ +###################### +.idea/ +*.iml +*.iws +*.ipr +*.ids +*.orig +classes/ +out/ + +###################### +# Visual Studio Code +###################### +.vscode/ + +###################### +# Maven +###################### +/log/ +/target/ + +###################### +# Gradle +###################### +.gradle/ +/build/ + +###################### +# Package Files +###################### +*.jar +*.war +*.ear +*.db + +###################### +# Windows +###################### +# Windows image file caches +Thumbs.db + +# Folder config file +Desktop.ini + +###################### +# Mac OSX +###################### +.DS_Store +.svn + +# Thumbnails +._* + +# Files that might appear on external disk +.Spotlight-V100 +.Trashes + +###################### +# Directories +###################### +/bin/ +/deploy/ + +###################### +# Logs +###################### +*.log* + +###################### +# Others +###################### +*.class +*.*~ +*~ +.merge_file* + +###################### +# Gradle Wrapper +###################### +!gradle/wrapper/gradle-wrapper.jar + +###################### +# Maven Wrapper +###################### +!.mvn/wrapper/maven-wrapper.jar + +###################### +# ESLint +###################### +.eslintcache diff --git a/borestop/.huskyrc b/borestop/.huskyrc new file mode 100644 index 0000000000000000000000000000000000000000..4d077c82927b1ec0bbf270b20da2f4c16e31d329 --- /dev/null +++ b/borestop/.huskyrc @@ -0,0 +1,5 @@ +{ + "hooks": { + "pre-commit": "lint-staged" + } +} diff --git a/borestop/.lintstagedrc.js b/borestop/.lintstagedrc.js new file mode 100644 index 0000000000000000000000000000000000000000..00c792a5ec0083d1db268cb806b7b4d0a9390cf7 --- /dev/null +++ b/borestop/.lintstagedrc.js @@ -0,0 +1,3 @@ +module.exports = { + '{,src/**/}*.{json,md,yml,ts,css,scss}': ['prettier --write', 'git add'] +}; diff --git a/borestop/.mvn/wrapper/MavenWrapperDownloader.java b/borestop/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 0000000000000000000000000000000000000000..5a155e2dc595beb7ae62f896bb83d2452cf209b9 --- /dev/null +++ b/borestop/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,116 @@ +/* + * Copyright 2007-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import java.io.*; +import java.net.*; +import java.nio.channels.*; +import java.util.Properties; + +public class MavenWrapperDownloader { + private static final String WRAPPER_VERSION = "0.5.6"; + + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = + "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to + * use instead of the default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main(String args[]) { + System.out.println("- Downloader started"); + File baseDirectory = new File(args[0]); + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); + String url = DEFAULT_DOWNLOAD_URL; + if (mavenWrapperPropertyFile.exists()) { + FileInputStream mavenWrapperPropertyFileInputStream = null; + try { + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); + } catch (IOException e) { + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); + } finally { + try { + if (mavenWrapperPropertyFileInputStream != null) { + mavenWrapperPropertyFileInputStream.close(); + } + } catch (IOException e) { + // Ignore ... + } + } + } + System.out.println("- Downloading from: " + url); + + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); + if (!outputFile.getParentFile().exists()) { + if (!outputFile.getParentFile().mkdirs()) { + System.out.println("- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); + } + } + System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); + try { + downloadFileFromURL(url, outputFile); + System.out.println("Done"); + System.exit(0); + } catch (Throwable e) { + System.out.println("- Error downloading"); + e.printStackTrace(); + System.exit(1); + } + } + + private static void downloadFileFromURL(String urlString, File destination) throws Exception { + if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { + String username = System.getenv("MVNW_USERNAME"); + char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); + Authenticator.setDefault( + new Authenticator() { + + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(username, password); + } + } + ); + } + URL website = new URL(urlString); + ReadableByteChannel rbc; + rbc = Channels.newChannel(website.openStream()); + FileOutputStream fos = new FileOutputStream(destination); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + fos.close(); + rbc.close(); + } +} diff --git a/borestop/.mvn/wrapper/maven-wrapper.jar b/borestop/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054 Binary files /dev/null and b/borestop/.mvn/wrapper/maven-wrapper.jar differ diff --git a/borestop/.mvn/wrapper/maven-wrapper.properties b/borestop/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000000000000000000000000000000000000..642d572ce90e5085986bdd9c9204b9404f028084 --- /dev/null +++ b/borestop/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/borestop/.prettierignore b/borestop/.prettierignore new file mode 100644 index 0000000000000000000000000000000000000000..ab0567f5c3736365c716df2c699de96d336cc100 --- /dev/null +++ b/borestop/.prettierignore @@ -0,0 +1,8 @@ +node_modules +target +build +package-lock.json +.git +.mvn +gradle +.gradle diff --git a/borestop/.prettierrc b/borestop/.prettierrc new file mode 100644 index 0000000000000000000000000000000000000000..b74928645d78aeaff469e1f3907079d501ade926 --- /dev/null +++ b/borestop/.prettierrc @@ -0,0 +1,12 @@ +# Prettier configuration + +printWidth: 140 +singleQuote: true +tabWidth: 2 +useTabs: false + +# js and ts rules: +arrowParens: avoid + +# jsx and tsx rules: +jsxBracketSameLine: false diff --git a/borestop/.yo-rc.json b/borestop/.yo-rc.json new file mode 100644 index 0000000000000000000000000000000000000000..27775c66cfe8ea4c6a01310cf856d3afb28937f6 --- /dev/null +++ b/borestop/.yo-rc.json @@ -0,0 +1,42 @@ +{ + "generator-jhipster": { + "promptValues": { + "packageName": "com.ippon.borestop", + "nativeLanguage": "en" + }, + "jhipsterVersion": "6.10.1", + "applicationType": "monolith", + "baseName": "borestop", + "packageName": "com.ippon.borestop", + "packageFolder": "com/ippon/borestop", + "serverPort": "8080", + "authenticationType": "jwt", + "cacheProvider": "no", + "websocket": false, + "databaseType": "sql", + "devDatabaseType": "h2Disk", + "prodDatabaseType": "postgresql", + "searchEngine": false, + "messageBroker": false, + "serviceDiscoveryType": false, + "buildTool": "maven", + "enableSwaggerCodegen": false, + "jwtSecretKey": "NzdiMjRkMmMxZDNkMGY2ZWIyYTcxYWNhYzM4YTBiZjMzOWQzZDQyM2VjY2UwOGRlZDVjZTNiOTdkMWMzNWEzZGNkNzg4YTk2ZDFhZWYwMjUxZjU1ZWFiY2U1ZjA2ZDI1MzFiNTJmMTk5NzE2ZmIzMTE0YzMwYTMzODliYzhhY2E=", + "embeddableLaunchScript": false, + "useSass": true, + "clientPackageManager": "npm", + "clientFramework": "angularX", + "clientTheme": "none", + "clientThemeVariant": "", + "creationTimestamp": 1598119629721, + "testFrameworks": [], + "jhiPrefix": "jhi", + "entitySuffix": "", + "dtoSuffix": "DTO", + "otherModules": [], + "enableTranslation": true, + "nativeLanguage": "en", + "languages": ["en"], + "blueprints": [] + } +} diff --git a/borestop/README.md b/borestop/README.md new file mode 100644 index 0000000000000000000000000000000000000000..884572bdb12243efaab10f8d2004d7bcd9f3e8ab --- /dev/null +++ b/borestop/README.md @@ -0,0 +1,237 @@ +# borestop + +This application was generated using JHipster 6.10.1, you can find documentation and help at [https://www.jhipster.tech/documentation-archive/v6.10.1](https://www.jhipster.tech/documentation-archive/v6.10.1). + +## Development + +Before you can build this project, you must install and configure the following dependencies on your machine: + +1. [Node.js][]: We use Node to run a development web server and build the project. + Depending on your system, you can install Node either from source or as a pre-packaged bundle. + +After installing Node, you should be able to run the following command to install development tools. +You will only need to run this command when dependencies change in [package.json](package.json). + +``` +npm install +``` + +We use npm scripts and [Webpack][] as our build system. + +Run the following commands in two separate terminals to create a blissful development experience where your browser +auto-refreshes when files change on your hard drive. + +``` + +./mvnw + + +npm start +``` + +Npm is also used to manage CSS and JavaScript dependencies used in this application. You can upgrade dependencies by +specifying a newer version in [package.json](package.json). You can also run `npm update` and `npm install` to manage dependencies. +Add the `help` flag on any command to see how you can use it. For example, `npm help update`. + +The `npm run` command will list all of the scripts available to run for this project. + +### PWA Support + +JHipster ships with PWA (Progressive Web App) support, and it's turned off by default. One of the main components of a PWA is a service worker. + +The service worker initialization code is commented out by default. To enable it, uncomment the following code in `src/main/webapp/index.html`: + +```html +<script> + if ('serviceWorker' in navigator) { + navigator.serviceWorker.register('./service-worker.js').then(function() { + console.log('Service Worker Registered'); + }); + } +</script> +``` + +Note: [Workbox](https://developers.google.com/web/tools/workbox/) powers JHipster's service worker. It dynamically generates the `service-worker.js` file. + +### Managing dependencies + +For example, to add [Leaflet][] library as a runtime dependency of your application, you would run following command: + +``` +npm install --save --save-exact leaflet +``` + +To benefit from TypeScript type definitions from [DefinitelyTyped][] repository in development, you would run following command: + +``` +npm install --save-dev --save-exact @types/leaflet +``` + +Then you would import the JS and CSS files specified in library's installation instructions so that [Webpack][] knows about them: +Edit [src/main/webapp/app/vendor.ts](src/main/webapp/app/vendor.ts) file: + +``` +import 'leaflet/dist/leaflet.js'; +``` + +Edit [src/main/webapp/content/scss/vendor.scss](src/main/webapp/content/scss/vendor.scss) file: + +``` +@import '~leaflet/dist/leaflet.css'; +``` + +Note: There are still a few other things remaining to do for Leaflet that we won't detail here. + +For further instructions on how to develop with JHipster, have a look at [Using JHipster in development][]. + +### Using Angular CLI + +You can also use [Angular CLI][] to generate some custom client code. + +For example, the following command: + +``` +ng generate component my-component +``` + +will generate few files: + +``` +create src/main/webapp/app/my-component/my-component.component.html +create src/main/webapp/app/my-component/my-component.component.ts +update src/main/webapp/app/app.module.ts +``` + +## Building for production + +### Packaging as jar + +To build the final jar and optimize the borestop application for production, run: + +``` + +./mvnw -Pprod clean verify + + +``` + +This will concatenate and minify the client CSS and JavaScript files. It will also modify `index.html` so it references these new files. +To ensure everything worked, run: + +``` + +java -jar target/*.jar + + +``` + +Then navigate to [http://localhost:8080](http://localhost:8080) in your browser. + +Refer to [Using JHipster in production][] for more details. + +### Packaging as war + +To package your application as a war in order to deploy it to an application server, run: + +``` + +./mvnw -Pprod,war clean verify + + +``` + +## Testing + +To launch your application's tests, run: + +``` +./mvnw verify +``` + +### Client tests + +Unit tests are run by [Jest][] and written with [Jasmine][]. They're located in [src/test/javascript/](src/test/javascript/) and can be run with: + +``` +npm test +``` + +For more information, refer to the [Running tests page][]. + +### Code quality + +Sonar is used to analyse code quality. You can start a local Sonar server (accessible on http://localhost:9001) with: + +``` +docker-compose -f src/main/docker/sonar.yml up -d +``` + +You can run a Sonar analysis with using the [sonar-scanner](https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner) or by using the maven plugin. + +Then, run a Sonar analysis: + +``` +./mvnw -Pprod clean verify sonar:sonar +``` + +If you need to re-run the Sonar phase, please be sure to specify at least the `initialize` phase since Sonar properties are loaded from the sonar-project.properties file. + +``` +./mvnw initialize sonar:sonar +``` + +For more information, refer to the [Code quality page][]. + +## Using Docker to simplify development (optional) + +You can use Docker to improve your JHipster development experience. A number of docker-compose configuration are available in the [src/main/docker](src/main/docker) folder to launch required third party services. + +For example, to start a postgresql database in a docker container, run: + +``` +docker-compose -f src/main/docker/postgresql.yml up -d +``` + +To stop it and remove the container, run: + +``` +docker-compose -f src/main/docker/postgresql.yml down +``` + +You can also fully dockerize your application and all the services that it depends on. +To achieve this, first build a docker image of your app by running: + +``` +./mvnw -Pprod verify jib:dockerBuild +``` + +Then run: + +``` +docker-compose -f src/main/docker/app.yml up -d +``` + +For more information refer to [Using Docker and Docker-Compose][], this page also contains information on the docker-compose sub-generator (`jhipster docker-compose`), which is able to generate docker configurations for one or several JHipster applications. + +## Continuous Integration (optional) + +To configure CI for your project, run the ci-cd sub-generator (`jhipster ci-cd`), this will let you generate configuration files for a number of Continuous Integration systems. Consult the [Setting up Continuous Integration][] page for more information. + +[jhipster homepage and latest documentation]: https://www.jhipster.tech +[jhipster 6.10.1 archive]: https://www.jhipster.tech/documentation-archive/v6.10.1 +[using jhipster in development]: https://www.jhipster.tech/documentation-archive/v6.10.1/development/ +[using docker and docker-compose]: https://www.jhipster.tech/documentation-archive/v6.10.1/docker-compose +[using jhipster in production]: https://www.jhipster.tech/documentation-archive/v6.10.1/production/ +[running tests page]: https://www.jhipster.tech/documentation-archive/v6.10.1/running-tests/ +[code quality page]: https://www.jhipster.tech/documentation-archive/v6.10.1/code-quality/ +[setting up continuous integration]: https://www.jhipster.tech/documentation-archive/v6.10.1/setting-up-ci/ +[node.js]: https://nodejs.org/ +[yarn]: https://yarnpkg.org/ +[webpack]: https://webpack.github.io/ +[angular cli]: https://cli.angular.io/ +[browsersync]: https://www.browsersync.io/ +[jest]: https://facebook.github.io/jest/ +[jasmine]: https://jasmine.github.io/2.0/introduction.html +[protractor]: https://angular.github.io/protractor/ +[leaflet]: https://leafletjs.com/ +[definitelytyped]: https://definitelytyped.org/ diff --git a/borestop/angular.json b/borestop/angular.json new file mode 100644 index 0000000000000000000000000000000000000000..fe07964515f4f1281f7698fec0c6bc5a28ccec86 --- /dev/null +++ b/borestop/angular.json @@ -0,0 +1,36 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "borestop": { + "root": "", + "sourceRoot": "src/main/webapp", + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "skipTests": true, + "style": "scss" + }, + "@schematics/angular:directive": { + "skipTests": true + }, + "@schematics/angular:guard": { + "skipTests": true + }, + "@schematics/angular:pipe": { + "skipTests": true + }, + "@schematics/angular:service": { + "skipTests": true + } + }, + "prefix": "jhi", + "architect": {} + } + }, + "defaultProject": "borestop", + "cli": { + "packageManager": "npm" + } +} diff --git a/borestop/checkstyle.xml b/borestop/checkstyle.xml new file mode 100644 index 0000000000000000000000000000000000000000..6e3dbafef82b229bf5903b076c25c5b3a985b961 --- /dev/null +++ b/borestop/checkstyle.xml @@ -0,0 +1,21 @@ +<?xml version="1.0"?> +<!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.3//EN" + "https://www.puppycrawl.com/dtds/configuration_1_3.dtd"> +<module name="Checker"> + + <!-- Configure checker to use UTF-8 encoding --> + <property name="charset" value="UTF-8"/> + <!-- Configure checker to run on files with these extensions --> + <property name="fileExtensions" value=""/> + <!-- For detailed checkstyle configuration, see https://github.com/spring-io/nohttp/tree/master/nohttp-checkstyle --> + <module name="io.spring.nohttp.checkstyle.check.NoHttpCheck"> + <property name="whitelist" value="http://maven.apache.org/POM/4.0.0 + http://www.w3.org/2001/XMLSchema-instance http://maven.apache.org/maven-v4_0_0.xsd"/> + </module> + <!-- Allow suppression with comments + // CHECKSTYLE:OFF + ... ignored content ... + // CHECKSTYLE:ON + --> + <module name="SuppressWithPlainTextCommentFilter"/> +</module> diff --git a/borestop/mvnw b/borestop/mvnw new file mode 100755 index 0000000000000000000000000000000000000000..41c0f0c23db5dca836d3db1a17a7a28444d17d74 --- /dev/null +++ b/borestop/mvnw @@ -0,0 +1,310 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/borestop/mvnw.cmd b/borestop/mvnw.cmd new file mode 100644 index 0000000000000000000000000000000000000000..86115719e5383e94597f918bf18c5ecbb7cfe492 --- /dev/null +++ b/borestop/mvnw.cmd @@ -0,0 +1,182 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + +FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/borestop/package-lock.json b/borestop/package-lock.json new file mode 100644 index 0000000000000000000000000000000000000000..a9e29e4a3660d15ec3c47655250ec25a42b3a8fe --- /dev/null +++ b/borestop/package-lock.json @@ -0,0 +1,23954 @@ +{ + "name": "borestop", + "version": "0.0.1-SNAPSHOT", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.1000.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1000.0.tgz", + "integrity": "sha512-luzBYe7t994ebq6xIfYJudxOkMBO0bywafk6sQqb+bOaBQAran4orF1R/zEx6f8TJzEoXELjUvxm/ePSqZdpKg==", + "dev": true, + "requires": { + "@angular-devkit/core": "10.0.0", + "rxjs": "6.5.5" + } + }, + "@angular-devkit/core": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.0.0.tgz", + "integrity": "sha512-IvX9IMaCjDkN9vDVnYcgWbSBinlUUb7jdFhDGeTtK6rGSnjX1GoLvWneVI2hoccS07fPbnfMoYXBoZLwVxiIxw==", + "dev": true, + "requires": { + "ajv": "6.12.2", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.5.5", + "source-map": "0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "@angular-devkit/schematics": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-10.0.0.tgz", + "integrity": "sha512-FJ/dY18M+cnAT9RkVjVRJ0PMFZci3ok0WoOosW25Fk68jwNSbGCeF8k8NcD6YE60+CfF4/0LxQWgFagr/wdEhw==", + "dev": true, + "requires": { + "@angular-devkit/core": "10.0.0", + "ora": "4.0.4", + "rxjs": "6.5.5" + } + }, + "@angular/cli": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-10.0.0.tgz", + "integrity": "sha512-I+2cltQCmThgrnHwsG5AX0hQ9z6rK/8ysRWWeiJXHtEtqupW9eNzXX1QfXWxWB3o6oIKgijvnLlp04BUlWCyXA==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.1000.0", + "@angular-devkit/core": "10.0.0", + "@angular-devkit/schematics": "10.0.0", + "@schematics/angular": "10.0.0", + "@schematics/update": "0.1000.0", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.1", + "debug": "4.1.1", + "ini": "1.3.5", + "inquirer": "7.1.0", + "npm-package-arg": "8.0.1", + "npm-pick-manifest": "6.1.0", + "open": "7.0.4", + "pacote": "9.5.12", + "read-package-tree": "5.3.1", + "rimraf": "3.0.2", + "semver": "7.3.2", + "symbol-observable": "1.2.0", + "universal-analytics": "0.4.20", + "uuid": "8.1.0" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } + } + }, + "@angular/common": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-10.0.0.tgz", + "integrity": "sha512-zaLHMRQqjZyoIc15tLGrwg5ugcVlggqATiMlMVNo9ddqxwpZ4qHK2fdAvqQy9FfWKaPGi6NpIBSR31RGV0ircw==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@angular/compiler": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-10.0.0.tgz", + "integrity": "sha512-meyJKPLLhkgjxF4dvdJq/sw7MI7KvpgYADoFt2K/5dt48ExXRj+kDlyQC6FAwm9mbgSea/A+JpDG8HMPU7AK5Q==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@angular/compiler-cli": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-10.0.0.tgz", + "integrity": "sha512-KusRkS1NKPrjhj3BXoxRgeejuJVy/ra4dcDV3hpscRmR8FSdim3rs2H+lYK2hZ26ISGsYUvC8cHNaMqP2U3X+g==", + "dev": true, + "requires": { + "canonical-path": "1.0.0", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.7.2", + "fs-extra": "4.0.2", + "magic-string": "^0.25.0", + "minimist": "^1.2.0", + "reflect-metadata": "^0.1.2", + "semver": "^6.3.0", + "source-map": "^0.6.1", + "sourcemap-codec": "^1.4.8", + "tslib": "^2.0.0", + "yargs": "15.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@angular/core": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-10.0.0.tgz", + "integrity": "sha512-N1m6op428ktgcsnXqqspb1xGZ9gp664Jmb4JoVajCD3JXucRfidw+vt3kPOldbWA6M4pIu5ZtZY3IZc2GrK5UQ==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@angular/forms": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-10.0.0.tgz", + "integrity": "sha512-Jaqs6WmF3fcaL1mKmeZt8pcFHkMuFvgLjbgGFqiOKcdz4UdGTcYkI3mE+UqHpqqXGXYTHLusup8A4TqD7s0rxg==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@angular/localize": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-10.0.0.tgz", + "integrity": "sha512-UWuuJYVYDwMGKu8wQuyKH2v0Qbb9HW5n/3tIuw5s0O9yDlhyreueWqCYk42u51p8YDQ7FY7ToZhbMq73G7A8tA==", + "requires": { + "@babel/core": "7.8.3", + "glob": "7.1.2", + "yargs": "15.3.0" + } + }, + "@angular/platform-browser": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-10.0.0.tgz", + "integrity": "sha512-2gp53WjGUrL1uReewU21IZJa4KFpbigCyDYB0j/KwTkIGrdwYCOjD0/04oHYjkpazPe/VIu3aN7Gb3PgUa3X/Q==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@angular/platform-browser-dynamic": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-10.0.0.tgz", + "integrity": "sha512-Ol9dMU/UB8PZ1xQkcILmANC+tA1Y/6YeYc8+MYnZUH7uAMXV6kscg9C5fK9JixSldOOS05AQZAdEty9ESjFNNg==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@angular/router": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-10.0.0.tgz", + "integrity": "sha512-rx9e0eOwXypV/oWLrGsug3wx9lPnD6NUU3i20/VG9O1uMHgXfpnP8RJLcUHqmEMBZEYTLMo59fDE5LEgM1sIFg==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/compat-data": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz", + "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "semver": "^5.5.0" + } + }, + "@babel/core": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", + "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.3", + "@babel/helpers": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/generator": { + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.4.tgz", + "integrity": "sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g==", + "requires": { + "@babel/types": "^7.11.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", + "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", + "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.10.4", + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", + "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.10.5", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", + "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-regex": "^7.10.4", + "regexpu-core": "^4.7.0" + } + }, + "@babel/helper-define-map": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", + "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/types": "^7.10.5", + "lodash": "^4.17.19" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz", + "integrity": "sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", + "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", + "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-module-transforms": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", + "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/template": "^7.10.4", + "@babel/types": "^7.11.0", + "lodash": "^4.17.19" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", + "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", + "dev": true, + "requires": { + "lodash": "^4.17.19" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz", + "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-replace-supers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-simple-access": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", + "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + }, + "@babel/helper-wrap-function": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", + "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helpers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", + "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "requires": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", + "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==" + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", + "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", + "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", + "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz", + "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", + "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz", + "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", + "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", + "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", + "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.10.4" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", + "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz", + "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", + "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", + "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", + "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", + "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", + "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", + "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", + "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", + "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", + "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", + "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", + "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", + "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", + "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", + "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", + "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", + "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", + "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", + "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", + "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", + "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz", + "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.10.4", + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", + "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", + "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", + "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", + "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", + "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", + "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", + "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", + "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", + "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", + "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", + "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-regex": "^7.10.4" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", + "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", + "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", + "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", + "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/preset-env": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.0.tgz", + "integrity": "sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.11.0", + "@babel/helper-compilation-targets": "^7.10.4", + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-proposal-async-generator-functions": "^7.10.4", + "@babel/plugin-proposal-class-properties": "^7.10.4", + "@babel/plugin-proposal-dynamic-import": "^7.10.4", + "@babel/plugin-proposal-export-namespace-from": "^7.10.4", + "@babel/plugin-proposal-json-strings": "^7.10.4", + "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", + "@babel/plugin-proposal-numeric-separator": "^7.10.4", + "@babel/plugin-proposal-object-rest-spread": "^7.11.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", + "@babel/plugin-proposal-optional-chaining": "^7.11.0", + "@babel/plugin-proposal-private-methods": "^7.10.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.10.4", + "@babel/plugin-transform-arrow-functions": "^7.10.4", + "@babel/plugin-transform-async-to-generator": "^7.10.4", + "@babel/plugin-transform-block-scoped-functions": "^7.10.4", + "@babel/plugin-transform-block-scoping": "^7.10.4", + "@babel/plugin-transform-classes": "^7.10.4", + "@babel/plugin-transform-computed-properties": "^7.10.4", + "@babel/plugin-transform-destructuring": "^7.10.4", + "@babel/plugin-transform-dotall-regex": "^7.10.4", + "@babel/plugin-transform-duplicate-keys": "^7.10.4", + "@babel/plugin-transform-exponentiation-operator": "^7.10.4", + "@babel/plugin-transform-for-of": "^7.10.4", + "@babel/plugin-transform-function-name": "^7.10.4", + "@babel/plugin-transform-literals": "^7.10.4", + "@babel/plugin-transform-member-expression-literals": "^7.10.4", + "@babel/plugin-transform-modules-amd": "^7.10.4", + "@babel/plugin-transform-modules-commonjs": "^7.10.4", + "@babel/plugin-transform-modules-systemjs": "^7.10.4", + "@babel/plugin-transform-modules-umd": "^7.10.4", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", + "@babel/plugin-transform-new-target": "^7.10.4", + "@babel/plugin-transform-object-super": "^7.10.4", + "@babel/plugin-transform-parameters": "^7.10.4", + "@babel/plugin-transform-property-literals": "^7.10.4", + "@babel/plugin-transform-regenerator": "^7.10.4", + "@babel/plugin-transform-reserved-words": "^7.10.4", + "@babel/plugin-transform-shorthand-properties": "^7.10.4", + "@babel/plugin-transform-spread": "^7.11.0", + "@babel/plugin-transform-sticky-regex": "^7.10.4", + "@babel/plugin-transform-template-literals": "^7.10.4", + "@babel/plugin-transform-typeof-symbol": "^7.10.4", + "@babel/plugin-transform-unicode-escapes": "^7.10.4", + "@babel/plugin-transform-unicode-regex": "^7.10.4", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.11.0", + "browserslist": "^4.12.0", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, + "@babel/preset-modules": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", + "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/runtime": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", + "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.0", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.0", + "@babel/types": "^7.11.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "dev": true, + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + } + }, + "@fortawesome/angular-fontawesome": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@fortawesome/angular-fontawesome/-/angular-fontawesome-0.6.1.tgz", + "integrity": "sha512-ARQjtRuT+ZskzJDJKPwuiGO3+7nS0iyNLU/uHVJHfG4LwGJxwVIGldwg1SU957sra0Z0OtWEajHMhiS4vB9LwQ==" + }, + "@fortawesome/fontawesome-common-types": { + "version": "0.2.30", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.30.tgz", + "integrity": "sha512-TsRwpTuKwFNiPhk1UfKgw7zNPeV5RhNp2Uw3pws+9gDAkPGKrtjR1y2lI3SYn7+YzyfuNknflpBA1LRKjt7hMg==" + }, + "@fortawesome/fontawesome-svg-core": { + "version": "1.2.29", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.29.tgz", + "integrity": "sha512-xmPmP2t8qrdo8RyKihTkGb09RnZoc+7HFBCnr0/6ZhStdGDSLeEd7ajV181+2W29NWIFfylO13rU+s3fpy3cnA==", + "requires": { + "@fortawesome/fontawesome-common-types": "^0.2.29" + } + }, + "@fortawesome/free-solid-svg-icons": { + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.13.1.tgz", + "integrity": "sha512-LQH/0L1p4+rqtoSHa9qFYR84hpuRZKqaQ41cfBQx8b68p21zoWSekTAeA54I/2x9VlCHDLFlG74Nmdg4iTPQOg==", + "requires": { + "@fortawesome/fontawesome-common-types": "^0.2.29" + } + }, + "@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", + "dev": true + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", + "dev": true + }, + "@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", + "dev": true + }, + "@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "dev": true, + "requires": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "dev": true, + "requires": { + "@hapi/hoek": "^8.3.0" + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, + "@jest/console": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.3.0.tgz", + "integrity": "sha512-/5Pn6sJev0nPUcAdpJHMVIsA8sKizL2ZkcKPE5+dJrCccks7tcM7c9wbgHudBJbxXLoTbqsHkG1Dofoem4F09w==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.3.0", + "jest-util": "^26.3.0", + "slash": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/core": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.4.2.tgz", + "integrity": "sha512-sDva7YkeNprxJfepOctzS8cAk9TOekldh+5FhVuXS40+94SHbiicRO1VV2tSoRtgIo+POs/Cdyf8p76vPTd6dg==", + "dev": true, + "requires": { + "@jest/console": "^26.3.0", + "@jest/reporters": "^26.4.1", + "@jest/test-result": "^26.3.0", + "@jest/transform": "^26.3.0", + "@jest/types": "^26.3.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.3.0", + "jest-config": "^26.4.2", + "jest-haste-map": "^26.3.0", + "jest-message-util": "^26.3.0", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.4.0", + "jest-resolve-dependencies": "^26.4.2", + "jest-runner": "^26.4.2", + "jest-runtime": "^26.4.2", + "jest-snapshot": "^26.4.2", + "jest-util": "^26.3.0", + "jest-validate": "^26.4.2", + "jest-watcher": "^26.3.0", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/environment": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.3.0.tgz", + "integrity": "sha512-EW+MFEo0DGHahf83RAaiqQx688qpXgl99wdb8Fy67ybyzHwR1a58LHcO376xQJHfmoXTu89M09dH3J509cx2AA==", + "dev": true, + "requires": { + "@jest/fake-timers": "^26.3.0", + "@jest/types": "^26.3.0", + "@types/node": "*", + "jest-mock": "^26.3.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/fake-timers": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.3.0.tgz", + "integrity": "sha512-ZL9ytUiRwVP8ujfRepffokBvD2KbxbqMhrXSBhSdAhISCw3gOkuntisiSFv+A6HN0n0fF4cxzICEKZENLmW+1A==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.3.0", + "jest-mock": "^26.3.0", + "jest-util": "^26.3.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/globals": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.4.2.tgz", + "integrity": "sha512-Ot5ouAlehhHLRhc+sDz2/9bmNv9p5ZWZ9LE1pXGGTCXBasmi5jnYjlgYcYt03FBwLmZXCZ7GrL29c33/XRQiow==", + "dev": true, + "requires": { + "@jest/environment": "^26.3.0", + "@jest/types": "^26.3.0", + "expect": "^26.4.2" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/reporters": { + "version": "26.4.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.4.1.tgz", + "integrity": "sha512-aROTkCLU8++yiRGVxLsuDmZsQEKO6LprlrxtAuzvtpbIFl3eIjgIf3EUxDKgomkS25R9ZzwGEdB5weCcBZlrpQ==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.3.0", + "@jest/test-result": "^26.3.0", + "@jest/transform": "^26.3.0", + "@jest/types": "^26.3.0", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.3.0", + "jest-resolve": "^26.4.0", + "jest-util": "^26.3.0", + "jest-worker": "^26.3.0", + "node-notifier": "^8.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^5.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/source-map": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.3.0.tgz", + "integrity": "sha512-hWX5IHmMDWe1kyrKl7IhFwqOuAreIwHhbe44+XH2ZRHjrKIh0LO5eLQ/vxHFeAfRwJapmxuqlGAEYLadDq6ZGQ==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@jest/test-result": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.3.0.tgz", + "integrity": "sha512-a8rbLqzW/q7HWheFVMtghXV79Xk+GWwOK1FrtimpI5n1la2SY0qHri3/b0/1F0Ve0/yJmV8pEhxDfVwiUBGtgg==", + "dev": true, + "requires": { + "@jest/console": "^26.3.0", + "@jest/types": "^26.3.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/test-sequencer": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.4.2.tgz", + "integrity": "sha512-83DRD8N3M0tOhz9h0bn6Kl6dSp+US6DazuVF8J9m21WAp5x7CqSMaNycMP0aemC/SH/pDQQddbsfHRTBXVUgog==", + "dev": true, + "requires": { + "@jest/test-result": "^26.3.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.3.0", + "jest-runner": "^26.4.2", + "jest-runtime": "^26.4.2" + } + }, + "@jest/transform": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.3.0.tgz", + "integrity": "sha512-Isj6NB68QorGoFWvcOjlUhpkT56PqNIsXKR7XfvoDlCANn/IANlh8DrKAA2l2JKC3yWSMH5wS0GwuQM20w3b2A==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^26.3.0", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.3.0", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.3.0", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@ng-bootstrap/ng-bootstrap": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-6.1.0.tgz", + "integrity": "sha512-2GzkNJBKdeHkaUqaCAqSILPft0IzzHjMfAlAuGY6/ZLlVQ0glt5MTbIXtIhSbjR+OvlrljoXFLrvzs1LGdmE+A==" + }, + "@ngtools/webpack": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-10.0.0.tgz", + "integrity": "sha512-2mnuzkCokn84PrBIiSwUqZImd5uKdsdZcpnuvgABmbxe3bAPxbOgzud/bLxG1/ynLvk/vd/FCNeDcY6HylB8OQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "10.0.0", + "enhanced-resolve": "4.1.1", + "rxjs": "6.5.5", + "webpack-sources": "1.4.3" + } + }, + "@ngx-translate/core": { + "version": "12.1.2", + "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-12.1.2.tgz", + "integrity": "sha512-ZudJsqIxTKlLmPoqK8gJY3UpMGujR0Xm7HfXL6AR79yGRS23QqpjAhMfx4v5qUCcHMmQ9/78bW8QJLfp31c7vQ==" + }, + "@ngx-translate/http-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-5.0.0.tgz", + "integrity": "sha512-8+aV7N52qed+6t4LIu4Yru/PkeBX4TR2ioXGwXzQE5syqSLTj/8TgKQIi3i2Z61ZhPxQG1qrGbapUoGQzUDVeg==" + }, + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + } + }, + "@npmcli/move-file": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz", + "integrity": "sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, + "@openapitools/openapi-generator-cli": { + "version": "1.0.13-4.3.1", + "resolved": "https://registry.npmjs.org/@openapitools/openapi-generator-cli/-/openapi-generator-cli-1.0.13-4.3.1.tgz", + "integrity": "sha512-hUbSHCXak8vujMpTgH5dDACq0mynya37xgPFD3JbmnwRrPrgrZ4mr3+w7QZJ5aLMCIfb2j3s96d1sWaOZYZzxA==", + "dev": true + }, + "@rollup/plugin-node-resolve": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz", + "integrity": "sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.0.8", + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.14.2" + }, + "dependencies": { + "builtin-modules": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", + "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", + "dev": true + } + } + }, + "@rollup/plugin-replace": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.3.3.tgz", + "integrity": "sha512-XPmVXZ7IlaoWaJLkSCDaa0Y6uVo5XQYHhiMFzOd5qSv5rE+t/UJToPIOE56flKIxBFQI27ONsxb7dqHnwSsjKQ==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.0.8", + "magic-string": "^0.25.5" + } + }, + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + } + }, + "@samverschueren/stream-to-observable": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz", + "integrity": "sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==", + "dev": true, + "requires": { + "any-observable": "^0.3.0" + } + }, + "@scarf/scarf": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-0.1.5.tgz", + "integrity": "sha512-Fx6atDc7JM1r0WkPCDhNetVZNp+DO21q/HGlomAKBG+k8vb1B8fg8Yige4oCf1P9OWTZWm5tM5i3jlXhrSbNOg==" + }, + "@schematics/angular": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-10.0.0.tgz", + "integrity": "sha512-m7Pxz4guAMbe7NASKCPUNxvUX/LeieDjGsXwIt09tVE4dEi9yqJP5zq8kOnZEiLKKflP7GoB65RNex4dTxsydw==", + "dev": true, + "requires": { + "@angular-devkit/core": "10.0.0", + "@angular-devkit/schematics": "10.0.0" + } + }, + "@schematics/update": { + "version": "0.1000.0", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.1000.0.tgz", + "integrity": "sha512-snjz7sQCOn4Xi66XQREXZx9K6R/vAnUfdyO5nXekls8+E+MIowlP+gqHM0whi8qJDwCLd9maYmeVsD6XZaGImQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "10.0.0", + "@angular-devkit/schematics": "10.0.0", + "@yarnpkg/lockfile": "1.1.0", + "ini": "1.3.5", + "npm-package-arg": "^8.0.0", + "pacote": "9.5.12", + "rxjs": "6.5.5", + "semver": "7.3.2", + "semver-intersect": "1.4.0" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } + } + }, + "@sinonjs/commons": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", + "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@surma/rollup-plugin-off-main-thread": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.1.tgz", + "integrity": "sha512-ZPBWYQDdO4JZiTmTP3DABsHhIPA7bEJk9Znk7tZsrbPGanoGo8YxMv//WLx5Cvb+lRgS42+6yiOIYYHCKDmkpQ==", + "dev": true, + "requires": { + "ejs": "^2.6.1", + "magic-string": "^0.25.0" + }, + "dependencies": { + "ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", + "dev": true + } + } + }, + "@types/anymatch": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", + "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==", + "dev": true + }, + "@types/babel__core": { + "version": "7.1.9", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.9.tgz", + "integrity": "sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", + "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", + "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.13.tgz", + "integrity": "sha512-i+zS7t6/s9cdQvbqKDARrcbrPvtJGlbYsMkazo03nTAK3RX9FNrLllXys22uiTGJapPOTZTQ35nHh4ISph4SLQ==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" + }, + "@types/concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-OU2+C7X+5Gs42JZzXoto7yOQ0A0=", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "dev": true + }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/graceful-fs": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.3.tgz", + "integrity": "sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/html-minifier-terser": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.0.tgz", + "integrity": "sha512-iYCgjm1dGPRuo12+BStjd1HiVQqhlRhWDOQigNxn023HcjnhsiFz9pc6CzJj4HwDCSQca9bxTL4PxJDbkdm3PA==", + "dev": true + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "26.0.3", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.3.tgz", + "integrity": "sha512-v89ga1clpVL/Y1+YI0eIu1VMW+KU7Xl8PhylVtDKVWaSUHBHYPLXMQGBdrpHewaKoTvlXkksbYqPgz8b4cmRZg==", + "dev": true, + "requires": { + "jest-diff": "^25.2.1", + "pretty-format": "^25.2.1" + } + }, + "@types/json-schema": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", + "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=", + "dev": true + }, + "@types/node": { + "version": "13.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.4.tgz", + "integrity": "sha512-x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA==", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@types/prettier": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.0.2.tgz", + "integrity": "sha512-IkVfat549ggtkZUthUzEX49562eGikhSYeVGX97SkMFn+sTZrgRewXjQ4tPKFPCykZHkX1Zfd9OoELGqKU2jJA==", + "dev": true + }, + "@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", + "dev": true + }, + "@types/qs": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.4.tgz", + "integrity": "sha512-+wYo+L6ZF6BMoEjtf8zB2esQsqdV6WsjRK/GP9WOgLPrq87PbNWgIxS76dS5uvl/QXtHGakZmwTznIfcPXcKlQ==", + "dev": true + }, + "@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, + "@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "dev": true + }, + "@types/tapable": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.6.tgz", + "integrity": "sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==", + "dev": true + }, + "@types/uglify-js": { + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.9.3.tgz", + "integrity": "sha512-KswB5C7Kwduwjj04Ykz+AjvPcfgv/37Za24O2EDzYNbwyzOo8+ydtvzUfZ5UMguiVu29Gx44l1A6VsPPcmYu9w==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@types/webpack": { + "version": "4.41.21", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.21.tgz", + "integrity": "sha512-2j9WVnNrr/8PLAB5csW44xzQSJwS26aOnICsP3pSGCEdsu6KYtfQ6QJsVUKHWRnm1bL7HziJsfh5fHqth87yKA==", + "dev": true, + "requires": { + "@types/anymatch": "*", + "@types/node": "*", + "@types/tapable": "*", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@types/webpack-sources": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-1.4.2.tgz", + "integrity": "sha512-77T++JyKow4BQB/m9O96n9d/UUHWLQHlcqXb9Vsf4F1+wKNrrlWNFPDLKNT92RJnCSL6CieTc+NDXtCVZswdTw==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "@types/yargs": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", + "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.30.0.tgz", + "integrity": "sha512-PGejii0qIZ9Q40RB2jIHyUpRWs1GJuHP1pkoCiaeicfwO9z7Fx03NQzupuyzAmv+q9/gFNHu7lo1ByMXe8PNyg==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "2.30.0", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/eslint-plugin-tslint": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin-tslint/-/eslint-plugin-tslint-2.30.0.tgz", + "integrity": "sha512-phARGRY1SyAkG9uVhF7o0yjK1eqmGYCwM7JpNkOo/50d68ZG0V/P9VyYMSKAj+IbRlZ/k2rKFibKZvfLJPcFGw==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "2.30.0", + "lodash": "^4.17.15" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.30.0.tgz", + "integrity": "sha512-L3/tS9t+hAHksy8xuorhOzhdefN0ERPDWmR9CclsIGOUqGKy6tqc/P+SoXeJRye5gazkuPO0cK9MQRnolykzkA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.30.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.30.0.tgz", + "integrity": "sha512-9kDOxzp0K85UnpmPJqUzdWaCNorYYgk1yZmf4IKzpeTlSAclnFsrLjfwD9mQExctLoLoGAUXq1co+fbr+3HeFw==", + "dev": true, + "requires": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "2.30.0", + "@typescript-eslint/typescript-estree": "2.30.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "@typescript-eslint/typescript-estree": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.30.0.tgz", + "integrity": "sha512-nI5WOechrA0qAhnr+DzqwmqHsx7Ulr/+0H7bWCcClDhhWkSyZR5BmTvnBEyONwJCTWHfc5PAQExX24VD26IAVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "eslint-visitor-keys": "^1.1.0", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^6.3.0", + "tsutils": "^3.17.1" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "abab": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.4.tgz", + "integrity": "sha512-Eu9ELJWCz/c1e9gTiCY+FceWxcqzjYEbqMgtndnuSqZSUCOL73TWNK2mHfIj4Cw2E/ongOp+JISVNCmovt2KYQ==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", + "dev": true + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "acorn-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", + "dev": true + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "agentkeepalive": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "dev": true, + "requires": { + "humanize-ms": "^1.2.1" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "ansi": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", + "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=", + "dev": true + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, + "ansi-font": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/ansi-font/-/ansi-font-0.0.2.tgz", + "integrity": "sha1-iQMBvVhBRi/TnAt3Ca/R9SUUMzE=", + "dev": true + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, + "any-observable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", + "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", + "dev": true + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "app-root-path": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.2.1.tgz", + "integrity": "sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA==", + "dev": true + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "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" + }, + "dependencies": { + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + } + } + }, + "aria-query": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", + "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7", + "commander": "^2.11.0" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-each-series": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", + "integrity": "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "9.8.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.4.tgz", + "integrity": "sha512-84aYfXlpUe45lvmS+HoAWKCkirI/sw4JK0/bTeeqgHYco3dcsOn0NqdejISjptsYwNji/21dnkDri9PsYKk89A==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001087", + "colorette": "^1.2.0", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + } + }, + "aws-sdk": { + "version": "2.706.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.706.0.tgz", + "integrity": "sha512-7GT+yrB5Wb/zOReRdv/Pzkb2Qt+hz6B/8FGMVaoysX3NryHvQUdz7EQWi5yhg9CxOjKxdw5lFwYSs69YlSp1KA==", + "dev": true, + "requires": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.15.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "uuid": "3.3.2", + "xml2js": "0.4.19" + }, + "dependencies": { + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + } + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", + "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", + "dev": true + }, + "axios": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz", + "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==", + "dev": true, + "requires": { + "follow-redirects": "1.5.10", + "is-buffer": "^2.0.2" + }, + "dependencies": { + "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 + } + } + }, + "axobject-query": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", + "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7" + } + }, + "babel-extract-comments": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", + "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", + "dev": true, + "requires": { + "babylon": "^6.18.0" + } + }, + "babel-jest": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.3.0.tgz", + "integrity": "sha512-sxPnQGEyHAOPF8NcUsD0g7hDCnvLL2XyblRBcgrzTWBB/mAIpWow3n1bEL+VghnnZfreLhFSBsFluRoK2tRK4g==", + "dev": true, + "requires": { + "@jest/transform": "^26.3.0", + "@jest/types": "^26.3.0", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.3.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "26.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.2.0.tgz", + "integrity": "sha512-B/hVMRv8Nh1sQ1a3EY8I0n4Y1Wty3NrR5ebOyVT302op+DOAau+xNEImGMsUWOC3++ZlMooCytKz+NgN8aKGbA==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "babel-preset-current-node-syntax": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.3.tgz", + "integrity": "sha512-uyexu1sVwcdFnyq9o8UQYsXwXflIh8LvrF5+cKrYam93ned1CStffB3+BEcsxGSgagoA3GEyjDqO4a/58hyPYQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.3.0.tgz", + "integrity": "sha512-5WPdf7nyYi2/eRxCbVrE1kKCWxgWY4RsPEbdJWFm7QsesFGqjdkyLeu1zRkwM1cxK6EPIlNd6d2AxLk7J+t4pw==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^26.2.0", + "babel-preset-current-node-syntax": "^0.1.3" + } + }, + "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=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + } + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, + "bfj": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz", + "integrity": "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "check-types": "^8.0.3", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "dev": true + }, + "binaryextensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.3.0.tgz", + "integrity": "sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==", + "dev": true + }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", + "dev": true + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bn.js": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", + "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + }, + "dependencies": { + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "bootstrap": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.5.0.tgz", + "integrity": "sha512-Z93QoXvodoVslA+PWNdk23Hze4RBYIkpb5h8I2HY2Tu2h7A0LpAgLcyrhrSUyo2/Oxm2l1fRZPs1e5hnxnliXA==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "browser-sync": { + "version": "2.26.7", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.26.7.tgz", + "integrity": "sha512-lY3emme0OyvA2ujEMpRmyRy9LY6gHLuTr2/ABxhIm3lADOiRXzP4dgekvnDrQqZ/Ec2Fz19lEjm6kglSG5766w==", + "dev": true, + "requires": { + "browser-sync-client": "^2.26.6", + "browser-sync-ui": "^2.26.4", + "bs-recipes": "1.3.4", + "bs-snippet-injector": "^2.0.1", + "chokidar": "^2.0.4", + "connect": "3.6.6", + "connect-history-api-fallback": "^1", + "dev-ip": "^1.0.1", + "easy-extender": "^2.3.4", + "eazy-logger": "^3", + "etag": "^1.8.1", + "fresh": "^0.5.2", + "fs-extra": "3.0.1", + "http-proxy": "1.15.2", + "immutable": "^3", + "localtunnel": "1.9.2", + "micromatch": "^3.1.10", + "opn": "5.3.0", + "portscanner": "2.1.1", + "qs": "6.2.3", + "raw-body": "^2.3.2", + "resp-modifier": "6.0.2", + "rx": "4.1.0", + "send": "0.16.2", + "serve-index": "1.9.1", + "serve-static": "1.13.2", + "server-destroy": "1.0.1", + "socket.io": "2.1.1", + "ua-parser-js": "0.7.17", + "yargs": "6.4.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "qs": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", + "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", + "dev": true + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz", + "integrity": "sha1-gW4ahm1VmMzzTlWW3c4i2S2kkNQ=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^4.1.0" + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" + } + } + } + }, + "browser-sync-client": { + "version": "2.26.12", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.26.12.tgz", + "integrity": "sha512-bEBDRkufKxrIfjOsIB1FN9itUEXr2oLtz1AySgSSr80K2AWzmtoYnxtVASx/i40qFrSdeI31pNvdCjHivihLVA==", + "dev": true, + "requires": { + "etag": "1.8.1", + "fresh": "0.5.2", + "mitt": "^1.1.3", + "rxjs": "^5.5.6" + }, + "dependencies": { + "rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true + } + } + }, + "browser-sync-ui": { + "version": "2.26.12", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.26.12.tgz", + "integrity": "sha512-PkAJNf/TfCFTCkQUfXplR2Kp/+/lbCWFO9lrgLZsmxIhvMLx2pYZFBbTBIaem8qjXhld9ZcESUC8EdU5VWFJgQ==", + "dev": true, + "requires": { + "async-each-series": "0.1.1", + "connect-history-api-fallback": "^1", + "immutable": "^3", + "server-destroy": "1.0.1", + "socket.io-client": "^2.0.4", + "stream-throttle": "^0.1.3" + } + }, + "browser-sync-webpack-plugin": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/browser-sync-webpack-plugin/-/browser-sync-webpack-plugin-2.2.2.tgz", + "integrity": "sha512-x92kl8LdBi4dp6YVXYqrSoDkOCOLCeBOrYSY0h9Sk1VcCDSoZC1Vc62eae6TfC2ljN4/L+aYlkzE46kirHzbgA==", + "dev": true, + "requires": { + "lodash": "^4" + } + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.0.tgz", + "integrity": "sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001111", + "electron-to-chromium": "^1.3.523", + "escalade": "^3.0.2", + "node-releases": "^1.1.60" + } + }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "bs-recipes": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", + "integrity": "sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=", + "dev": true + }, + "bs-snippet-injector": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz", + "integrity": "sha1-YbU5PxH1JVntEgaTEANDtu2wTdU=", + "dev": true + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + } + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camel-case": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz", + "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==", + "dev": true, + "requires": { + "pascal-case": "^3.1.1", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + } + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + } + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001117", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001117.tgz", + "integrity": "sha512-4tY0Fatzdx59kYjQs+bNxUwZB03ZEBgVmJ1UkFPz/Q8OLiUUbjct2EdpnXj0fvFTPej2EkbPIG0w8BWsjAyk1Q==", + "dev": true + }, + "canonical-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", + "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", + "dev": true + }, + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "requires": { + "rsvp": "^4.8.4" + } + }, + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "check-types": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz", + "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==", + "dev": true + }, + "chevrotain": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-7.0.1.tgz", + "integrity": "sha512-B/44jrdw5GAzy483LEeVSgXSX0qOYM8lUd3l5+yf6Vl6OQjEUCm2BUiYbHRCIK6xCEvCLAFe1kj8uyV6+zdaVw==", + "dev": true, + "requires": { + "regexp-to-ast": "0.5.0" + } + }, + "chokidar": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + } + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.4.0.tgz", + "integrity": "sha512-sJAofoarcm76ZGpuooaO0eDy8saEy+YoZBLjC4h8srt4jeBnkYeOgqxgsJQTpyt2LjI5PTfLJHSL+41Yu4fEJA==", + "dev": true + }, + "cli-table": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", + "dev": true, + "requires": { + "colors": "1.0.3" + }, + "dependencies": { + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true + } + } + }, + "cli-truncate": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", + "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", + "dev": true, + "requires": { + "slice-ansi": "0.0.4", + "string-width": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "dev": true + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "codelyzer": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-5.2.2.tgz", + "integrity": "sha512-jB4FZ1Sx7kZhvZVdf+N2BaKTdrrNZOL0Bj10RRfrhHrb3zEvXjJvvq298JPMJAiyiCS/v4zs1QlGU0ip7xGqeA==", + "dev": true, + "requires": { + "app-root-path": "^2.2.1", + "aria-query": "^3.0.0", + "axobject-query": "2.0.2", + "css-selector-tokenizer": "^0.7.1", + "cssauron": "^1.4.0", + "damerau-levenshtein": "^1.0.4", + "semver-dsl": "^1.0.1", + "source-map": "^0.5.7", + "sprintf-js": "^1.1.2" + } + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", + "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", + "dev": true, + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "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==", + "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=" + }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colorette": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", + "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", + "dev": true + }, + "colornames": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz", + "integrity": "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y=", + "dev": true + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "colorspace": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", + "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", + "dev": true, + "requires": { + "color": "3.0.x", + "text-hex": "1.0.x" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "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=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "conf": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/conf/-/conf-6.2.4.tgz", + "integrity": "sha512-GjgyPRLo1qK1LR9RWAdUagqo+DP18f5HWCFk4va7GS+wpxQTOzfuKTwKOvGW2c01/YXNicAyyoyuSddmdkBzZQ==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "debounce-fn": "^3.0.1", + "dot-prop": "^5.0.0", + "env-paths": "^2.2.0", + "json-schema-typed": "^7.0.1", + "make-dir": "^3.0.0", + "onetime": "^5.1.0", + "pkg-up": "^3.0.1", + "semver": "^6.2.0", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "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==", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.0.2.tgz", + "integrity": "sha512-9Gm8X0c6eXlKnmltMPFCBeGOKjtcRIyTt4VaO3k1TkNgVTe5Ov2lYsYVuyLp0kp8DItO3apewflM+1GYgh6V2Q==", + "dev": true, + "requires": { + "cacache": "^15.0.4", + "fast-glob": "^3.2.2", + "find-cache-dir": "^3.3.1", + "glob-parent": "^5.1.1", + "globby": "^11.0.1", + "loader-utils": "^2.0.0", + "normalize-path": "^3.0.0", + "p-limit": "^2.3.0", + "schema-utils": "^2.7.0", + "serialize-javascript": "^3.1.0", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "cacache": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", + "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", + "dev": true, + "requires": { + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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" + } + }, + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "ssri": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", + "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "tar": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz", + "integrity": "sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + } + } + }, + "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==", + "dev": true + }, + "core-js-compat": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", + "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "dev": true, + "requires": { + "browserslist": "^4.8.5", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "dependencies": { + "parse-json": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz", + "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + } + } + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + } + }, + "css-loader": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz", + "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.32", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.0", + "semver": "^6.3.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + }, + "dependencies": { + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + } + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "css-selector-tokenizer": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", + "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2" + } + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "dev": true + }, + "cssauron": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", + "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", + "dev": true, + "requires": { + "through": "X.X.X" + } + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssnano": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", + "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "cssnano-preset-default": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "dev": true, + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "dev": true + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true + }, + "csso": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", + "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", + "dev": true, + "requires": { + "css-tree": "1.0.0-alpha.39" + }, + "dependencies": { + "css-tree": { + "version": "1.0.0-alpha.39", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", + "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", + "dev": true, + "requires": { + "mdn-data": "2.0.6", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", + "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "damerau-levenshtein": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", + "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==", + "dev": true + }, + "dargs": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-6.1.0.tgz", + "integrity": "sha512-5dVBvpBLBnPwSsYXqfybFyehMmC/EenKEcf23AhCTgTf48JFBbmJKqoZBsERDnjL0FyiVTYWdFsRfTLHxLyKdQ==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, + "date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", + "dev": true + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, + "debounce-fn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-3.0.1.tgz", + "integrity": "sha512-aBoJh5AhpqlRoHZjHmOzZlRx+wz2xVwGL9rjs+Kj0EWUrL4/h4K7OD176thl2Tdoqui/AaA4xhHrNArGLAaI3Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } + } + }, + "decimal.js": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.0.tgz", + "integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "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" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "dev": true, + "requires": { + "globby": "^6.1.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "p-map": "^1.1.1", + "pify": "^3.0.0", + "rimraf": "^2.2.8" + }, + "dependencies": { + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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" + } + } + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "dependency-graph": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz", + "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "dev-ip": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", + "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=", + "dev": true + }, + "dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "diagnostics": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", + "integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==", + "dev": true, + "requires": { + "colorspace": "1.1.x", + "enabled": "1.0.x", + "kuler": "1.0.x" + } + }, + "didyoumean": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.1.tgz", + "integrity": "sha1-6S7f2tplN9SE1zwBcv0eugxJdv8=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "diff-sequences": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", + "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + }, + "dependencies": { + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + } + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.0.1.tgz", + "integrity": "sha512-1Aj1Qy3YLbdslkI75QEOfdp9TkQ3o8LRISAzxOibjBs/xWwr1WxZFOQphFkZuepHFGo+kB8e5FVJSS0faAJ4Rw==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "entities": "^2.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "dev": true + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } + } + }, + "domhandler": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.0.0.tgz", + "integrity": "sha512-eKLdI5v9m67kbXQbJSNn1zjh0SDzvzWVWtX+qEI3eMjZw8daH9k8rlj1FZY9memPwjiskQFbe7vHVVJIAqoEhw==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1" + } + }, + "domutils": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.2.0.tgz", + "integrity": "sha512-0haAxVr1PR0SqYwCH7mxMpHZUwjih9oPPedqpR/KufsnxPyZ9dyVw1R5093qnJF3WXSbjBkdzRWLw/knJV/fAg==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0" + } + }, + "dot-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.3.tgz", + "integrity": "sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA==", + "dev": true, + "requires": { + "no-case": "^3.0.3", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + } + } + }, + "dot-prop": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "download-stats": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/download-stats/-/download-stats-0.3.4.tgz", + "integrity": "sha512-ic2BigbyUWx7/CBbsfGjf71zUNZB4edBGC3oRliSzsoNmvyVx3Ycfp1w3vp2Y78Ee0eIIkjIEO5KzW0zThDGaA==", + "dev": true, + "requires": { + "JSONStream": "^1.2.1", + "lazy-cache": "^2.0.1", + "moment": "^2.15.1" + } + }, + "drange": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/drange/-/drange-1.1.1.tgz", + "integrity": "sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==", + "dev": true + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "easy-extender": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", + "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, + "eazy-logger": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.0.2.tgz", + "integrity": "sha1-oyWqXlPROiIliJsqxBE7K5Y29Pw=", + "dev": true, + "requires": { + "tfunk": "^3.0.1" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "editions": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/editions/-/editions-2.3.1.tgz", + "integrity": "sha512-ptGvkwTvGdGfC0hfhKg0MT+TRLRKGtUiWGBInxOm5pz7ssADezahjCUaYuZ8Dr+C05FW0AECIIPt4WBxVINEhA==", + "dev": true, + "requires": { + "errlop": "^2.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "ejs": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.3.tgz", + "integrity": "sha512-wmtrUGyfSC23GC/B1SMv2ogAUgbQEtDmTIhfqielrG5ExIM9TP4UoYdi90jLF1aTcsWCJNEO0UrgKzP0y3nTSg==", + "dev": true, + "requires": { + "jake": "^10.6.1" + } + }, + "electron-to-chromium": { + "version": "1.3.542", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.542.tgz", + "integrity": "sha512-9Wm4o9h2CE/h4PDBkE5Ff2ha4frgltV/BgVCwFK8Tc9DKF19xJK85zA82JFah0/+oe8SU3rYRWtlYZH58pC6Ng==", + "dev": true + }, + "elegant-spinner": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", + "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", + "dev": true + }, + "elliptic": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "emittery": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.1.tgz", + "integrity": "sha512-d34LN4L6h18Bzz9xpoku2nPwKxCPlPMr3EEKTkoEBi+1/+b0lcRkRJ1UVyyZaKNeqGR3swcGl6s390DNO4YVgQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "enabled": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", + "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", + "dev": true, + "requires": { + "env-variable": "0.0.x" + } + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "requires": { + "iconv-lite": "^0.6.2" + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "engine.io": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", + "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.0", + "ws": "~3.3.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "engine.io-parser": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + } + } + }, + "engine.io-client": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.3.tgz", + "integrity": "sha512-0NGY+9hioejTEJCaSJZfWZLk4FPI9dN+1H1C4+wj2iuFba47UgZbJzfWs4aNFajnX/qAaYKbe2lLTfEEWzCmcw==", + "dev": true, + "requires": { + "component-emitter": "~1.3.0", + "component-inherit": "0.0.3", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~6.1.0", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + } + } + }, + "engine.io-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz", + "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "enhanced-resolve": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", + "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + } + }, + "entities": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", + "dev": true + }, + "env-paths": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", + "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", + "dev": true + }, + "env-variable": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.6.tgz", + "integrity": "sha512-bHz59NlBbtS0NhftmR8+ExBEekE7br0e01jw+kk0NDro7TtZzBYZ5ScGPs3OmwnpyfHTHOtr1Y6uedCdrIldtg==", + "dev": true + }, + "err-code": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", + "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", + "dev": true + }, + "errlop": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/errlop/-/errlop-2.2.0.tgz", + "integrity": "sha512-e64Qj9+4aZzjzzFpZC7p5kmm/ccCrbLhAJplhsDXQFs87XTsXwOpH4s1Io2s90Tau/8r2j9f4l/thhDevRjzxw==", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/error/-/error-7.2.1.tgz", + "integrity": "sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==", + "dev": true, + "requires": { + "string-template": "~0.2.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "error-stack-parser": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", + "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", + "dev": true, + "requires": { + "stackframe": "^1.1.1" + } + }, + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "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.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.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" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, + "escalade": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.2.tgz", + "integrity": "sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "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=" + }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "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" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "eslint-config-jhipster": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-jhipster/-/eslint-config-jhipster-0.0.1.tgz", + "integrity": "sha512-E9/05t3+6V2K9YrJwsLmrblGgYnYfw62o/ja+Hr9wz3+AX2nG6gtycMW7LrS4alFuar1SGhbAyT3orTR5ur9MQ==", + "dev": true + }, + "eslint-config-prettier": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz", + "integrity": "sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA==", + "dev": true, + "requires": { + "get-stdin": "^6.0.0" + } + }, + "eslint-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-4.0.2.tgz", + "integrity": "sha512-EDpXor6lsjtTzZpLUn7KmXs02+nIjGcgees9BYjNkWra3jVq5vVa8IoCKgzT2M7dNNeoMBtaSG83Bd40N3poLw==", + "dev": true, + "requires": { + "find-cache-dir": "^3.3.1", + "fs-extra": "^8.1.0", + "loader-utils": "^2.0.0", + "object-hash": "^2.0.3", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, + "eslint-scope": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", + "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "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 + }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", + "dev": true + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "exec-sh": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", + "dev": true + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "expect": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.4.2.tgz", + "integrity": "sha512-IlJ3X52Z0lDHm7gjEp+m76uX46ldH5VpqmU0006vqDju/285twh7zaWMRhs67VpQhBwjjMchk+p5aA0VkERCAA==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.4.2", + "jest-message-util": "^26.3.0", + "jest-regex-util": "^26.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "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.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "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.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "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 + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "faker": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/faker/-/faker-4.1.0.tgz", + "integrity": "sha1-HkW7vsxndLPBlfrSg1EJxtdIzD8=", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", + "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + }, + "dependencies": { + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fast-safe-stringify": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==", + "dev": true + }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, + "fastq": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", + "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "fecha": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.0.tgz", + "integrity": "sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg==", + "dev": true + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "file-loader": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.0.0.tgz", + "integrity": "sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^2.6.5" + } + }, + "filelist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.1.tgz", + "integrity": "sha512-8zSK6Nu0DQIC08mUC46sWGXi+q3GGpKydAG36k+JDba6VRpkevvOWUW5a/PhShij4+vHT9M+ghgG7eM+a9JDUQ==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "find-versions": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", + "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "dev": true, + "requires": { + "semver-regex": "^2.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "first-chunk-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", + "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "fn-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fn-name/-/fn-name-2.0.1.tgz", + "integrity": "sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc=", + "dev": true + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "dev": true, + "requires": { + "debug": "=3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "friendly-errors-webpack-plugin": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0.tgz", + "integrity": "sha512-K27M3VK30wVoOarP651zDmb93R9zF28usW4ocaK3mfQeIEI5BPht/EzZs5E8QLLwbLRJQMwscAjDxYPb1FuNiw==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "error-stack-parser": "^2.0.0", + "string-width": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-extra": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", + "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dev": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": 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 + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "g-status": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/g-status/-/g-status-2.0.2.tgz", + "integrity": "sha512-kQoE9qH+T1AHKgSSD0Hkv98bobE90ILQcXAF4wvGgsr7uFqNvwmh8j+Lq3l0RVt3E3HjSbv2B9biEGcEtpHLCA==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "matcher": "^1.0.0", + "simple-git": "^1.85.0" + }, + "dependencies": { + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + } + } + }, + "gauge": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", + "integrity": "sha1-6c7FSD09TuDvRLYKfZnkk14TbZM=", + "dev": true, + "requires": { + "ansi": "^0.3.0", + "has-unicode": "^2.0.0", + "lodash.pad": "^4.1.0", + "lodash.padend": "^4.1.0", + "lodash.padstart": "^4.1.0" + } + }, + "generator-jhipster": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/generator-jhipster/-/generator-jhipster-6.10.1.tgz", + "integrity": "sha512-a2MtlL//Ui/29F2Q4qgHp6qoXRr5vcqFwH4y5I5xDRHq3x1cHscZYedR79EV1oAwKzmFCqYpsWGoPAhFJlj0UA==", + "dev": true, + "requires": { + "aws-sdk": "2.706.0", + "axios": "0.19.2", + "chalk": "4.1.0", + "commander": "5.1.0", + "conf": "6.2.4", + "didyoumean": "1.2.1", + "ejs": "3.1.3", + "faker": "4.1.0", + "glob": "7.1.6", + "gulp-filter": "6.0.0", + "insight": "0.10.3", + "jhipster-core": "7.3.4", + "js-object-pretty-print": "0.3.0", + "js-yaml": "3.14.0", + "lodash": "4.17.15", + "meow": "6.1.0", + "mkdirp": "1.0.4", + "normalize-path": "3.0.0", + "ora": "4.0.4", + "os-locale": "5.0.0", + "parse-gitignore": "1.0.1", + "pluralize": "8.0.0", + "prettier": "2.0.5", + "prettier-plugin-java": "0.8.0", + "progress": "2.0.3", + "randexp": "0.5.3", + "semver": "7.3.2", + "shelljs": "0.8.4", + "sync-request": "6.1.0", + "tabtab": "2.2.2", + "test": "^0.6.0", + "through2": "3.0.2", + "uuid": "7.0.3", + "yeoman-environment": "2.10.3", + "yeoman-generator": "4.11.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "axios": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", + "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", + "dev": true, + "requires": { + "follow-redirects": "1.5.10" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", + "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "invert-kv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-3.0.1.tgz", + "integrity": "sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "lcid": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-3.1.1.tgz", + "integrity": "sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==", + "dev": true, + "requires": { + "invert-kv": "^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 + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "os-locale": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-5.0.0.tgz", + "integrity": "sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA==", + "dev": true, + "requires": { + "execa": "^4.0.0", + "lcid": "^3.0.0", + "mem": "^5.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + }, + "uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "genfun": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", + "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" + }, + "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==" + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=", + "dev": true + }, + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "gh-got": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/gh-got/-/gh-got-5.0.0.tgz", + "integrity": "sha1-7pW+NxBv2HSKlvjR20uuqJ4b+oo=", + "dev": true, + "requires": { + "got": "^6.2.0", + "is-plain-obj": "^1.1.0" + } + }, + "github-username": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/github-username/-/github-username-3.0.0.tgz", + "integrity": "sha1-CnciGbMTB0NCnyRW0L3T21Xc57E=", + "dev": true, + "requires": { + "gh-got": "^5.0.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "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" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + }, + "dependencies": { + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + } + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "grouped-queue": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grouped-queue/-/grouped-queue-1.1.0.tgz", + "integrity": "sha512-rZOFKfCqLhsu5VqjBjEWiwrYqJR07KxIkH4mLZlNlGDfntbb4FbMyGFP14TlvRPrU9S3Hnn/sgxbC5ZeN0no3Q==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "gulp-filter": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-6.0.0.tgz", + "integrity": "sha512-veQFW93kf6jBdWdF/RxMEIlDK2mkjHyPftM381DID2C9ImTVngwYpyyThxm4/EpgcNOT37BLefzMOjEKbyYg0Q==", + "dev": true, + "requires": { + "multimatch": "^4.0.0", + "plugin-error": "^1.0.1", + "streamfilter": "^3.0.0" + } + }, + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + } + } + }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "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-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "dev": true, + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "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 + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "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 + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "dev": true + }, + "hosted-git-info": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.5.tgz", + "integrity": "sha512-i4dpK6xj9BIpVOTboXIlKG9+8HMKggcrMX7WA24xZtKwX0TPelq/rbaS5rCKeNX8sJXZJGdSxpnEGtta+wismQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", + "dev": true + }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, + "html-entities": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", + "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "html-loader": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-1.1.0.tgz", + "integrity": "sha512-zwLbEgy+i7sgIYTlxI9M7jwkn29IvdsV6f1y7a2aLv/w8l1RigVk0PFijBZLLFsdi2gvL8sf2VJhTjLlfnK8sA==", + "dev": true, + "requires": { + "html-minifier-terser": "^5.0.5", + "htmlparser2": "^4.1.0", + "loader-utils": "^2.0.0", + "parse-srcset": "^1.0.2", + "schema-utils": "^2.6.5" + } + }, + "html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "dev": true, + "requires": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" + }, + "dependencies": { + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + } + } + }, + "html-webpack-plugin": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.3.0.tgz", + "integrity": "sha512-C0fzKN8yQoVLTelcJxZfJCE+aAvQiY2VUf3UuKrR4a9k5UMWYOtpDLsaXwATbcVCnI05hUS7L9ULQHWLZhyi3w==", + "dev": true, + "requires": { + "@types/html-minifier-terser": "^5.0.0", + "@types/tapable": "^1.0.5", + "@types/webpack": "^4.41.8", + "html-minifier-terser": "^5.0.1", + "loader-utils": "^1.2.3", + "lodash": "^4.17.15", + "pretty-error": "^2.1.1", + "tapable": "^1.1.3", + "util.promisify": "1.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "htmlparser2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz", + "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "domutils": "^2.0.0", + "entities": "^2.0.0" + } + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "dev": true, + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + } + } + }, + "http-proxy": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.15.2.tgz", + "integrity": "sha1-ZC/cr/5S00SNK9o7AHnpQJBk2jE=", + "dev": true, + "requires": { + "eventemitter3": "1.x.x", + "requires-port": "1.x.x" + } + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dev": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "dependencies": { + "eventemitter3": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.5.tgz", + "integrity": "sha512-QR0rh0YiPuxuDQ6+T9GAO/xWTExXpxIes1Nl9RykNGTnE1HJmkuEfxJH9cubjIOQZ/GH4qNBR4u8VSHaKiWs4g==", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + } + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "dev": true, + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.28", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.28.tgz", + "integrity": "sha512-dzjES1Egb4c1a89C7lKwQh8pwjYmlOAG9dW1pBgxEk57tMrLnssOfEthz8kdkNaBd7lIqQx7APm5+mZ619IiCQ==", + "dev": true + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.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" + } + } + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "husky": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.5.tgz", + "integrity": "sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "compare-versions": "^3.6.0", + "cosmiconfig": "^6.0.0", + "find-versions": "^3.2.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^4.2.0", + "please-upgrade-node": "^3.2.0", + "slash": "^3.0.0", + "which-pm-runs": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "iconv-lite": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=", + "dev": true + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "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==" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "insight": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/insight/-/insight-0.10.3.tgz", + "integrity": "sha512-YOncxSN6Omh+1Oqxt+OJAvJVMDKw7l6IEG0wT2cTMGxjsTcroOGW4IR926QDzxg/uZHcFZ2cZbckDWdZhc2pZw==", + "dev": true, + "requires": { + "async": "^2.6.2", + "chalk": "^2.4.2", + "conf": "^1.4.0", + "inquirer": "^6.3.1", + "lodash.debounce": "^4.0.8", + "os-name": "^3.1.0", + "request": "^2.88.0", + "tough-cookie": "^3.0.1", + "uuid": "^3.3.2" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "conf": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/conf/-/conf-1.4.0.tgz", + "integrity": "sha512-bzlVWS2THbMetHqXKB8ypsXN4DQ/1qopGwNJi1eYbpwesJcd86FBjFciCQX/YwAhp9bM7NVnPFqZ5LpV7gP0Dg==", + "dev": true, + "requires": { + "dot-prop": "^4.1.0", + "env-paths": "^1.0.0", + "make-dir": "^1.0.0", + "pkg-up": "^2.0.0", + "write-file-atomic": "^2.3.0" + } + }, + "dot-prop": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", + "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "env-paths": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz", + "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + } + }, + "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-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "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 + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "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" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + } + } + }, + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + } + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "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==", + "dev": true + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "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-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-docker": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", + "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-like": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "dev": true, + "requires": { + "lodash.isfinite": "^3.3.2" + } + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "is-observable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", + "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", + "dev": true, + "requires": { + "symbol-observable": "^1.1.0" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-potential-custom-element-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", + "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", + "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==", + "dev": true + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "dev": true + }, + "is-scoped": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-scoped/-/is-scoped-1.0.0.tgz", + "integrity": "sha1-RJypgpnnEwOCViieyytUDcQ3yzA=", + "dev": true, + "requires": { + "scoped-regex": "^1.0.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-svg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", + "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", + "dev": true, + "requires": { + "html-comment-regex": "^1.1.0" + } + }, + "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" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isbinaryfile": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz", + "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "istextorbinary": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.6.0.tgz", + "integrity": "sha512-+XRlFseT8B3L9KyjxxLjfXSLMuErKDsd8DBNrsaxoViABMEZlOSCstwmw0qpoFX3+U6yWU1yhLudAe6/lETGGA==", + "dev": true, + "requires": { + "binaryextensions": "^2.1.2", + "editions": "^2.2.0", + "textextensions": "^2.5.0" + } + }, + "jake": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", + "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", + "dev": true, + "requires": { + "async": "0.9.x", + "chalk": "^2.4.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "dev": true + } + } + }, + "java-parser": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/java-parser/-/java-parser-0.8.0.tgz", + "integrity": "sha512-8MOu9EDjWlAcBnxjVI8jblcOX/zJt9XVLaMLrXYvmJYk3gvRqTUKsEp/PxaooJQc6wh+nPEyqEbhCy3BWIgi0g==", + "dev": true, + "requires": { + "chevrotain": "6.5.0", + "lodash": "4.17.15" + }, + "dependencies": { + "chevrotain": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-6.5.0.tgz", + "integrity": "sha512-BwqQ/AgmKJ8jcMEjaSnfMybnKMgGTrtDKowfTP3pX4jwVy0kNjRsT/AP6h+wC3+3NC+X8X15VWBnTCQlX+wQFg==", + "dev": true, + "requires": { + "regexp-to-ast": "0.4.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "regexp-to-ast": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.4.0.tgz", + "integrity": "sha512-4qf/7IsIKfSNHQXSwial1IFmfM1Cc/whNBQqRwe0V2stPe7KmN1U0tWQiIx6JiirgSrisjE0eECdNf7Tav1Ntw==", + "dev": true + } + } + }, + "jest": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.1.0.tgz", + "integrity": "sha512-LIti8jppw5BcQvmNJe4w2g1N/3V68HUfAv9zDVm7v+VAtQulGhH0LnmmiVkbNE4M4I43Bj2fXPiBGKt26k9tHw==", + "dev": true, + "requires": { + "@jest/core": "^26.1.0", + "import-local": "^3.0.2", + "jest-cli": "^26.1.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-cli": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.4.2.tgz", + "integrity": "sha512-zb+lGd/SfrPvoRSC/0LWdaWCnscXc1mGYW//NP4/tmBvRPT3VntZ2jtKUONsRi59zc5JqmsSajA9ewJKFYp8Cw==", + "dev": true, + "requires": { + "@jest/core": "^26.4.2", + "@jest/test-result": "^26.3.0", + "@jest/types": "^26.3.0", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.4.2", + "jest-util": "^26.3.0", + "jest-validate": "^26.4.2", + "prompts": "^2.0.1", + "yargs": "^15.3.1" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + } + } + }, + "jest-changed-files": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.3.0.tgz", + "integrity": "sha512-1C4R4nijgPltX6fugKxM4oQ18zimS7LqQ+zTTY8lMCMFPrxqBFb7KJH0Z2fRQJvw2Slbaipsqq7s1mgX5Iot+g==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "execa": "^4.0.0", + "throat": "^5.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", + "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "jest-config": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.4.2.tgz", + "integrity": "sha512-QBf7YGLuToiM8PmTnJEdRxyYy3mHWLh24LJZKVdXZ2PNdizSe1B/E8bVm+HYcjbEzGuVXDv/di+EzdO/6Gq80A==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.4.2", + "@jest/types": "^26.3.0", + "babel-jest": "^26.3.0", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.3.0", + "jest-environment-node": "^26.3.0", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.4.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.4.0", + "jest-util": "^26.3.0", + "jest-validate": "^26.4.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.4.2" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "pretty-format": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.2.tgz", + "integrity": "sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-date-mock": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/jest-date-mock/-/jest-date-mock-1.0.8.tgz", + "integrity": "sha512-0Lyp+z9xvuNmLbK+5N6FOhSiBeux05Lp5bbveFBmYo40Aggl2wwxFoIrZ+rOWC8nDNcLeBoDd2miQdEDSf3iQw==", + "dev": true + }, + "jest-diff": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", + "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "diff-sequences": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-docblock": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.4.2.tgz", + "integrity": "sha512-p15rt8r8cUcRY0Mvo1fpkOGYm7iI8S6ySxgIdfh3oOIv+gHwrHTy5VWCGOecWUhDsit4Nz8avJWdT07WLpbwDA==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-util": "^26.3.0", + "pretty-format": "^26.4.2" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true + }, + "pretty-format": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.2.tgz", + "integrity": "sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-environment-jsdom": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.3.0.tgz", + "integrity": "sha512-zra8He2btIMJkAzvLaiZ9QwEPGEetbxqmjEBQwhH3CA+Hhhu0jSiEJxnJMbX28TGUvPLxBt/zyaTLrOPF4yMJA==", + "dev": true, + "requires": { + "@jest/environment": "^26.3.0", + "@jest/fake-timers": "^26.3.0", + "@jest/types": "^26.3.0", + "@types/node": "*", + "jest-mock": "^26.3.0", + "jest-util": "^26.3.0", + "jsdom": "^16.2.2" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-environment-node": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.3.0.tgz", + "integrity": "sha512-c9BvYoo+FGcMj5FunbBgtBnbR5qk3uky8PKyRVpSfe2/8+LrNQMiXX53z6q2kY+j15SkjQCOSL/6LHnCPLVHNw==", + "dev": true, + "requires": { + "@jest/environment": "^26.3.0", + "@jest/fake-timers": "^26.3.0", + "@jest/types": "^26.3.0", + "@types/node": "*", + "jest-mock": "^26.3.0", + "jest-util": "^26.3.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-get-type": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "dev": true + }, + "jest-haste-map": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.3.0.tgz", + "integrity": "sha512-DHWBpTJgJhLLGwE5Z1ZaqLTYqeODQIZpby0zMBsCU9iRFHYyhklYqP4EiG73j5dkbaAdSZhgB938mL51Q5LeZA==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.3.0", + "jest-util": "^26.3.0", + "jest-worker": "^26.3.0", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-jasmine2": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.4.2.tgz", + "integrity": "sha512-z7H4EpCldHN1J8fNgsja58QftxBSL+JcwZmaXIvV9WKIM+x49F4GLHu/+BQh2kzRKHAgaN/E82od+8rTOBPyPA==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.3.0", + "@jest/source-map": "^26.3.0", + "@jest/test-result": "^26.3.0", + "@jest/types": "^26.3.0", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.4.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.4.2", + "jest-matcher-utils": "^26.4.2", + "jest-message-util": "^26.3.0", + "jest-runtime": "^26.4.2", + "jest-snapshot": "^26.4.2", + "jest-util": "^26.3.0", + "pretty-format": "^26.4.2", + "throat": "^5.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "pretty-format": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.2.tgz", + "integrity": "sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-junit": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-11.0.1.tgz", + "integrity": "sha512-stgc0mBoiSg/F9qWd4KkmR3K7Nk2u+M/dc1oup7gxz9mrzGcEaU2YL9/0QscVqqg3IOaA1P5ZXtozG/XR6j6nw==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "strip-ansi": "^5.2.0", + "uuid": "^3.3.3", + "xml": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "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" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, + "jest-leak-detector": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.4.2.tgz", + "integrity": "sha512-akzGcxwxtE+9ZJZRW+M2o+nTNnmQZxrHJxX/HjgDaU5+PLmY1qnQPnMjgADPGCRPhB+Yawe1iij0REe+k/aHoA==", + "dev": true, + "requires": { + "jest-get-type": "^26.3.0", + "pretty-format": "^26.4.2" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true + }, + "pretty-format": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.2.tgz", + "integrity": "sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-matcher-utils": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.4.2.tgz", + "integrity": "sha512-KcbNqWfWUG24R7tu9WcAOKKdiXiXCbMvQYT6iodZ9k1f7065k0keUOW6XpJMMvah+hTfqkhJhRXmA3r3zMAg0Q==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^26.4.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.4.2" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "diff-sequences": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.3.0.tgz", + "integrity": "sha512-5j5vdRcw3CNctePNYN0Wy2e/JbWT6cAYnXv5OuqPhDpyCGc0uLu2TK0zOCJWNB9kOIfYMSpIulRaDgIi4HJ6Ig==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-diff": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.4.2.tgz", + "integrity": "sha512-6T1XQY8U28WH0Z5rGpQ+VqZSZz8EN8rZcBtfvXaOkbwxIEeRre6qnuZQlbY1AJ4MKDxQF8EkrCvK+hL/VkyYLQ==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^26.3.0", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.4.2" + } + }, + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true + }, + "pretty-format": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.2.tgz", + "integrity": "sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-message-util": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.3.0.tgz", + "integrity": "sha512-xIavRYqr4/otGOiLxLZGj3ieMmjcNE73Ui+LdSW/Y790j5acqCsAdDiLIbzHCZMpN07JOENRWX5DcU+OQ+TjTA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.3.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-mock": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.3.0.tgz", + "integrity": "sha512-PeaRrg8Dc6mnS35gOo/CbZovoDPKAeB1FICZiuagAgGvbWdNNyjQjkOaGUa/3N3JtpQ/Mh9P4A2D4Fv51NnP8Q==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "@types/node": "*" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true + }, + "jest-preset-angular": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/jest-preset-angular/-/jest-preset-angular-8.2.1.tgz", + "integrity": "sha512-6t7lavnIHnZWz6a03jpZ5L7phMefi6SoBIRZ/GQdyML8YgwMtbJszbhUE+dh5lzmeNbd6AJ1gfleetGy2Rg4cQ==", + "dev": true, + "requires": { + "pretty-format": "^26.0.0", + "ts-jest": "^26.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "pretty-format": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.2.tgz", + "integrity": "sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "dev": true + }, + "jest-resolve": { + "version": "26.4.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.4.0.tgz", + "integrity": "sha512-bn/JoZTEXRSlEx3+SfgZcJAVuTMOksYq9xe9O6s4Ekg84aKBObEaVXKOEilULRqviSLAYJldnoWV9c07kwtiCg==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.3.0", + "read-pkg-up": "^7.0.1", + "resolve": "^1.17.0", + "slash": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "parse-json": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz", + "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "jest-resolve-dependencies": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.4.2.tgz", + "integrity": "sha512-ADHaOwqEcVc71uTfySzSowA/RdxUpCxhxa2FNLiin9vWLB1uLPad3we+JSSROq5+SrL9iYPdZZF8bdKM7XABTQ==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.4.2" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-runner": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.4.2.tgz", + "integrity": "sha512-FgjDHeVknDjw1gRAYaoUoShe1K3XUuFMkIaXbdhEys+1O4bEJS8Avmn4lBwoMfL8O5oFTdWYKcf3tEJyyYyk8g==", + "dev": true, + "requires": { + "@jest/console": "^26.3.0", + "@jest/environment": "^26.3.0", + "@jest/test-result": "^26.3.0", + "@jest/types": "^26.3.0", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.7.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.4.2", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.3.0", + "jest-leak-detector": "^26.4.2", + "jest-message-util": "^26.3.0", + "jest-resolve": "^26.4.0", + "jest-runtime": "^26.4.2", + "jest-util": "^26.3.0", + "jest-worker": "^26.3.0", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-runtime": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.4.2.tgz", + "integrity": "sha512-4Pe7Uk5a80FnbHwSOk7ojNCJvz3Ks2CNQWT5Z7MJo4tX0jb3V/LThKvD9tKPNVNyeMH98J/nzGlcwc00R2dSHQ==", + "dev": true, + "requires": { + "@jest/console": "^26.3.0", + "@jest/environment": "^26.3.0", + "@jest/fake-timers": "^26.3.0", + "@jest/globals": "^26.4.2", + "@jest/source-map": "^26.3.0", + "@jest/test-result": "^26.3.0", + "@jest/transform": "^26.3.0", + "@jest/types": "^26.3.0", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^26.4.2", + "jest-haste-map": "^26.3.0", + "jest-message-util": "^26.3.0", + "jest-mock": "^26.3.0", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.4.0", + "jest-snapshot": "^26.4.2", + "jest-util": "^26.3.0", + "jest-validate": "^26.4.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.3.1" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + } + } + }, + "jest-serializer": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.3.0.tgz", + "integrity": "sha512-IDRBQBLPlKa4flg77fqg0n/pH87tcRKwe8zxOVTWISxGpPHYkRZ1dXKyh04JOja7gppc60+soKVZ791mruVdow==", + "dev": true, + "requires": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + } + }, + "jest-snapshot": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.4.2.tgz", + "integrity": "sha512-N6Uub8FccKlf5SBFnL2Ri/xofbaA68Cc3MGjP/NuwgnsvWh+9hLIR/DhrxbSiKXMY9vUW5dI6EW1eHaDHqe9sg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^26.3.0", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.4.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.4.2", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.3.0", + "jest-matcher-utils": "^26.4.2", + "jest-message-util": "^26.3.0", + "jest-resolve": "^26.4.0", + "natural-compare": "^1.4.0", + "pretty-format": "^26.4.2", + "semver": "^7.3.2" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "diff-sequences": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.3.0.tgz", + "integrity": "sha512-5j5vdRcw3CNctePNYN0Wy2e/JbWT6cAYnXv5OuqPhDpyCGc0uLu2TK0zOCJWNB9kOIfYMSpIulRaDgIi4HJ6Ig==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-diff": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.4.2.tgz", + "integrity": "sha512-6T1XQY8U28WH0Z5rGpQ+VqZSZz8EN8rZcBtfvXaOkbwxIEeRre6qnuZQlbY1AJ4MKDxQF8EkrCvK+hL/VkyYLQ==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^26.3.0", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.4.2" + } + }, + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true + }, + "pretty-format": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.2.tgz", + "integrity": "sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-sonar-reporter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jest-sonar-reporter/-/jest-sonar-reporter-2.0.0.tgz", + "integrity": "sha512-ZervDCgEX5gdUbdtWsjdipLN3bKJwpxbvhkYNXTAYvAckCihobSLr9OT/IuyNIRT1EZMDDwR6DroWtrq+IL64w==", + "dev": true, + "requires": { + "xml": "^1.0.1" + } + }, + "jest-util": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.3.0.tgz", + "integrity": "sha512-4zpn6bwV0+AMFN0IYhH/wnzIQzRaYVrz1A8sYnRnj4UXDXbOVtWmlaZkO9mipFqZ13okIfN87aDoJWB7VH6hcw==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-validate": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.4.2.tgz", + "integrity": "sha512-blft+xDX7XXghfhY0mrsBCYhX365n8K5wNDC4XAcNKqqjEzsRUSXP44m6PL0QJEW2crxQFLLztVnJ4j7oPlQrQ==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.4.2" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "camelcase": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", + "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", + "dev": true + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true + }, + "pretty-format": { + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.2.tgz", + "integrity": "sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA==", + "dev": true, + "requires": { + "@jest/types": "^26.3.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-watcher": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.3.0.tgz", + "integrity": "sha512-XnLdKmyCGJ3VoF6G/p5ohbJ04q/vv5aH9ENI+i6BL0uu9WWB6Z7Z2lhQQk0d2AVZcRGp1yW+/TsoToMhBFPRdQ==", + "dev": true, + "requires": { + "@jest/test-result": "^26.3.0", + "@jest/types": "^26.3.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.3.0", + "string-length": "^4.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-worker": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.3.0.tgz", + "integrity": "sha512-Vmpn2F6IASefL+DVBhPzI2J9/GJUsqzomdeN+P+dK8/jKxbh8R3BtFnx3FIta7wYlPU62cpJMJQo4kuOowcMnw==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jhipster-core": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/jhipster-core/-/jhipster-core-7.3.4.tgz", + "integrity": "sha512-AUhT69kNkqppaJZVfan/xnKG4Gs9Ggj7YLtTZFVe+xg+THrbMb5Ng7PL07PDlDw4KAEA33GMCwuAf65E8EpC4g==", + "dev": true, + "requires": { + "chevrotain": "7.0.1", + "fs-extra": "8.1.0", + "lodash": "4.17.15", + "winston": "3.2.1" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } + } + }, + "jmespath": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", + "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", + "dev": true + }, + "js-object-pretty-print": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/js-object-pretty-print/-/js-object-pretty-print-0.3.0.tgz", + "integrity": "sha1-RnDkUAZu4ezPNRdMfRl/WqOLz3Q=", + "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==" + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdom": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", + "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "acorn": "^7.1.1", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.2.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.0", + "domexception": "^2.0.1", + "escodegen": "^1.14.1", + "html-encoding-sniffer": "^2.0.1", + "is-potential-custom-element-name": "^1.0.0", + "nwsapi": "^2.2.0", + "parse5": "5.1.1", + "request": "^2.88.2", + "request-promise-native": "^1.0.8", + "saxes": "^5.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0", + "ws": "^7.2.3", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "ws": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", + "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==", + "dev": true + } + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.0.tgz", + "integrity": "sha512-o3aP+RsWDJZayj1SbHNQAI8x0v3T3SKiGoZlNYfbUP1S3omJQ6i9CnqADqkSPaOAxwua4/1YWx5CM7oiChJt2Q==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-schema-typed": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", + "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "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 + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "requires": { + "minimist": "^1.2.5" + } + }, + "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" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "kuler": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz", + "integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==", + "dev": true, + "requires": { + "colornames": "^1.1.1" + } + }, + "last-call-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", + "dev": true, + "requires": { + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "dev": true, + "requires": { + "set-getter": "^0.1.0" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levenary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", + "dev": true, + "requires": { + "leven": "^3.1.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", + "dev": true + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "lint-staged": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-8.2.1.tgz", + "integrity": "sha512-n0tDGR/rTCgQNwXnUf/eWIpPNddGWxC32ANTNYsj2k02iZb7Cz5ox2tytwBu+2r0zDXMEMKw7Y9OD/qsav561A==", + "dev": true, + "requires": { + "chalk": "^2.3.1", + "commander": "^2.14.1", + "cosmiconfig": "^5.2.0", + "debug": "^3.1.0", + "dedent": "^0.7.0", + "del": "^3.0.0", + "execa": "^1.0.0", + "g-status": "^2.0.2", + "is-glob": "^4.0.0", + "is-windows": "^1.0.2", + "listr": "^0.14.2", + "listr-update-renderer": "^0.5.0", + "lodash": "^4.17.11", + "log-symbols": "^2.2.0", + "micromatch": "^3.1.8", + "npm-which": "^3.0.1", + "p-map": "^1.1.1", + "path-is-inside": "^1.0.2", + "pify": "^3.0.0", + "please-upgrade-node": "^3.0.2", + "staged-git-files": "1.1.2", + "string-argv": "^0.0.2", + "stringify-object": "^3.2.2", + "yup": "^0.27.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "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" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "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" + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "listr": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", + "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", + "dev": true, + "requires": { + "@samverschueren/stream-to-observable": "^0.3.0", + "is-observable": "^1.1.0", + "is-promise": "^2.1.0", + "is-stream": "^1.1.0", + "listr-silent-renderer": "^1.1.1", + "listr-update-renderer": "^0.5.0", + "listr-verbose-renderer": "^0.5.0", + "p-map": "^2.0.0", + "rxjs": "^6.3.3" + }, + "dependencies": { + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + } + } + }, + "listr-silent-renderer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", + "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", + "dev": true + }, + "listr-update-renderer": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz", + "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "elegant-spinner": "^1.0.1", + "figures": "^1.7.0", + "indent-string": "^3.0.0", + "log-symbols": "^1.0.2", + "log-update": "^2.3.0", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "^1.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "listr-verbose-renderer": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", + "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "cli-cursor": "^2.1.0", + "date-fns": "^1.27.2", + "figures": "^2.0.0" + }, + "dependencies": { + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + } + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "localtunnel": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-1.9.2.tgz", + "integrity": "sha512-NEKF7bDJE9U3xzJu3kbayF0WTvng6Pww7tzqNb/XtEARYwqw7CKEX7BvOMg98FtE9es2CRizl61gkV3hS8dqYg==", + "dev": true, + "requires": { + "axios": "0.19.0", + "debug": "4.1.1", + "openurl": "1.1.1", + "yargs": "6.6.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^4.2.0" + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" + } + } + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", + "dev": true + }, + "lodash.isfinite": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", + "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.pad": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", + "integrity": "sha1-QzCUmoM6fI2iLMIPaibE1Z3runA=", + "dev": true + }, + "lodash.padend": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", + "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=", + "dev": true + }, + "lodash.padstart": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", + "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2" + } + }, + "log-update": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", + "integrity": "sha1-iDKP19HOeTiykoN0bwsbwSayRwg=", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "cli-cursor": "^2.0.0", + "wrap-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "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 + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "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": "3.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", + "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0" + } + } + } + }, + "logform": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", + "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", + "dev": true, + "requires": { + "colors": "^1.2.1", + "fast-safe-stringify": "^2.0.4", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "triple-beam": "^1.3.0" + } + }, + "loglevel": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz", + "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==", + "dev": true + }, + "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" + } + }, + "lower-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", + "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", + "dev": true, + "requires": { + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + } + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "macos-release": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.4.1.tgz", + "integrity": "sha512-H/QHeBIN1fIGJX517pvK8IEK53yQOW7YcEI55oYtgjDdoCQQz7eJS94qt5kNrscReEyuD/JcdFCm2XBEcGOITg==", + "dev": true + }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "make-fetch-happen": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", + "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", + "dev": true, + "requires": { + "agentkeepalive": "^3.4.1", + "cacache": "^12.0.0", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", + "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "matcher": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-1.1.1.tgz", + "integrity": "sha512-+BmqxWIubKTRKNWx/ahnCkk3mG8m7OturVlqq6HiojGJTd5hVYbgZm6WzcYPCoB+KBT4Vd6R7WSRG2OADNaCjg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.4" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/mem/-/mem-5.1.1.tgz", + "integrity": "sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^2.1.0", + "p-is-promise": "^2.1.0" + } + }, + "mem-fs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mem-fs/-/mem-fs-1.2.0.tgz", + "integrity": "sha512-b8g0jWKdl8pM0LqAPdK9i8ERL7nYrzmJfRhxMiWH2uYdfYnb7uXnmwVb0ZGe7xyEl4lj+nLIU3yf4zPUT+XsVQ==", + "dev": true, + "requires": { + "through2": "^3.0.0", + "vinyl": "^2.0.1", + "vinyl-file": "^3.0.0" + }, + "dependencies": { + "through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + } + } + }, + "mem-fs-editor": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/mem-fs-editor/-/mem-fs-editor-6.0.0.tgz", + "integrity": "sha512-e0WfJAMm8Gv1mP5fEq/Blzy6Lt1VbLg7gNnZmZak7nhrBTibs+c6nQ4SKs/ZyJYHS1mFgDJeopsLAv7Ow0FMFg==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "deep-extend": "^0.6.0", + "ejs": "^2.6.1", + "glob": "^7.1.4", + "globby": "^9.2.0", + "isbinaryfile": "^4.0.0", + "mkdirp": "^0.5.0", + "multimatch": "^4.0.0", + "rimraf": "^2.6.3", + "through2": "^3.0.1", + "vinyl": "^2.2.0" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", + "dev": true + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + } + } + }, + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "meow": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-6.1.0.tgz", + "integrity": "sha512-iIAoeI01v6pmSfObAAWFoITAA4GgiT45m4SmJgoxtZfvI0fyZwhV4d0lTwiUXvAKIPlma05Feb2Xngl52Mj5Cg==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.1.1", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.0.0", + "minimist-options": "^4.0.1", + "normalize-package-data": "^2.5.0", + "read-pkg-up": "^7.0.0", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.8.1", + "yargs-parser": "^18.1.1" + }, + "dependencies": { + "parse-json": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz", + "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-jsons-webpack-plugin": { + "version": "1.0.21", + "resolved": "https://registry.npmjs.org/merge-jsons-webpack-plugin/-/merge-jsons-webpack-plugin-1.0.21.tgz", + "integrity": "sha512-5Brw0DBi7tF48gm3BB21hu3qYWUMHuKWHKNqdZYmGTQlZQFTc63VFY/5LgonqusI/b0uvvjkpTdx1WrjInXreQ==", + "dev": true, + "requires": { + "es6-promise": "4.0.5", + "glob": "7.1.1" + }, + "dependencies": { + "es6-promise": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.0.5.tgz", + "integrity": "sha1-eILzCt3lskDM+n99eMVIMwlRrkI=", + "dev": true + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "mime-db": "1.44.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", + "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "dependencies": { + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + } + } + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + }, + "dependencies": { + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dev": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mitt": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", + "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", + "dev": true + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "moment": { + "version": "2.27.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz", + "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==" + }, + "moment-locales-webpack-plugin": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/moment-locales-webpack-plugin/-/moment-locales-webpack-plugin-1.2.0.tgz", + "integrity": "sha512-QAi5v0OlPUP7GXviKMtxnpBAo8WmTHrUNN7iciAhNOEAd9evCOvuN0g1N7ThIg3q11GLCkjY1zQ2saRcf/43nQ==", + "dev": true, + "requires": { + "lodash.difference": "^4.5.0" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "multimatch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-4.0.0.tgz", + "integrity": "sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==", + "dev": true, + "requires": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + } + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "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==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "ng-jhipster": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/ng-jhipster/-/ng-jhipster-0.14.0.tgz", + "integrity": "sha512-f6S8gkGLVOLYcODykhhgGkqY3zTO/VIc2oavvkN8pg7BAqIwj7gkLjrPnYTF4IDH9taSDkkD+Oizp4XLPEEc4A==", + "requires": { + "tslib": "^2.0.0" + } + }, + "ngx-cookie-service": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-3.0.4.tgz", + "integrity": "sha512-g4KHpCWL2EtKatWqn8lz/DdyMQO8sDS7BNwCSvxF1ETTW5DPJnbdEwCjSdm84MmfqBh6JdgvoQd//rOxH5EbgQ==" + }, + "ngx-infinite-scroll": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/ngx-infinite-scroll/-/ngx-infinite-scroll-9.0.0.tgz", + "integrity": "sha512-C8JhvrTip/AKv6f8oiB+GJjW+FGE3EPIc3Kk+v3MICGlW0nkOetyJDe/ejXr8tI8zwbNjbfvAKFRKenibDIW6w==", + "requires": { + "@scarf/scarf": "0.1.5", + "opencollective-postinstall": "^2.0.2" + } + }, + "ngx-webstorage": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ngx-webstorage/-/ngx-webstorage-5.0.0.tgz", + "integrity": "sha512-m96dBjUgLCpaknLRKfsJMEik393xrSX0EwO3paNSkS5d+xj2/cAendE3NwJeKY/W1D9EkKAhCvSUDX9/bAwCUg==" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "no-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", + "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", + "dev": true, + "requires": { + "lower-case": "^2.0.1", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + } + } + }, + "node-fetch-npm": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz", + "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==", + "dev": true, + "requires": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + } + }, + "node-forge": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", + "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "events": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + } + } + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, + "node-notifier": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.0.tgz", + "integrity": "sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA==", + "dev": true, + "optional": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true, + "optional": true + }, + "uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==", + "dev": true, + "optional": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "optional": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "node-releases": { + "version": "1.1.60", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz", + "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "npm-api": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/npm-api/-/npm-api-1.0.0.tgz", + "integrity": "sha512-gtJhIhGq07g9H5sIAB9TZzTySW8MYtcYqg+e+J+5q1GmDsDLLVfyvVBL1VklzjtRsElph11GUtLBS191RDOJxQ==", + "dev": true, + "requires": { + "JSONStream": "^1.3.5", + "clone-deep": "^4.0.1", + "download-stats": "^0.3.4", + "moment": "^2.24.0", + "paged-request": "^2.0.1", + "request": "^2.88.0" + } + }, + "npm-bundled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "dev": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-install-checks": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", + "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", + "dev": true, + "requires": { + "semver": "^7.1.1" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, + "npm-package-arg": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.0.1.tgz", + "integrity": "sha512-/h5Fm6a/exByzFSTm7jAyHbgOqErl9qSNJDQF32Si/ZzgwT2TERVxRxn3Jurw1wflgyVVAxnFR4fRHPM7y1ClQ==", + "dev": true, + "requires": { + "hosted-git-info": "^3.0.2", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } + } + }, + "npm-packlist": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "dev": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-path": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/npm-path/-/npm-path-2.0.4.tgz", + "integrity": "sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw==", + "dev": true, + "requires": { + "which": "^1.2.10" + } + }, + "npm-pick-manifest": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.0.tgz", + "integrity": "sha512-ygs4k6f54ZxJXrzT0x34NybRlLeZ4+6nECAIbr2i0foTnijtS1TJiyzpqtuUAJOps/hO0tNDr8fRV5g+BtRlTw==", + "dev": true, + "requires": { + "npm-install-checks": "^4.0.0", + "npm-package-arg": "^8.0.0", + "semver": "^7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } + } + }, + "npm-registry-fetch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.7.tgz", + "integrity": "sha512-cny9v0+Mq6Tjz+e0erFAB+RYJ/AVGzkjnISiobqP8OWj9c9FLoZZu8/SPSKJWE17F1tk4018wfjV+ZbIbqC7fQ==", + "dev": true, + "requires": { + "JSONStream": "^1.3.4", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "npm-package-arg": "^6.1.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "npm-package-arg": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", + "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", + "dev": true, + "requires": { + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "npm-which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-which/-/npm-which-3.0.1.tgz", + "integrity": "sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo=", + "dev": true, + "requires": { + "commander": "^2.9.0", + "npm-path": "^2.0.2", + "which": "^1.2.10" + } + }, + "npmlog": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-2.0.4.tgz", + "integrity": "sha1-mLUlMPJRTKkNCexbIsiEZyI3VpI=", + "dev": true, + "requires": { + "ansi": "~0.3.1", + "are-we-there-yet": "~1.1.2", + "gauge": "~1.2.5" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "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-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-hash": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz", + "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==", + "dev": true + }, + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true + }, + "object-is": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", + "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "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-path": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.9.2.tgz", + "integrity": "sha1-D9mnT8X60a45aLWGvaXGMr1sBaU=", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "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" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "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==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "one-time": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", + "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=", + "dev": true + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/open/-/open-7.0.4.tgz", + "integrity": "sha512-brSA+/yq+b08Hsr4c8fsEW2CRzk1BmfN3SAK/5VCHQ9bdoZJ4qa/+AfR0xHjlbbZUyPkUHs1b8x1RqdyZdkVqQ==", + "dev": true, + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + }, + "opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==" + }, + "opener": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", + "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", + "dev": true + }, + "openurl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", + "integrity": "sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=", + "dev": true + }, + "opn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + }, + "dependencies": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + } + } + }, + "optimize-css-assets-webpack-plugin": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz", + "integrity": "sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==", + "dev": true, + "requires": { + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^3.0.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "ora": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.4.tgz", + "integrity": "sha512-77iGeVU1cIdRhgFzCK8aw1fbtT1B/iZAvWjS+l/o1x0RShMgxHUZaD2yDpWsNCPwXg9z1ZA78Kbdvr8kBmG/Ww==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.2.0", + "is-interactive": "^1.0.0", + "log-symbols": "^3.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "os-name": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", + "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==", + "dev": true, + "requires": { + "macos-release": "^2.2.0", + "windows-release": "^3.1.0" + } + }, + "os-shim": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", + "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-each-series": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", + "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "requires": { + "retry": "^0.12.0" + }, + "dependencies": { + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + } + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "pacote": { + "version": "9.5.12", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.12.tgz", + "integrity": "sha512-BUIj/4kKbwWg4RtnBncXPJd15piFSVNpTzY0rysSr3VnMowTYgkGKcaHrbReepAkjTr8lH2CVWRi58Spg2CicQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "cacache": "^12.0.2", + "chownr": "^1.1.2", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "minimatch": "^3.0.4", + "minipass": "^2.3.5", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-normalize-package-bin": "^1.0.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^3.0.0", + "npm-registry-fetch": "^4.0.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.1", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.6.0", + "ssri": "^6.0.1", + "tar": "^4.4.10", + "unique-filename": "^1.1.1", + "which": "^1.3.1" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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" + } + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "npm-package-arg": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", + "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", + "dev": true, + "requires": { + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-pick-manifest": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", + "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "paged-request": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/paged-request/-/paged-request-2.0.1.tgz", + "integrity": "sha512-C0bB/PFk9rQskD1YEiz7uuchzqKDQGgdsEHN1ahify0UUWzgmMK4NDG9fhlQg2waogmNFwEvEeHfMRvJySpdVw==", + "dev": true, + "requires": { + "axios": "^0.18.0" + }, + "dependencies": { + "axios": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz", + "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==", + "dev": true, + "requires": { + "follow-redirects": "1.5.10", + "is-buffer": "^2.0.2" + } + }, + "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 + } + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "param-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.3.tgz", + "integrity": "sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA==", + "dev": true, + "requires": { + "dot-case": "^3.0.3", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + } + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104=", + "dev": true + }, + "parse-gitignore": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-gitignore/-/parse-gitignore-1.0.1.tgz", + "integrity": "sha512-UGyowyjtx26n65kdAMWhm6/3uy5uSrpcuH7tt+QEVudiBoVS+eqHxD5kbi9oWVRwj7sCzXqwuM+rUGw7earl6A==", + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parse-srcset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", + "integrity": "sha1-8r0iH2zJcKk42IVWq8WJyqqiveE=", + "dev": true + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascal-case": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz", + "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==", + "dev": true, + "requires": { + "no-case": "^3.0.3", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + } + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "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=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "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=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pbkdf2": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-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" + } + }, + "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 + } + } + }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + }, + "dependencies": { + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "requires": { + "ansi-wrap": "^0.1.0" + } + } + } + }, + "pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true + }, + "portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "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" + } + } + } + }, + "portscanner": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.1.1.tgz", + "integrity": "sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=", + "dev": true, + "requires": { + "async": "1.5.2", + "is-number-like": "^1.0.3" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-calc": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.3.tgz", + "integrity": "sha512-IB/EAEmZhIMEIhG7Ov4x+l47UaXOS1n2f4FBUk/aKllQhtSCxWhTzn0nJgkqN7fo/jcWySvWTSB6Syk9L+31bA==", + "dev": true, + "requires": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-load-config": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", + "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dev": true, + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", + "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "dev": true, + "requires": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "dev": true, + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dev": true, + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dev": true, + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-svgo": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", + "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "dev": true, + "requires": { + "is-svg": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "prettier": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz", + "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==", + "dev": true + }, + "prettier-plugin-java": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/prettier-plugin-java/-/prettier-plugin-java-0.8.0.tgz", + "integrity": "sha512-+4qdhUfFQIj4bLGSDrAGmUZKXQRjJYpQFbmRh04atEZe7QEZUF6NHVyRjJ73Cgwhc5NaiyIpFhtcXgLf9J9V6A==", + "dev": true, + "requires": { + "java-parser": "^0.8.0", + "lodash": "4.17.15", + "prettier": "2.0.4" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "prettier": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.4.tgz", + "integrity": "sha512-SVJIQ51spzFDvh4fIbCLvciiDMCrRhlN3mbZvv/+ycjvmF5E73bKdGfU8QDLNmjYJf+lsGnDBC4UUnvTe5OO0w==", + "dev": true + } + } + }, + "pretty-bytes": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz", + "integrity": "sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==", + "dev": true + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, + "requires": { + "renderkid": "^2.0.1", + "utila": "~0.4" + } + }, + "pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "promise": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", + "dev": true, + "requires": { + "asap": "~2.0.6" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "promise-retry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", + "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", + "dev": true, + "requires": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + } + }, + "prompts": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", + "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.4" + } + }, + "property-expr": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-1.5.1.tgz", + "integrity": "sha512-CGuc0VUTGthpJXL36ydB6jnbyOf/rAHFvmVrJlH+Rg0DqqLFQGAP6hIaxD/G0OAmBJPhXDHuEJigrp0e0wFV6g==", + "dev": true + }, + "protoduck": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", + "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", + "dev": true, + "requires": { + "genfun": "^5.0.0" + } + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true + }, + "randexp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.5.3.tgz", + "integrity": "sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==", + "dev": true, + "requires": { + "drange": "^1.0.2", + "ret": "^0.2.0" + }, + "dependencies": { + "ret": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", + "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==", + "dev": true + } + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", + "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.3", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "read-chunk": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-3.2.0.tgz", + "integrity": "sha512-CEjy9LCzhmD7nUpJ1oVOE6s/hBkejlcJEgLQHVnQznOSilOPb+kpKktlLfFDK3/WP43+F80xkUTM2VOkYoSYvQ==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "with-open-file": "^0.1.6" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "read-package-json": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz", + "integrity": "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==", + "dev": true, + "requires": { + "glob": "^7.1.1", + "json-parse-even-better-errors": "^2.3.0", + "normalize-package-data": "^2.0.0", + "npm-normalize-package-bin": "^1.0.0" + } + }, + "read-package-tree": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz", + "integrity": "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==", + "dev": true, + "requires": { + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "util-promisify": "^2.1.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdir-scoped-modules": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", + "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, + "regenerate": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", + "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp-to-ast": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", + "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==", + "dev": true + }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "regexpu-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "renderkid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", + "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", + "dev": true, + "requires": { + "css-select": "^1.1.0", + "dom-converter": "^0.2", + "htmlparser2": "^3.3.0", + "strip-ansi": "^3.0.0", + "utila": "^0.4.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "dev": true + }, + "entities": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, + "request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "requires": { + "lodash": "^4.17.19" + } + }, + "request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "dev": true, + "requires": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "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==" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "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" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "dependencies": { + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + } + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "resp-modifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", + "integrity": "sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=", + "dev": true, + "requires": { + "debug": "^2.2.0", + "minimatch": "^3.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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" + } + } + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rollup": { + "version": "1.32.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz", + "integrity": "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/node": "*", + "acorn": "^7.1.0" + } + }, + "rollup-plugin-babel": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz", + "integrity": "sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "rollup-pluginutils": "^2.8.1" + } + }, + "rollup-plugin-terser": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.0.tgz", + "integrity": "sha512-XGMJihTIO3eIBsVGq7jiNYOdDMb3pVxuzY0uhOE/FM4x/u9nQgr3+McsjzqBn3QfHIpNSZmFnpoKAwHBEcsT7g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "jest-worker": "^24.9.0", + "rollup-pluginutils": "^2.8.2", + "serialize-javascript": "^2.1.2", + "terser": "^4.6.2" + }, + "dependencies": { + "jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + } + }, + "serialize-javascript": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", + "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "requires": { + "estree-walker": "^0.6.1" + }, + "dependencies": { + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + } + } + }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", + "dev": true + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", + "dev": true + }, + "rxjs": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } + } + }, + "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==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "dev": true, + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "sass": { + "version": "1.26.9", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.9.tgz", + "integrity": "sha512-t8AkRVi+xvba4yZiLWkJdgJHBFCB3Dh4johniQkPy9ywkgFHNasXFEFP+RG/F6LhQ+aoE4aX+IorIWQjS0esVw==", + "dev": true, + "requires": { + "chokidar": ">=2.0.0 <4.0.0" + } + }, + "sass-loader": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", + "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "loader-utils": "^1.2.3", + "neo-async": "^2.6.1", + "schema-utils": "^2.6.1", + "semver": "^6.3.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", + "dev": true + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, + "schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + } + }, + "scoped-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/scoped-regex/-/scoped-regex-1.0.0.tgz", + "integrity": "sha1-o0a7Gs1CB65wvXwMfKnlZra63bg=", + "dev": true + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", + "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", + "dev": true, + "requires": { + "node-forge": "0.9.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "semver-dsl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", + "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "semver-intersect": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz", + "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==", + "dev": true, + "requires": { + "semver": "^5.0.0" + } + }, + "semver-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", + "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", + "dev": true + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "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": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "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=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", + "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "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=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + } + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=", + "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=" + }, + "set-getter": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", + "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", + "dev": true, + "requires": { + "to-object-path": "^0.3.0" + } + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "simple-git": { + "version": "1.132.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.132.0.tgz", + "integrity": "sha512-xauHm1YqCTom1sC9eOjfq3/9RKiUA9iPnxBbrY2DdL8l4ADMu0jjM5l5lphQP5YWNqAL2aXC/OeuQ76vHtW5fg==", + "dev": true, + "requires": { + "debug": "^4.0.1" + } + }, + "simple-progress-webpack-plugin": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/simple-progress-webpack-plugin/-/simple-progress-webpack-plugin-1.1.2.tgz", + "integrity": "sha512-bNQfb3qSqbtsfxg6d0dGechUUJH2lZqKG5+bj2aoJmEA0rSzcm+2JVfC2YgkDABfuGItZ/O5ttt6BssWZW4SNg==", + "dev": true, + "requires": { + "chalk": "2.3.x", + "figures": "2.0.x", + "log-update": "2.3.x" + }, + "dependencies": { + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + } + } + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + } + } + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "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 + } + } + }, + "smart-buffer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "socket.io": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", + "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", + "dev": true, + "requires": { + "debug": "~3.1.0", + "engine.io": "~3.2.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.1.1", + "socket.io-parser": "~3.2.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "engine.io-client": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", + "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.1", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~3.3.1", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + } + }, + "engine.io-parser": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "socket.io-client": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", + "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", + "dev": true, + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "engine.io-client": "~3.2.0", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.2.0", + "to-array": "0.1.4" + } + }, + "socket.io-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", + "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + } + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + } + } + }, + "socket.io-adapter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", + "dev": true + }, + "socket.io-client": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz", + "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==", + "dev": true, + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "engine.io-client": "~3.4.0", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.3.0", + "to-array": "0.1.4" + } + }, + "socket.io-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz", + "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "sockjs": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", + "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.4.0", + "websocket-driver": "0.6.5" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, + "sockjs-client": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", + "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", + "dev": true, + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "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" + } + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + } + } + }, + "socks": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "dev": true, + "requires": { + "ip": "1.1.5", + "smart-buffer": "^4.1.0" + } + }, + "socks-proxy-agent": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", + "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", + "dev": true, + "requires": { + "agent-base": "~4.2.1", + "socks": "~2.3.2" + }, + "dependencies": { + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "spawn-sync": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", + "integrity": "sha1-sAeZVX63+wyDdsKdROih6mfldHY=", + "dev": true, + "requires": { + "concat-stream": "^1.4.7", + "os-shim": "^0.1.2" + } + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "dev": true + }, + "stack-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, + "stackframe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", + "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==", + "dev": true + }, + "staged-git-files": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/staged-git-files/-/staged-git-files-1.1.2.tgz", + "integrity": "sha512-0Eyrk6uXW6tg9PYkhi/V/J4zHp33aNyi2hOCmhFLqLTIhbgqWn5jlSzI+IU0VqrZq6+DbHcabQl/WP6P3BG0QA==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "stream-throttle": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", + "integrity": "sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=", + "dev": true, + "requires": { + "commander": "^2.2.0", + "limiter": "^1.0.5" + } + }, + "streamfilter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-3.0.0.tgz", + "integrity": "sha512-kvKNfXCmUyC8lAXSSHCIXBUlo/lhsLcCU/OmzACZYpRUdtKIH68xYhm/+HI15jFJYtNJGYtCgn2wmIiExY1VwA==", + "dev": true, + "requires": { + "readable-stream": "^3.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string-argv": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.0.2.tgz", + "integrity": "sha1-2sMECGkMIfPDYwo/86BYd73L1zY=", + "dev": true + }, + "string-length": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", + "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "string-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "dependencies": { + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + } + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-bom-buf": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz", + "integrity": "sha1-HLRar1dTD0yvhsf3UXnSyaUd1XI=", + "dev": true, + "requires": { + "is-utf8": "^0.2.1" + } + }, + "strip-bom-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz", + "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", + "dev": true, + "requires": { + "first-chunk-stream": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "strip-comments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", + "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", + "dev": true, + "requires": { + "babel-extract-comments": "^1.0.0", + "babel-plugin-transform-object-rest-spread": "^6.26.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "style-loader": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.2.1.tgz", + "integrity": "sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^2.6.6" + } + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-hyperlinks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", + "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "dependencies": { + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-what": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz", + "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==", + "dev": true + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + } + } + }, + "swagger-ui-dist": { + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-3.25.1.tgz", + "integrity": "sha512-Sw/K95j1pT9TZtLKiHDEml7YqcXC9thTTQjxrvNgd9j1KzOIxpo/5lhHuUMAN/hxVAHetzmcBcQaBjywRXog8w==" + }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "dev": true, + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "dev": true, + "requires": { + "get-port": "^3.1.0" + } + }, + "synchronous-promise": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.13.tgz", + "integrity": "sha512-R9N6uDkVsghHePKh1TEqbnLddO2IY25OcsksyFp/qBe7XYd0PVbKEWxhcdMhpLzE1I6skj5l4aEZ3CRxcbArlA==", + "dev": true + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "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 + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "tabtab": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tabtab/-/tabtab-2.2.2.tgz", + "integrity": "sha1-egR/FDsBC0y9MfhX6ClhUSy/ThQ=", + "dev": true, + "requires": { + "debug": "^2.2.0", + "inquirer": "^1.0.2", + "lodash.difference": "^4.5.0", + "lodash.uniq": "^4.5.0", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "npmlog": "^2.0.3", + "object-assign": "^4.1.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "external-editor": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-1.1.1.tgz", + "integrity": "sha1-Etew24UPf/fnCBuvQAVwAGDEYAs=", + "dev": true, + "requires": { + "extend": "^3.0.0", + "spawn-sync": "^1.0.15", + "tmp": "^0.0.29" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "inquirer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-1.2.3.tgz", + "integrity": "sha1-TexvMvN+97sLLtPx0aXD9UUHSRg=", + "dev": true, + "requires": { + "ansi-escapes": "^1.1.0", + "chalk": "^1.0.0", + "cli-cursor": "^1.0.1", + "cli-width": "^2.0.0", + "external-editor": "^1.1.0", + "figures": "^1.3.5", + "lodash": "^4.3.0", + "mute-stream": "0.0.6", + "pinkie-promise": "^2.0.0", + "run-async": "^2.2.0", + "rx": "^4.1.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.0", + "through": "^2.3.6" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "mute-stream": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.6.tgz", + "integrity": "sha1-SJYrGeFp/R38JAs/HnMXYnu8R9s=", + "dev": true + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "tmp": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz", + "integrity": "sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + } + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + }, + "dependencies": { + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", + "dev": true + }, + "tempy": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz", + "integrity": "sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==", + "dev": true, + "requires": { + "temp-dir": "^1.0.0", + "type-fest": "^0.3.1", + "unique-string": "^1.0.0" + }, + "dependencies": { + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "dev": true + } + } + }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-3.0.6.tgz", + "integrity": "sha512-z3HLOOPUHkCNGkeEHqqiMAIy1pjpHwS1o+i6Zn0Ws3EAvHJj46737efNNEvJ0Vx9BdDQM83d56qySDJOSORA0A==", + "dev": true, + "requires": { + "cacache": "^15.0.4", + "find-cache-dir": "^3.3.1", + "jest-worker": "^26.0.0", + "p-limit": "^3.0.1", + "schema-utils": "^2.6.6", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.8.0", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "cacache": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", + "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", + "dev": true, + "requires": { + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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" + } + }, + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "p-limit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", + "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "ssri": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", + "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "tar": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz", + "integrity": "sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + } + } + }, + "test": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/test/-/test-0.6.0.tgz", + "integrity": "sha1-WYasRF7Bd1QyJRLRBLoyyKY+k44=", + "dev": true, + "requires": { + "ansi-font": "0.0.2" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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" + } + } + } + }, + "text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", + "dev": true + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "textextensions": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-2.6.0.tgz", + "integrity": "sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ==", + "dev": true + }, + "tfunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-3.1.0.tgz", + "integrity": "sha1-OORBT8ZJd9h6/apy+sttKfgve1s=", + "dev": true, + "requires": { + "chalk": "^1.1.1", + "object-path": "^0.9.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "dev": true, + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.62", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.62.tgz", + "integrity": "sha512-76fupxOYVxk36kb7O/6KtrAPZ9jnSK3+qisAX4tQMEuGNdlvl7ycwatlHqjoE6jHfVtXFM3pCrCixZOidc5cuw==", + "dev": true + } + } + }, + "thread-loader": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-2.1.3.tgz", + "integrity": "sha512-wNrVKH2Lcf8ZrWxDF/khdlLlsTMczdcwPA9VEK4c2exlEPynYWxi9op3nPTo5lAnDIkE0rQEB3VBP+4Zncc9Hg==", + "dev": true, + "requires": { + "loader-runner": "^2.3.1", + "loader-utils": "^1.1.0", + "neo-async": "^2.6.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "to-string-loader": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/to-string-loader/-/to-string-loader-1.1.6.tgz", + "integrity": "sha512-VNg62//PS1WfNwrK3n7t6wtK5Vdtx/qeYLLEioW46VMlYUwAYT6wnfB+OwS2FMTCalIHu0tk79D3RXX8ttmZTQ==", + "dev": true, + "requires": { + "loader-utils": "^1.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "trim-newlines": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", + "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", + "dev": true + }, + "triple-beam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", + "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==", + "dev": true + }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "dev": true + }, + "ts-jest": { + "version": "26.2.0", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.2.0.tgz", + "integrity": "sha512-9+y2qwzXdAImgLSYLXAb/Rhq9+K4rbt0417b8ai987V60g2uoNWBBmMkYgutI7D8Zhu+IbCSHbBtrHxB9d7xyA==", + "dev": true, + "requires": { + "@types/jest": "26.x", + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "26.x", + "json5": "2.x", + "lodash.memoize": "4.x", + "make-error": "1.x", + "mkdirp": "1.x", + "semver": "7.x", + "yargs-parser": "18.x" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } + } + }, + "ts-loader": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-7.0.5.tgz", + "integrity": "sha512-zXypEIT6k3oTc+OZNx/cqElrsbBtYqDknf48OZos0NQ3RTt045fBIU8RRSu+suObBzYB355aIPGOe/3kj9h7Ig==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^1.0.2", + "micromatch": "^4.0.0", + "semver": "^6.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "tslib": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz", + "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==" + }, + "tslint": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.2.tgz", + "integrity": "sha512-UyNrLdK3E0fQG/xWNqAFAC5ugtFyPO4JJR1KyyfQAyzR8W0fTRrC91A8Wej4BntFzcvETdCSDa/4PnNYJQLYiA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.3", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.10.0", + "tsutils": "^2.29.0" + }, + "dependencies": { + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + } + } + }, + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + } + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "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-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "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==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "3.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.5.tgz", + "integrity": "sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ==", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.17", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", + "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==", + "dev": true + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "universal-analytics": { + "version": "0.4.20", + "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.20.tgz", + "integrity": "sha512-gE91dtMvNkjO+kWsPstHRtSwHXz0l2axqptGYp5ceg4MsuurloM0PU3pdOfpb5zBXUvyjT4PwhWK2m39uczZuw==", + "dev": true, + "requires": { + "debug": "^3.0.0", + "request": "^2.88.0", + "uuid": "^3.0.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" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "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 + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "untildify": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz", + "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==", + "dev": true + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "^1.0.1" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util-promisify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz", + "integrity": "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.1.0.tgz", + "integrity": "sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", + "dev": true + }, + "v8-to-istanbul": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-5.0.1.tgz", + "integrity": "sha512-mbDNjuDajqYe3TXFk5qxcQy8L1msXNE37WTlLoqqpBfRsimbNcrlhQlDPntmECEcUvdC+AQ8CyMMf6EUx1r74Q==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + } + } + }, + "vinyl-file": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-3.0.0.tgz", + "integrity": "sha1-sQTZ5ECf+jJfqt1SBkLQo7SIs2U=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.3.0", + "strip-bom-buf": "^1.0.0", + "strip-bom-stream": "^2.0.0", + "vinyl": "^2.0.1" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "watchpack": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", + "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", + "dev": true, + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.0" + } + }, + "watchpack-chokidar2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", + "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", + "dev": true, + "optional": true, + "requires": { + "chokidar": "^2.1.8" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "optional": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "optional": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "optional": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "optional": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "webpack": { + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.43.0.tgz", + "integrity": "sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.6.1", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "dev": true + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "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" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "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" + } + }, + "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 + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + } + } + } + }, + "webpack-bundle-analyzer": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.8.0.tgz", + "integrity": "sha512-PODQhAYVEourCcOuU+NiYI7WdR8QyELZGgPvB1y2tjbUpbmcQOt5Q7jEK+ttd5se0KSBKD9SXHCEozS++Wllmw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1", + "bfj": "^6.1.1", + "chalk": "^2.4.1", + "commander": "^2.18.0", + "ejs": "^2.6.1", + "express": "^4.16.3", + "filesize": "^3.6.1", + "gzip-size": "^5.0.0", + "lodash": "^4.17.15", + "mkdirp": "^0.5.1", + "opener": "^1.5.1", + "ws": "^6.0.0" + }, + "dependencies": { + "ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", + "dev": true + } + } + }, + "webpack-cli": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", + "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.1", + "findup-sync": "^3.0.0", + "global-modules": "^2.0.0", + "import-local": "^2.0.0", + "interpret": "^1.4.0", + "loader-utils": "^1.4.0", + "supports-color": "^6.1.0", + "v8-compile-cache": "^2.1.1", + "yargs": "^13.3.2" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "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 + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-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" + } + }, + "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 + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^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" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "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.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", + "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", + "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.7", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "0.3.20", + "sockjs-client": "1.4.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "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" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "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" + } + } + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + } + }, + "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 + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "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-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "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" + } + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "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 + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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" + } + } + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "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" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "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-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.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" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "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" + } + } + } + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "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.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, + "webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "webpack-notifier": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/webpack-notifier/-/webpack-notifier-1.8.0.tgz", + "integrity": "sha512-I6t76NoPe5DZCCm5geELmDV2wlJ89LbU425uN6T2FG8Ywrrt1ZcUMz6g8yWGNg4pttqTPFQJYUPjWAlzUEQ+cQ==", + "dev": true, + "requires": { + "node-notifier": "^5.1.2", + "object-assign": "^4.1.0", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "node-notifier": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", + "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", + "dev": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "websocket-driver": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", + "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", + "dev": true, + "requires": { + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.1.0.tgz", + "integrity": "sha512-vEIkwNi9Hqt4TV9RdnaBPNt+E2Sgmo3gePebCRgZ1R7g6d23+53zCTnuB0amKI4AXq6VM8jj2DUAa0S1vjJxkw==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^2.0.2", + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "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=" + }, + "which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", + "dev": true + }, + "window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", + "dev": true + }, + "windows-release": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.3.tgz", + "integrity": "sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg==", + "dev": true, + "requires": { + "execa": "^1.0.0" + } + }, + "winston": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.2.1.tgz", + "integrity": "sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw==", + "dev": true, + "requires": { + "async": "^2.6.1", + "diagnostics": "^1.1.1", + "is-stream": "^1.1.0", + "logform": "^2.1.1", + "one-time": "0.0.4", + "readable-stream": "^3.1.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.3.0" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "winston-transport": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", + "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", + "dev": true, + "requires": { + "readable-stream": "^2.3.7", + "triple-beam": "^1.2.0" + } + }, + "with-open-file": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/with-open-file/-/with-open-file-0.1.7.tgz", + "integrity": "sha512-ecJS2/oHtESJ1t3ZfMI3B7KIDKyfN0O16miWxdn30zdh66Yd3LsRFebXZXq6GU4xfxLf6nVxp9kIqElb5fqczA==", + "dev": true, + "requires": { + "p-finally": "^1.0.0", + "p-try": "^2.1.0", + "pify": "^4.0.1" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "workbox-background-sync": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-5.1.3.tgz", + "integrity": "sha512-V/R95aPxYjbKCaVzUTihrZ9ObGOnzoA5n60r0DQ747p8Pj15/dDTYixonKhhlvavTiNezUrp+wTQBvZvcd/ETA==", + "dev": true, + "requires": { + "workbox-core": "^5.1.3" + } + }, + "workbox-broadcast-update": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-5.1.3.tgz", + "integrity": "sha512-HJ7FDmgweRcYp8fMiFbkmhaTjMYhMByURe5+TempnCi7cT5NNbyaG4T+rg8NWYxAeumSAB3JQF6XD/z34vRRHA==", + "dev": true, + "requires": { + "workbox-core": "^5.1.3" + } + }, + "workbox-build": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-5.1.3.tgz", + "integrity": "sha512-cssa2cKAi/FNp2P2m2DjF/UsXlVX6b1HgkXOjBTraFkIeyZEKxN1F1DnxOpGkdM/bPPRa7y5OmUvjOpgOd9apA==", + "dev": true, + "requires": { + "@babel/core": "^7.8.4", + "@babel/preset-env": "^7.8.4", + "@babel/runtime": "^7.8.4", + "@hapi/joi": "^15.1.0", + "@rollup/plugin-node-resolve": "^7.1.1", + "@rollup/plugin-replace": "^2.3.1", + "@surma/rollup-plugin-off-main-thread": "^1.1.1", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^8.1.0", + "glob": "^7.1.6", + "lodash.template": "^4.5.0", + "pretty-bytes": "^5.3.0", + "rollup": "^1.31.1", + "rollup-plugin-babel": "^4.3.3", + "rollup-plugin-terser": "^5.2.0", + "source-map": "^0.7.3", + "source-map-url": "^0.4.0", + "stringify-object": "^3.3.0", + "strip-comments": "^1.0.2", + "tempy": "^0.3.0", + "upath": "^1.2.0", + "workbox-background-sync": "^5.1.3", + "workbox-broadcast-update": "^5.1.3", + "workbox-cacheable-response": "^5.1.3", + "workbox-core": "^5.1.3", + "workbox-expiration": "^5.1.3", + "workbox-google-analytics": "^5.1.3", + "workbox-navigation-preload": "^5.1.3", + "workbox-precaching": "^5.1.3", + "workbox-range-requests": "^5.1.3", + "workbox-routing": "^5.1.3", + "workbox-strategies": "^5.1.3", + "workbox-streams": "^5.1.3", + "workbox-sw": "^5.1.3", + "workbox-window": "^5.1.3" + }, + "dependencies": { + "@babel/core": { + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.4.tgz", + "integrity": "sha512-5deljj5HlqRXN+5oJTY7Zs37iH3z3b++KjiKtIsJy1NrjOOVSEaJHEetLBhyu0aQOSNNZ/0IuEAan9GzRuDXHg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.4", + "@babel/helper-module-transforms": "^7.11.0", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.11.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.11.0", + "@babel/types": "^7.11.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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" + } + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "workbox-cacheable-response": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-5.1.3.tgz", + "integrity": "sha512-lOJEwK2T4KWFNdhRFUKxTPBIO5hIYm9E/nYgMq5h/IH3iHPHlBPuFwRMaQy+TTCGWWTA85NomQOjVw1bj65RLw==", + "dev": true, + "requires": { + "workbox-core": "^5.1.3" + } + }, + "workbox-core": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-5.1.3.tgz", + "integrity": "sha512-TFSIPxxciX9sFaj0FDiohBeIKpwMcCyNduydi9i3LChItcndDS6TJpErxybv8aBWeCMraXt33TWtF6kKuIObNw==", + "dev": true + }, + "workbox-expiration": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-5.1.3.tgz", + "integrity": "sha512-8YhpmIHqIx+xmtxONADc+di4a3zzCsvVHLiKq6T3vJZUPnqV2jzx+51+UHMUh3T5w5Z5SFC14l0V/jesRbuMKg==", + "dev": true, + "requires": { + "workbox-core": "^5.1.3" + } + }, + "workbox-google-analytics": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-5.1.3.tgz", + "integrity": "sha512-ouK6xIJa+raFcO29TgwKFU/Hv1ejqSYzCzH9lI2B/4z/Wdnb8maL6mMIojQ8j5SohwKswMZmLDl0Az2PCmX11w==", + "dev": true, + "requires": { + "workbox-background-sync": "^5.1.3", + "workbox-core": "^5.1.3", + "workbox-routing": "^5.1.3", + "workbox-strategies": "^5.1.3" + } + }, + "workbox-navigation-preload": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-5.1.3.tgz", + "integrity": "sha512-29SPQMAccOgbq3BT9Gz7k+ydy0mcKKR0Rmkmd46tnujutiL4ooE57fBhwsA+c6OlLcYdisvilKlV2YWEtKWfgQ==", + "dev": true, + "requires": { + "workbox-core": "^5.1.3" + } + }, + "workbox-precaching": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-5.1.3.tgz", + "integrity": "sha512-9jjBiB00AOI0NnI320ddnhvlL3bjMrDoI3211kEaxcRWh0N2fX25uVn0O8N8u1gWY4tIfwZAn/DgtAU13cFhYA==", + "dev": true, + "requires": { + "workbox-core": "^5.1.3" + } + }, + "workbox-range-requests": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-5.1.3.tgz", + "integrity": "sha512-uUvEoyEUx86LJc7mtmy/6U8xuK0guXU2FnPimt17zDbsC8FSOaPxc92rxtD6xmDSYrI4FqIebypBCjgIe+sfxA==", + "dev": true, + "requires": { + "workbox-core": "^5.1.3" + } + }, + "workbox-routing": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-5.1.3.tgz", + "integrity": "sha512-F+sAp9Iy3lVl3BEG+pzXWVq4AftzjiFpHDaZ4Kf4vLoBoKQE0hIHet4zE5DpHqYdyw+Udhp4wrfHamX6PN6z1Q==", + "dev": true, + "requires": { + "workbox-core": "^5.1.3" + } + }, + "workbox-strategies": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-5.1.3.tgz", + "integrity": "sha512-wiXHfmOKnWABeIVW+/ye0e00+2CcS5y7SIj2f9zcdy2ZLEbcOf7B+yOl5OrWpBGlTUwRjIYhV++ZqiKm3Dc+8w==", + "dev": true, + "requires": { + "workbox-core": "^5.1.3", + "workbox-routing": "^5.1.3" + } + }, + "workbox-streams": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-5.1.3.tgz", + "integrity": "sha512-8kt70eBd1RXL0qenxEnch3Cd7VyW3O0CkeGBN4Bikt307nIV5Q0JciLA5o0CRteijawYOiTq0/px4GDBv1obgQ==", + "dev": true, + "requires": { + "workbox-core": "^5.1.3", + "workbox-routing": "^5.1.3" + } + }, + "workbox-sw": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-5.1.3.tgz", + "integrity": "sha512-Syk6RhYr/8VdFwXrxo5IpVz8Og2xapHTWJhqsZRF+TbxSvlaJs8hrvVPd7edn5ZiiVdPhE9NTeOTOg1+D+FGoA==", + "dev": true + }, + "workbox-webpack-plugin": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-5.1.3.tgz", + "integrity": "sha512-gxSkZ9GFLrMNC/8DGNRjcMhrt8iu+MMXhH/Fpo3wo9rKaSMsI7esGq0klTH/UloP9pNvBizVydysrB52eRhI7w==", + "dev": true, + "requires": { + "@babel/runtime": "^7.5.5", + "fast-json-stable-stringify": "^2.0.0", + "source-map-url": "^0.4.0", + "upath": "^1.1.2", + "webpack-sources": "^1.3.0", + "workbox-build": "^5.1.3" + } + }, + "workbox-window": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-5.1.3.tgz", + "integrity": "sha512-oYvfVtPLET7FUrhOzbk0R+aATVmpdQBkmDqwyFH4W2dfVqJXTvTXzuGP5Pn9oZ8jMTB3AYW43yhYBlLYM3mYyg==", + "dev": true, + "requires": { + "workbox-core": "^5.1.3" + } + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "write-file-webpack-plugin": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/write-file-webpack-plugin/-/write-file-webpack-plugin-4.5.1.tgz", + "integrity": "sha512-AZ7qJUvhTCBiOtG21aFJUcNuLVo2FFM6JMGKvaUGAH+QDqQAp2iG0nq3GcuXmJOFQR2JjpjhyYkyPrbFKhdjNQ==", + "dev": true, + "requires": { + "chalk": "^2.4.0", + "debug": "^3.1.0", + "filesize": "^3.6.1", + "lodash": "^4.17.13", + "mkdirp": "^0.5.1", + "moment": "^2.22.1", + "write-file-atomic": "^2.3.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" + } + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + } + } + }, + "ws": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", + "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", + "dev": true + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + } + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "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==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yaml": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "dev": true + }, + "yargs": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.0.tgz", + "integrity": "sha512-g/QCnmjgOl1YJjGsnUg2SatC7NUYEiLXJqxNOQU9qSpjzGtGXda9b+OKccr1kLTy8BN9yqEyqfq5lxlwdc13TA==", + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.0" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + }, + "yeoman-environment": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-2.10.3.tgz", + "integrity": "sha512-pLIhhU9z/G+kjOXmJ2bPFm3nejfbH+f1fjYRSOteEXDBrv1EoJE/e+kuHixSXfCYfTkxjYsvRaDX+1QykLCnpQ==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "debug": "^3.1.0", + "diff": "^3.5.0", + "escape-string-regexp": "^1.0.2", + "execa": "^4.0.0", + "globby": "^8.0.1", + "grouped-queue": "^1.1.0", + "inquirer": "^7.1.0", + "is-scoped": "^1.0.0", + "lodash": "^4.17.10", + "log-symbols": "^2.2.0", + "mem-fs": "^1.1.0", + "mem-fs-editor": "^6.0.0", + "npm-api": "^1.0.0", + "semver": "^7.1.3", + "strip-ansi": "^4.0.0", + "text-table": "^0.2.0", + "untildify": "^3.0.3", + "yeoman-generator": "^4.8.2" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "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" + } + }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "path-type": "^3.0.0" + } + }, + "execa": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", + "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globby": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", + "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "2.0.0", + "fast-glob": "^2.0.2", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "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" + } + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "yeoman-generator": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/yeoman-generator/-/yeoman-generator-4.11.0.tgz", + "integrity": "sha512-++t6t2Z6HjL5F1/UM7+uNvGknKmQdF8tstJx8WKzsUSEpB+19kLVtapSfQIh9uWqm0L59fLWDzUui//WXoynPw==", + "dev": true, + "requires": { + "async": "^2.6.2", + "chalk": "^2.4.2", + "cli-table": "^0.3.1", + "cross-spawn": "^6.0.5", + "dargs": "^6.1.0", + "dateformat": "^3.0.3", + "debug": "^4.1.1", + "diff": "^4.0.1", + "error": "^7.0.2", + "find-up": "^3.0.0", + "github-username": "^3.0.0", + "grouped-queue": "^1.1.0", + "istextorbinary": "^2.5.1", + "lodash": "^4.17.11", + "make-dir": "^3.0.0", + "mem-fs-editor": "^7.0.1", + "minimist": "^1.2.5", + "pretty-bytes": "^5.2.0", + "read-chunk": "^3.2.0", + "read-pkg-up": "^5.0.0", + "rimraf": "^2.6.3", + "run-async": "^2.0.0", + "semver": "^7.2.1", + "shelljs": "^0.8.3", + "text-table": "^0.2.0", + "through2": "^3.0.1", + "yeoman-environment": "^2.9.5" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "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" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "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" + } + }, + "mem-fs-editor": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/mem-fs-editor/-/mem-fs-editor-7.0.1.tgz", + "integrity": "sha512-eD8r4/d2ayp9HHIgBPHB6Ds0ggA8F9cf9HxcNtbqrwqJXfIDrOSMG5K4fV3+Ib3B+HIdrWqkeDDDvrO7i9EbvQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "deep-extend": "^0.6.0", + "ejs": "^3.0.1", + "glob": "^7.1.4", + "globby": "^9.2.0", + "isbinaryfile": "^4.0.0", + "mkdirp": "^1.0.0", + "multimatch": "^4.0.0", + "rimraf": "^3.0.0", + "through2": "^3.0.1", + "vinyl": "^2.2.0" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "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" + } + }, + "parse-json": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz", + "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "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-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + } + }, + "read-pkg-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-5.0.0.tgz", + "integrity": "sha512-XBQjqOBtTzyol2CpsQOw8LHV0XbDZVG7xMMjmXAJomlVY03WOBRmYgDJETlvcg0H63AJvPRwT7GFi5rvOzUOKg==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^5.0.0" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "yup": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/yup/-/yup-0.27.0.tgz", + "integrity": "sha512-v1yFnE4+u9za42gG/b/081E7uNW9mUj3qtkmelLbW5YPROZzSH/KUUyJu9Wt8vxFJcT9otL/eZopS0YK1L5yPQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "fn-name": "~2.0.1", + "lodash": "^4.17.11", + "property-expr": "^1.5.0", + "synchronous-promise": "^2.0.6", + "toposort": "^2.0.2" + } + }, + "zone.js": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz", + "integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==" + } + } +} diff --git a/borestop/package.json b/borestop/package.json new file mode 100644 index 0000000000000000000000000000000000000000..644c8c578fc444142b25345271f88bfaea6146c0 --- /dev/null +++ b/borestop/package.json @@ -0,0 +1,124 @@ +{ + "name": "borestop", + "version": "0.0.1-SNAPSHOT", + "description": "Description for borestop", + "private": true, + "license": "UNLICENSED", + "cacheDirectories": [ + "node_modules" + ], + "dependencies": { + "@angular/common": "10.0.0", + "@angular/compiler": "10.0.0", + "@angular/core": "10.0.0", + "@angular/forms": "10.0.0", + "@angular/localize": "10.0.0", + "@angular/platform-browser": "10.0.0", + "@angular/platform-browser-dynamic": "10.0.0", + "@angular/router": "10.0.0", + "@fortawesome/angular-fontawesome": "0.6.1", + "@fortawesome/fontawesome-svg-core": "1.2.29", + "@fortawesome/free-solid-svg-icons": "5.13.1", + "@ng-bootstrap/ng-bootstrap": "6.1.0", + "@ngx-translate/core": "12.1.2", + "@ngx-translate/http-loader": "5.0.0", + "bootstrap": "4.5.0", + "moment": "2.27.0", + "ng-jhipster": "0.14.0", + "ngx-cookie-service": "3.0.4", + "ngx-infinite-scroll": "9.0.0", + "ngx-webstorage": "5.0.0", + "rxjs": "6.5.5", + "swagger-ui-dist": "3.25.1", + "tslib": "2.0.0", + "zone.js": "0.10.3" + }, + "devDependencies": { + "@angular/cli": "10.0.0", + "@angular/compiler-cli": "10.0.0", + "@ngtools/webpack": "10.0.0", + "@openapitools/openapi-generator-cli": "1.0.13-4.3.1", + "@types/jest": "26.0.3", + "@types/node": "13.13.4", + "@typescript-eslint/eslint-plugin": "2.30.0", + "@typescript-eslint/eslint-plugin-tslint": "2.30.0", + "@typescript-eslint/parser": "2.30.0", + "autoprefixer": "9.8.4", + "browser-sync": "2.26.7", + "browser-sync-webpack-plugin": "2.2.2", + "codelyzer": "5.2.2", + "copy-webpack-plugin": "6.0.2", + "css-loader": "3.6.0", + "eslint": "6.8.0", + "eslint-config-jhipster": "0.0.1", + "eslint-config-prettier": "6.11.0", + "eslint-loader": "4.0.2", + "file-loader": "6.0.0", + "friendly-errors-webpack-plugin": "1.7.0", + "generator-jhipster": "6.10.1", + "html-loader": "1.1.0", + "html-webpack-plugin": "4.3.0", + "husky": "4.2.5", + "jest": "26.1.0", + "jest-date-mock": "1.0.8", + "jest-junit": "11.0.1", + "jest-preset-angular": "8.2.1", + "jest-sonar-reporter": "2.0.0", + "lint-staged": "8.2.1", + "merge-jsons-webpack-plugin": "1.0.21", + "mini-css-extract-plugin": "0.9.0", + "moment-locales-webpack-plugin": "1.2.0", + "optimize-css-assets-webpack-plugin": "5.0.3", + "postcss-loader": "3.0.0", + "prettier": "2.0.5", + "rimraf": "3.0.2", + "sass": "1.26.9", + "sass-loader": "8.0.2", + "simple-progress-webpack-plugin": "1.1.2", + "style-loader": "1.2.1", + "terser-webpack-plugin": "3.0.6", + "thread-loader": "2.1.3", + "to-string-loader": "1.1.6", + "ts-loader": "7.0.5", + "tslint": "6.1.2", + "typescript": "3.9.5", + "webpack": "4.43.0", + "webpack-bundle-analyzer": "3.8.0", + "webpack-cli": "3.3.12", + "webpack-dev-server": "3.11.0", + "webpack-merge": "4.2.2", + "webpack-notifier": "1.8.0", + "workbox-webpack-plugin": "5.1.3", + "write-file-webpack-plugin": "4.5.1" + }, + "engines": { + "node": ">=12.16.1" + }, + "scripts": { + "prettier:format": "prettier --write \"{,src/**/}*.{md,json,ts,css,scss,yml}\"", + "lint": "eslint . --ext .js,.ts", + "lint:fix": "npm run lint -- --fix", + "ngc": "ngc -p tsconfig.app.json", + "cleanup": "rimraf target/classes/static/", + "clean-www": "rimraf target/classes/static/app/{src,target/}", + "start": "npm run webpack:dev", + "start-tls": "npm run webpack:dev -- --env.tls", + "serve": "npm run start", + "build": "npm run webpack:prod", + "test": "npm run lint && jest --coverage --logHeapUsage -w=2 --config src/test/javascript/jest.conf.js", + "test:watch": "npm run test -- --watch", + "webpack:dev": "npm run webpack-dev-server -- --config webpack/webpack.dev.js --inline --hot --port=9060 --watch-content-base --env.stats=minimal", + "webpack:dev-verbose": "npm run webpack-dev-server -- --config webpack/webpack.dev.js --inline --hot --port=9060 --watch-content-base --profile --progress --env.stats=normal", + "webpack:build:main": "npm run webpack -- --config webpack/webpack.dev.js --env.stats=minimal", + "webpack:build": "npm run cleanup && npm run webpack:build:main", + "webpack:prod:main": "npm run webpack -- --config webpack/webpack.prod.js --profile", + "webpack:prod": "npm run cleanup && npm run webpack:prod:main && npm run clean-www", + "webpack:test": "npm run test", + "webpack-dev-server": "node --max_old_space_size=4096 node_modules/webpack-dev-server/bin/webpack-dev-server.js", + "webpack": "node --max_old_space_size=4096 node_modules/webpack/bin/webpack.js" + }, + "jestSonar": { + "reportPath": "target/test-results/jest", + "reportFile": "TESTS-results-sonar.xml" + } +} diff --git a/borestop/pom.xml b/borestop/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..9d3775754836b846d57d830d3db5f9cd5b32545c --- /dev/null +++ b/borestop/pom.xml @@ -0,0 +1,1114 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>com.ippon.borestop</groupId> + <artifactId>borestop</artifactId> + <version>0.0.1-SNAPSHOT</version> + <packaging>jar</packaging> + <name>Borestop</name> + + <repositories> + <!-- jhipster-needle-maven-repository --> + </repositories> + + <pluginRepositories> + <!-- jhipster-needle-maven-plugin-repository --> + </pluginRepositories> + + <!-- jhipster-needle-distribution-management --> + + <properties> + <!-- Build properties --> + <maven.version>3.3.9</maven.version> + <java.version>1.8</java.version> + <node.version>v12.16.1</node.version> + <npm.version>6.14.5</npm.version> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> + <project.testresult.directory>${project.build.directory}/test-results</project.testresult.directory> + <maven.build.timestamp.format>yyyyMMddHHmmss</maven.build.timestamp.format> + <maven.compiler.source>${java.version}</maven.compiler.source> + <maven.compiler.target>${java.version}</maven.compiler.target> + <argLine>-Djava.security.egd=file:/dev/./urandom -Xmx256m</argLine> + <m2e.apt.activation>jdt_apt</m2e.apt.activation> + <run.addResources>false</run.addResources> + <!-- These remain empty unless the corresponding profile is active --> + <profile.no-liquibase /> + <profile.swagger /> + <profile.tls /> + + <!-- Dependency versions --> + <jhipster-dependencies.version>3.9.0</jhipster-dependencies.version> + <!-- The spring-boot version should match the one managed by + https://mvnrepository.com/artifact/io.github.jhipster/jhipster-dependencies/${jhipster-dependencies.version} --> + <spring-boot.version>2.2.7.RELEASE</spring-boot.version> + <!-- The hibernate version should match the one managed by + https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-dependencies/${spring-boot.version} --> + <hibernate.version>5.4.15.Final</hibernate.version> + <!-- The javassist version should match the one managed by + https://mvnrepository.com/artifact/org.hibernate/hibernate-core/${hibernate.version} --> + <javassist.version>3.24.0-GA</javassist.version> + <!-- The liquibase version should match the one managed by + https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-dependencies/${spring-boot.version} --> + <liquibase.version>3.9.0</liquibase.version> + <liquibase-hibernate5.version>3.8</liquibase-hibernate5.version> + <h2.version>1.4.200</h2.version> + <validation-api.version>2.0.1.Final</validation-api.version> + <jaxb-runtime.version>2.3.3</jaxb-runtime.version> + <archunit-junit5.version>0.14.1</archunit-junit5.version> + <mapstruct.version>1.3.1.Final</mapstruct.version> + <!-- Plugin versions --> + <maven-clean-plugin.version>3.1.0</maven-clean-plugin.version> + <maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version> + <maven-javadoc-plugin.version>3.2.0</maven-javadoc-plugin.version> + <maven-eclipse-plugin.version>2.10</maven-eclipse-plugin.version> + <maven-enforcer-plugin.version>3.0.0-M3</maven-enforcer-plugin.version> + <maven-failsafe-plugin.version>3.0.0-M4</maven-failsafe-plugin.version> + <maven-idea-plugin.version>2.2.1</maven-idea-plugin.version> + <maven-resources-plugin.version>3.1.0</maven-resources-plugin.version> + <maven-surefire-plugin.version>3.0.0-M4</maven-surefire-plugin.version> + <maven-war-plugin.version>3.2.3</maven-war-plugin.version> + <maven-checkstyle.version>3.1.1</maven-checkstyle.version> + <checkstyle.version>8.32</checkstyle.version> + <spring-nohttp-checkstyle.version>0.0.4.RELEASE</spring-nohttp-checkstyle.version> + <frontend-maven-plugin.version>1.10.0</frontend-maven-plugin.version> + <git-commit-id-plugin.version>4.0.0</git-commit-id-plugin.version> + <jacoco-maven-plugin.version>0.8.5</jacoco-maven-plugin.version> + <jib-maven-plugin.version>2.4.0</jib-maven-plugin.version> + <lifecycle-mapping.version>1.0.0</lifecycle-mapping.version> + <properties-maven-plugin.version>1.0.0</properties-maven-plugin.version> + <sonar-maven-plugin.version>3.7.0.1746</sonar-maven-plugin.version> + <jacoco.utReportFolder>${project.build.directory}/jacoco/test</jacoco.utReportFolder> + <jacoco.utReportFile>${jacoco.utReportFolder}/test.exec</jacoco.utReportFile> + <jacoco.itReportFolder>${project.build.directory}/jacoco/integrationTest</jacoco.itReportFolder> + <jacoco.itReportFile>${jacoco.itReportFolder}/integrationTest.exec</jacoco.itReportFile> + <junit.utReportFolder>${project.testresult.directory}/test</junit.utReportFolder> + <junit.itReportFolder>${project.testresult.directory}/integrationTest</junit.itReportFolder> + <!-- jhipster-needle-maven-property --> + </properties> + + <dependencyManagement> + <dependencies> + <dependency> + <groupId>io.github.jhipster</groupId> + <artifactId>jhipster-dependencies</artifactId> + <version>${jhipster-dependencies.version}</version> + <type>pom</type> + <scope>import</scope> + </dependency> + <!-- jhipster-needle-maven-add-dependency-management --> + </dependencies> + </dependencyManagement> + + <dependencies> + <dependency> + <groupId>io.github.jhipster</groupId> + <artifactId>jhipster-framework</artifactId> + </dependency> + <dependency> + <groupId>javax.annotation</groupId> + <artifactId>javax.annotation-api</artifactId> + </dependency> + + <dependency> + <groupId>com.fasterxml.jackson.module</groupId> + <artifactId>jackson-module-jaxb-annotations</artifactId> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.datatype</groupId> + <artifactId>jackson-datatype-hibernate5</artifactId> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.datatype</groupId> + <artifactId>jackson-datatype-hppc</artifactId> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.datatype</groupId> + <artifactId>jackson-datatype-jsr310</artifactId> + </dependency> + <dependency> + <groupId>com.h2database</groupId> + <artifactId>h2</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>io.springfox</groupId> + <artifactId>springfox-swagger2</artifactId> + </dependency> + <dependency> + <groupId>io.springfox</groupId> + <artifactId>springfox-bean-validators</artifactId> + </dependency> + <dependency> + <groupId>com.zaxxer</groupId> + <artifactId>HikariCP</artifactId> + </dependency> + <dependency> + <groupId>org.testcontainers</groupId> + <artifactId>postgresql</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.hibernate</groupId> + <artifactId>hibernate-jpamodelgen</artifactId> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.hibernate</groupId> + <artifactId>hibernate-core</artifactId> + </dependency> + <dependency> + <groupId>org.hibernate.validator</groupId> + <artifactId>hibernate-validator</artifactId> + </dependency> + <dependency> + <groupId>org.liquibase</groupId> + <artifactId>liquibase-core</artifactId> + <!-- Inherited version from Spring Boot can't be used because of regressions --> + <version>${liquibase.version}</version> + </dependency> + <dependency> + <groupId>net.logstash.logback</groupId> + <artifactId>logstash-logback-encoder</artifactId> + </dependency> + <dependency> + <groupId>org.postgresql</groupId> + <artifactId>postgresql</artifactId> + </dependency> + <dependency> + <groupId>org.mapstruct</groupId> + <artifactId>mapstruct</artifactId> + </dependency> + <dependency> + <groupId>org.mapstruct</groupId> + <artifactId>mapstruct-processor</artifactId> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-configuration-processor</artifactId> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-loader-tools</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-actuator</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-aop</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-data-jpa</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-logging</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-mail</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-security</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-thymeleaf</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-web</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-test</artifactId> + <scope>test</scope> + <exclusions> + <exclusion> + <groupId>org.junit.vintage</groupId> + <artifactId>junit-vintage-engine</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-test</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.springframework.security</groupId> + <artifactId>spring-security-test</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>com.tngtech.archunit</groupId> + <artifactId>archunit-junit5-api</artifactId> + <version>${archunit-junit5.version}</version> + <scope>test</scope> + </dependency> + <!-- Adding the engine dependency to the surefire-plugin unfortunately does not work in the current version. --> + <!-- https://www.archunit.org/userguide/html/000_Index.html#_junit_5 --> + <dependency> + <groupId>com.tngtech.archunit</groupId> + <artifactId>archunit-junit5-engine</artifactId> + <version>${archunit-junit5.version}</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.zalando</groupId> + <artifactId>problem-spring-web</artifactId> + </dependency> + <dependency> + <groupId>io.jsonwebtoken</groupId> + <artifactId>jjwt-api</artifactId> + </dependency> + <dependency> + <groupId>io.jsonwebtoken</groupId> + <artifactId>jjwt-impl</artifactId> + <scope>runtime</scope> + </dependency> + <dependency> + <groupId>io.jsonwebtoken</groupId> + <artifactId>jjwt-jackson</artifactId> + <scope>runtime</scope> + </dependency> + <!-- Spring Cloud --> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-cloud-connectors</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.security</groupId> + <artifactId>spring-security-data</artifactId> + </dependency> + <dependency> + <groupId>io.micrometer</groupId> + <artifactId>micrometer-registry-prometheus</artifactId> + </dependency> + <dependency> + <groupId>io.dropwizard.metrics</groupId> + <artifactId>metrics-core</artifactId> + </dependency> + <!-- jhipster-needle-maven-add-dependency --> + </dependencies> + + <build> + <defaultGoal>spring-boot:run</defaultGoal> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-checkstyle-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-javadoc-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-eclipse-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-enforcer-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-failsafe-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-idea-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-resources-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.jacoco</groupId> + <artifactId>jacoco-maven-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.sonarsource.scanner.maven</groupId> + <artifactId>sonar-maven-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.liquibase</groupId> + <artifactId>liquibase-maven-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-maven-plugin</artifactId> + </plugin> + <plugin> + <groupId>com.google.cloud.tools</groupId> + <artifactId>jib-maven-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>properties-maven-plugin</artifactId> + </plugin> + <!-- jhipster-needle-maven-add-plugin --> + </plugins> + <pluginManagement> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-checkstyle-plugin</artifactId> + <version>${maven-checkstyle.version}</version> + <dependencies> + <dependency> + <groupId>com.puppycrawl.tools</groupId> + <artifactId>checkstyle</artifactId> + <version>${checkstyle.version}</version> + </dependency> + <dependency> + <groupId>io.spring.nohttp</groupId> + <artifactId>nohttp-checkstyle</artifactId> + <version>${spring-nohttp-checkstyle.version}</version> + </dependency> + </dependencies> + <configuration> + <configLocation>checkstyle.xml</configLocation> + <includes>pom.xml,README.md</includes> + <excludes>.git/**/*,target/**/*,node_modules/**/*,node/**/*</excludes> + <sourceDirectories>./</sourceDirectories> + </configuration> + <executions> + <execution> + <goals> + <goal>check</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>${maven-compiler-plugin.version}</version> + <configuration> + <source>${java.version}</source> + <target>${java.version}</target> + <annotationProcessorPaths> + <path> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-configuration-processor</artifactId> + <version>${spring-boot.version}</version> + </path> + <path> + <groupId>org.mapstruct</groupId> + <artifactId>mapstruct-processor</artifactId> + <version>${mapstruct.version}</version> + </path> + <!-- For JPA static metamodel generation --> + <path> + <groupId>org.hibernate</groupId> + <artifactId>hibernate-jpamodelgen</artifactId> + <version>${hibernate.version}</version> + </path> + <path> + <groupId>org.glassfish.jaxb</groupId> + <artifactId>jaxb-runtime</artifactId> + <version>${jaxb-runtime.version}</version> + </path> + <!-- jhipster-needle-maven-add-annotation-processor --> + </annotationProcessorPaths> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-javadoc-plugin</artifactId> + <version>${maven-javadoc-plugin.version}</version> + <configuration> + <source>${maven.compiler.source}</source> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-war-plugin</artifactId> + <version>${maven-war-plugin.version}</version> + <executions> + <execution> + <id>default-war</id> + <goals> + <goal>war</goal> + </goals> + <phase>package</phase> + </execution> + </executions> + <configuration> + <warSourceIncludes>WEB-INF/**,META-INF/**</warSourceIncludes> + <failOnMissingWebXml>false</failOnMissingWebXml> + <warSourceDirectory>target/classes/static/</warSourceDirectory> + <webResources> + <resource> + <directory>src/main/webapp</directory> + <includes> + <include>WEB-INF/**</include> + </includes> + </resource> + </webResources> + </configuration> + </plugin> + <plugin> + <groupId>com.github.eirslett</groupId> + <artifactId>frontend-maven-plugin</artifactId> + <version>${frontend-maven-plugin.version}</version> + </plugin> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>properties-maven-plugin</artifactId> + <version>${properties-maven-plugin.version}</version> + <executions> + <execution> + <phase>initialize</phase> + <goals> + <goal>read-project-properties</goal> + </goals> + <configuration> + <files> + <file>sonar-project.properties</file> + </files> + </configuration> + </execution> + </executions> + </plugin> + + <plugin> + <groupId>pl.project13.maven</groupId> + <artifactId>git-commit-id-plugin</artifactId> + <version>${git-commit-id-plugin.version}</version> + <executions> + <execution> + <goals> + <goal>revision</goal> + </goals> + </execution> + </executions> + <configuration> + <failOnNoGitDirectory>false</failOnNoGitDirectory> + <failOnUnableToExtractRepoInfo>false</failOnUnableToExtractRepoInfo> + <generateGitPropertiesFile>true</generateGitPropertiesFile> + <includeOnlyProperties> + <includeOnlyProperty>^git.commit.id.abbrev$</includeOnlyProperty> + <includeOnlyProperty>^git.commit.id.describe$</includeOnlyProperty> + <includeOnlyProperty>^git.branch$</includeOnlyProperty> + </includeOnlyProperties> + </configuration> + </plugin> + <plugin> + <groupId>org.jacoco</groupId> + <artifactId>jacoco-maven-plugin</artifactId> + <version>${jacoco-maven-plugin.version}</version> + <executions> + <execution> + <id>pre-unit-tests</id> + <goals> + <goal>prepare-agent</goal> + </goals> + <configuration> + <!-- Sets the path to the file which contains the execution data. --> + <destFile>${jacoco.utReportFile}</destFile> + </configuration> + </execution> + <!-- Ensures that the code coverage report for unit tests is created after unit tests have been run --> + <execution> + <id>post-unit-test</id> + <phase>test</phase> + <goals> + <goal>report</goal> + </goals> + <configuration> + <dataFile>${jacoco.utReportFile}</dataFile> + <outputDirectory>${jacoco.utReportFolder}</outputDirectory> + </configuration> + </execution> + <execution> + <id>pre-integration-tests</id> + <goals> + <goal>prepare-agent-integration</goal> + </goals> + <configuration> + <!-- Sets the path to the file which contains the execution data. --> + <destFile>${jacoco.itReportFile}</destFile> + </configuration> + </execution> + <!-- Ensures that the code coverage report for integration tests is created after integration tests have been run --> + <execution> + <id>post-integration-tests</id> + <phase>post-integration-test</phase> + <goals> + <goal>report-integration</goal> + </goals> + <configuration> + <dataFile>${jacoco.itReportFile}</dataFile> + <outputDirectory>${jacoco.itReportFolder}</outputDirectory> + </configuration> + </execution> + </executions> + </plugin> + <plugin> + <groupId>com.google.cloud.tools</groupId> + <artifactId>jib-maven-plugin</artifactId> + <version>${jib-maven-plugin.version}</version> + <configuration> + <from> + <image>adoptopenjdk:11-jre-hotspot</image> + </from> + <to> + <image>borestop:latest</image> + </to> + <container> + <entrypoint> + <shell>bash</shell> + <option>-c</option> + <arg>/entrypoint.sh</arg> + </entrypoint> + <ports> + <port>8080</port> + </ports> + <environment> + <SPRING_OUTPUT_ANSI_ENABLED>ALWAYS</SPRING_OUTPUT_ANSI_ENABLED> + <JHIPSTER_SLEEP>0</JHIPSTER_SLEEP> + </environment> + <creationTime>USE_CURRENT_TIMESTAMP</creationTime> + </container> + <extraDirectories> + <paths>src/main/jib</paths> + <permissions> + <permission> + <file>/entrypoint.sh</file> + <mode>755</mode> + </permission> + </permissions> + </extraDirectories> + </configuration> + </plugin> + <plugin> + <groupId>org.liquibase</groupId> + <artifactId>liquibase-maven-plugin</artifactId> + <version>${liquibase.version}</version> + <configuration> + <changeLogFile>${project.basedir}/src/main/resources/config/liquibase/master.xml</changeLogFile> + <diffChangeLogFile>${project.basedir}/src/main/resources/config/liquibase/changelog/${maven.build.timestamp}_changelog.xml</diffChangeLogFile> + <driver>org.h2.Driver</driver> + <url>jdbc:h2:file:${project.build.directory}/h2db/db/borestop</url> + <defaultSchemaName></defaultSchemaName> + <username>borestop</username> + <password></password> + <referenceUrl>hibernate:spring:com.ippon.borestop.domain?dialect=org.hibernate.dialect.H2Dialect&hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy&hibernate.implicit_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy</referenceUrl> + <verbose>true</verbose> + <logging>debug</logging> + <contexts>!test</contexts> + </configuration> + <dependencies> + <dependency> + <groupId>org.liquibase</groupId> + <artifactId>liquibase-core</artifactId> + <version>${liquibase.version}</version> + </dependency> + <dependency> + <groupId>org.liquibase.ext</groupId> + <artifactId>liquibase-hibernate5</artifactId> + <version>${liquibase-hibernate5.version}</version> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-data-jpa</artifactId> + <version>${spring-boot.version}</version> + </dependency> + <dependency> + <groupId>javax.validation</groupId> + <artifactId>validation-api</artifactId> + <version>${validation-api.version}</version> + </dependency> + <dependency> + <groupId>org.javassist</groupId> + <artifactId>javassist</artifactId> + <version>${javassist.version}</version> + </dependency> + <dependency> + <groupId>com.h2database</groupId> + <artifactId>h2</artifactId> + <version>${h2.version}</version> + </dependency> + </dependencies> + </plugin> + <plugin> + <artifactId>maven-clean-plugin</artifactId> + <version>${maven-clean-plugin.version}</version> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-eclipse-plugin</artifactId> + <version>${maven-eclipse-plugin.version}</version> + <configuration> + <downloadSources>true</downloadSources> + <downloadJavadocs>true</downloadJavadocs> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-enforcer-plugin</artifactId> + <version>${maven-enforcer-plugin.version}</version> + <executions> + <execution> + <id>enforce-versions</id> + <goals> + <goal>enforce</goal> + </goals> + </execution> + <execution> + <id>enforce-dependencyConvergence</id> + <configuration> + <rules> + <DependencyConvergence /> + </rules> + <fail>false</fail> + </configuration> + <goals> + <goal>enforce</goal> + </goals> + </execution> + </executions> + <configuration> + <rules> + <requireMavenVersion> + <message>You are running an older version of Maven. JHipster requires at least Maven ${maven.version}</message> + <version>[${maven.version},)</version> + </requireMavenVersion> + <requireJavaVersion> + <message>You are running an incompatible version of Java. JHipster supports JDK 8 to 14.</message> + <version>[1.8,15)</version> + </requireJavaVersion> + </rules> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-idea-plugin</artifactId> + <version>${maven-idea-plugin.version}</version> + <configuration> + <exclude>node_modules</exclude> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-resources-plugin</artifactId> + <version>${maven-resources-plugin.version}</version> + <executions> + <execution> + <id>default-resources</id> + <phase>validate</phase> + <goals> + <goal>copy-resources</goal> + </goals> + <configuration> + <outputDirectory>${project.build.directory}/classes</outputDirectory> + <useDefaultDelimiters>false</useDefaultDelimiters> + <delimiters> + <delimiter>#</delimiter> + </delimiters> + <resources> + <resource> + <directory>src/main/resources/</directory> + <filtering>true</filtering> + <includes> + <include>config/*.yml</include> + </includes> + </resource> + <resource> + <directory>src/main/resources/</directory> + <filtering>false</filtering> + <excludes> + <exclude>config/*.yml</exclude> + </excludes> + </resource> + </resources> + </configuration> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <version>${maven-surefire-plugin.version}</version> + <configuration> + <!-- Force alphabetical order to have a reproducible build --> + <runOrder>alphabetical</runOrder> + <reportsDirectory>${junit.utReportFolder}</reportsDirectory> + <excludes> + <exclude>**/*IT*</exclude> + <exclude>**/*IntTest*</exclude> + </excludes> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-failsafe-plugin</artifactId> + <version>${maven-failsafe-plugin.version}</version> + <configuration> + <!-- Due to spring-boot repackage, without adding this property test classes are not found + See https://github.com/spring-projects/spring-boot/issues/6254 --> + <classesDirectory>${project.build.outputDirectory}</classesDirectory> + <!-- Force alphabetical order to have a reproducible build --> + <runOrder>alphabetical</runOrder> + <reportsDirectory>${junit.itReportFolder}</reportsDirectory> + <includes> + <include>**/*IT*</include> + <include>**/*IntTest*</include> + </includes> + </configuration> + <executions> + <execution> + <id>integration-test</id> + <goals> + <goal>integration-test</goal> + </goals> + </execution> + <execution> + <id>verify</id> + <goals> + <goal>verify</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.sonarsource.scanner.maven</groupId> + <artifactId>sonar-maven-plugin</artifactId> + <version>${sonar-maven-plugin.version}</version> + </plugin> + <plugin> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-maven-plugin</artifactId> + <version>${spring-boot.version}</version> + <executions> + <execution> + <goals> + <goal>repackage</goal> + </goals> + </execution> + </executions> + <configuration> + <mainClass>${start-class}</mainClass> + <fork>true</fork> + <!-- + Enable the line below to have remote debugging of your application on port 5005 + <jvmArguments>-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005</jvmArguments> + --> + </configuration> + + </plugin> + <!-- jhipster-needle-maven-add-plugin-management --> + </plugins> + </pluginManagement> + </build> + <profiles> + <profile> + <id>no-liquibase</id> + <properties> + <profile.no-liquibase>,no-liquibase</profile.no-liquibase> + </properties> + </profile> + <profile> + <id>swagger</id> + <properties> + <profile.swagger>,swagger</profile.swagger> + </properties> + </profile> + <profile> + <id>tls</id> + <properties> + <profile.tls>,tls</profile.tls> + </properties> + </profile> + <profile> + <id>webpack</id> + <activation> + <activeByDefault>true</activeByDefault> + </activation> + <dependencies> + <dependency> + <groupId>com.h2database</groupId> + <artifactId>h2</artifactId> + </dependency> + </dependencies> + <build> + <plugins> + <plugin> + <groupId>com.github.eirslett</groupId> + <artifactId>frontend-maven-plugin</artifactId> + <executions> + <execution> + <id>install node and npm</id> + <goals> + <goal>install-node-and-npm</goal> + </goals> + <configuration> + <nodeVersion>${node.version}</nodeVersion> + <npmVersion>${npm.version}</npmVersion> + </configuration> + </execution> + <execution> + <id>npm install</id> + <goals> + <goal>npm</goal> + </goals> + </execution> + <execution> + <id>webpack build dev</id> + <goals> + <goal>npm</goal> + </goals> + <phase>generate-resources</phase> + <configuration> + <arguments>run webpack:build</arguments> + <environmentVariables> + <APP_VERSION>${project.version}</APP_VERSION> + </environmentVariables> + <npmInheritsProxyConfigFromMaven>false</npmInheritsProxyConfigFromMaven> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> + <properties> + <!-- default Spring profiles --> + <spring.profiles.active>dev${profile.no-liquibase}</spring.profiles.active> + </properties> + </profile> + <profile> + <id>dev</id> + <activation> + <activeByDefault>true</activeByDefault> + </activation> + <dependencies> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-undertow</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-devtools</artifactId> + <optional>true</optional> + </dependency> + <dependency> + <groupId>com.h2database</groupId> + <artifactId>h2</artifactId> + </dependency> + </dependencies> + <properties> + <!-- default Spring profiles --> + <spring.profiles.active>dev${profile.tls}${profile.no-liquibase}</spring.profiles.active> + </properties> + </profile> + <profile> + <id>prod</id> + <dependencies> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-undertow</artifactId> + </dependency> + </dependencies> + <build> + <plugins> + <plugin> + <artifactId>maven-clean-plugin</artifactId> + <configuration> + <filesets> + <fileset> + <directory>target/classes/static/</directory> + </fileset> + </filesets> + </configuration> + </plugin> + <plugin> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-maven-plugin</artifactId> + <executions> + <execution> + <goals> + <goal>build-info</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <groupId>com.github.eirslett</groupId> + <artifactId>frontend-maven-plugin</artifactId> + <executions> + <execution> + <id>install node and npm</id> + <goals> + <goal>install-node-and-npm</goal> + </goals> + <configuration> + <nodeVersion>${node.version}</nodeVersion> + <npmVersion>${npm.version}</npmVersion> + </configuration> + </execution> + <execution> + <id>npm install</id> + <goals> + <goal>npm</goal> + </goals> + <configuration> + <arguments>install</arguments> + </configuration> + </execution> + <execution> + <id>webpack build test</id> + <goals> + <goal>npm</goal> + </goals> + <phase>test</phase> + <configuration> + <arguments>run webpack:test</arguments> + <npmInheritsProxyConfigFromMaven>false</npmInheritsProxyConfigFromMaven> + </configuration> + </execution> + <execution> + <id>webpack build prod</id> + <goals> + <goal>npm</goal> + </goals> + <phase>generate-resources</phase> + <configuration> + <arguments>run webpack:prod</arguments> + <environmentVariables> + <APP_VERSION>${project.version}</APP_VERSION> + </environmentVariables> + <npmInheritsProxyConfigFromMaven>false</npmInheritsProxyConfigFromMaven> + </configuration> + </execution> + </executions> + </plugin> + <plugin> + <groupId>pl.project13.maven</groupId> + <artifactId>git-commit-id-plugin</artifactId> + </plugin> + </plugins> + </build> + <properties> + <!-- default Spring profiles --> + <spring.profiles.active>prod${profile.swagger}${profile.tls}${profile.no-liquibase}</spring.profiles.active> + </properties> + </profile> + <profile> + <id>war</id> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-war-plugin</artifactId> + </plugin> + </plugins> + </build> + </profile> + <profile> + <!-- + Profile for applying IDE-specific configuration. + At the moment it configures MapStruct and Hibernate JPA Metamodel Generator, which you need when working + with DTOs and entity filtering. + --> + <id>IDE</id> + <dependencies> + <dependency> + <groupId>org.mapstruct</groupId> + <artifactId>mapstruct-processor</artifactId> + </dependency> + <dependency> + <groupId>org.hibernate</groupId> + <artifactId>hibernate-jpamodelgen</artifactId> + </dependency> + </dependencies> + </profile> + <profile> + <!-- This is automatically activated when working in Eclipse --> + <id>eclipse</id> + <activation> + <property> + <name>m2e.version</name> + </property> + </activation> + <dependencies> + <!-- The following dependency is added due to issue #9175--> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-undertow</artifactId> + </dependency> + </dependencies> + <build> + <pluginManagement> + <plugins> + <!-- + This plugin's configuration is used to store Eclipse m2e settings only. + It has no influence on the Maven build itself. + Remove when the m2e plugin can correctly bind to Maven lifecycle + --> + <plugin> + <groupId>org.eclipse.m2e</groupId> + <artifactId>lifecycle-mapping</artifactId> + <version>${lifecycle-mapping.version}</version> + <configuration> + <lifecycleMappingMetadata> + <pluginExecutions> + <pluginExecution> + <pluginExecutionFilter> + <groupId>org.jacoco</groupId> + <artifactId> + jacoco-maven-plugin + </artifactId> + <versionRange> + ${jacoco-maven-plugin.version} + </versionRange> + <goals> + <goal>prepare-agent</goal> + </goals> + </pluginExecutionFilter> + <action> + <ignore/> + </action> + </pluginExecution> + <pluginExecution> + <pluginExecutionFilter> + <groupId>com.github.eirslett</groupId> + <artifactId>frontend-maven-plugin</artifactId> + <versionRange>${frontend-maven-plugin.version}</versionRange> + <goals> + <goal>install-node-and-npm</goal> + <goal>npm</goal> + </goals> + </pluginExecutionFilter> + <action> + <ignore/> + </action> + </pluginExecution> + </pluginExecutions> + </lifecycleMappingMetadata> + </configuration> + </plugin> + </plugins> + </pluginManagement> + </build> + </profile> + <!-- jhipster-needle-maven-add-profile --> + </profiles> +</project> diff --git a/borestop/postcss.config.js b/borestop/postcss.config.js new file mode 100644 index 0000000000000000000000000000000000000000..b0f214d58f29f748facb7b881b7a717982c1c8a1 --- /dev/null +++ b/borestop/postcss.config.js @@ -0,0 +1,3 @@ +module.exports = { + plugins: [require('autoprefixer')] +}; diff --git a/borestop/proxy.conf.json b/borestop/proxy.conf.json new file mode 100644 index 0000000000000000000000000000000000000000..3bfe56a3ce74f44d1ba41b2f6af563e791b0b9b0 --- /dev/null +++ b/borestop/proxy.conf.json @@ -0,0 +1,7 @@ +{ + "*": { + "target": "http://localhost:8080", + "secure": false, + "loglevel": "debug" + } +} diff --git a/borestop/sonar-project.properties b/borestop/sonar-project.properties new file mode 100644 index 0000000000000000000000000000000000000000..4f82e483570628c59ad48a07ab000b39b654d517 --- /dev/null +++ b/borestop/sonar-project.properties @@ -0,0 +1,33 @@ +sonar.projectKey=borestop +sonar.projectName=borestop generated by jhipster +sonar.projectVersion=1.0 + +sonar.sources=src/main/ +sonar.host.url=http://localhost:9001 + +sonar.tests=src/test/ +sonar.coverage.jacoco.xmlReportPaths=target/jacoco/test/jacoco.xml,target/jacoco/integrationTest/jacoco.xml +sonar.java.codeCoveragePlugin=jacoco +sonar.junit.reportPaths=target/test-results/test,target/test-results/integrationTest +sonar.testExecutionReportPaths=target/test-results/jest/TESTS-results-sonar.xml +sonar.typescript.lcov.reportPaths=target/test-results/lcov.info + +sonar.sourceEncoding=UTF-8 +sonar.exclusions=src/main/webapp/content/**/*.*, src/main/webapp/i18n/*.js, target/classes/static/**/*.* + +sonar.issue.ignore.multicriteria=S3437,S4502,S4684,UndocumentedApi,BoldAndItalicTagsCheck +# Rule https://sonarcloud.io/coding_rules?open=squid%3AS3437&rule_key=squid%3AS3437 is ignored, as a JPA-managed field cannot be transient +sonar.issue.ignore.multicriteria.S3437.resourceKey=src/main/java/**/* +sonar.issue.ignore.multicriteria.S3437.ruleKey=squid:S3437 +# Rule https://sonarcloud.io/coding_rules?open=squid%3AUndocumentedApi&rule_key=squid%3AUndocumentedApi is ignored, as we want to follow "clean code" guidelines and classes, methods and arguments names should be self-explanatory +sonar.issue.ignore.multicriteria.UndocumentedApi.resourceKey=src/main/java/**/* +sonar.issue.ignore.multicriteria.UndocumentedApi.ruleKey=squid:UndocumentedApi +# Rule https://sonarcloud.io/coding_rules?open=squid%3AS4502&rule_key=squid%3AS4502 is ignored, as for JWT tokens we are not subject to CSRF attack +sonar.issue.ignore.multicriteria.S4502.resourceKey=src/main/java/**/* +sonar.issue.ignore.multicriteria.S4502.ruleKey=squid:S4502 +# Rule https://sonarcloud.io/coding_rules?open=java%3AS4684&rule_key=java%3AS4684 +sonar.issue.ignore.multicriteria.S4684.resourceKey=src/main/java/**/* +sonar.issue.ignore.multicriteria.S4684.ruleKey=java:S4684 +# Rule https://sonarcloud.io/coding_rules?open=Web%3ABoldAndItalicTagsCheck&rule_key=Web%3ABoldAndItalicTagsCheck is ignored. Even if we agree that using the "i" tag is an awful practice, this is what is recommended by http://fontawesome.io/examples/ +sonar.issue.ignore.multicriteria.BoldAndItalicTagsCheck.resourceKey=src/main/webapp/app/**/*.* +sonar.issue.ignore.multicriteria.BoldAndItalicTagsCheck.ruleKey=Web:BoldAndItalicTagsCheck diff --git a/borestop/src/main/docker/app.yml b/borestop/src/main/docker/app.yml new file mode 100644 index 0000000000000000000000000000000000000000..e864d8b4e9b1f37fd181b6e4e9ee99f1e7261422 --- /dev/null +++ b/borestop/src/main/docker/app.yml @@ -0,0 +1,16 @@ +version: '2' +services: + borestop-app: + image: borestop + environment: + - _JAVA_OPTIONS=-Xmx512m -Xms256m + - SPRING_PROFILES_ACTIVE=prod,swagger + - MANAGEMENT_METRICS_EXPORT_PROMETHEUS_ENABLED=true + - SPRING_DATASOURCE_URL=jdbc:postgresql://borestop-postgresql:5432/borestop + - JHIPSTER_SLEEP=30 # gives time for other services to boot before the application + ports: + - 8080:8080 + borestop-postgresql: + extends: + file: postgresql.yml + service: borestop-postgresql diff --git a/borestop/src/main/docker/grafana/provisioning/dashboards/JVM.json b/borestop/src/main/docker/grafana/provisioning/dashboards/JVM.json new file mode 100644 index 0000000000000000000000000000000000000000..5104abcdb90953caea0e888b536dd7ad02cf6b1b --- /dev/null +++ b/borestop/src/main/docker/grafana/provisioning/dashboards/JVM.json @@ -0,0 +1,3778 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "limit": 100, + "name": "Annotations & Alerts", + "showIn": 0, + "type": "dashboard" + }, + { + "datasource": "Prometheus", + "enable": true, + "expr": "resets(process_uptime_seconds{application=\"$application\", instance=\"$instance\"}[1m]) > 0", + "iconColor": "rgba(255, 96, 96, 1)", + "name": "Restart Detection", + "showIn": 0, + "step": "1m", + "tagKeys": "restart-tag", + "textFormat": "uptime reset", + "titleFormat": "Restart" + } + ] + }, + "description": "Dashboard for Micrometer instrumented applications (Java, Spring Boot, Micronaut)", + "editable": true, + "gnetId": 4701, + "graphTooltip": 1, + "iteration": 1553765841423, + "links": [], + "panels": [ + { + "content": "\n# Acknowledgments\n\nThank you to [Michael Weirauch](https://twitter.com/emwexx) for creating this dashboard: see original JVM (Micrometer) dashboard at [https://grafana.com/dashboards/4701](https://grafana.com/dashboards/4701)\n\n\n\n", + "gridPos": { + "h": 3, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 141, + "links": [], + "mode": "markdown", + "timeFrom": null, + "timeShift": null, + "title": "Acknowledgments", + "type": "text" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 3 + }, + "id": 125, + "panels": [], + "repeat": null, + "title": "Quick Facts", + "type": "row" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": ["rgba(245, 54, 54, 0.9)", "rgba(237, 129, 40, 0.89)", "rgba(50, 172, 45, 0.97)"], + "datasource": "Prometheus", + "decimals": 1, + "editable": true, + "error": false, + "format": "s", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 0, + "y": 4 + }, + "height": "", + "id": 63, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "70%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "process_uptime_seconds{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 14400 + } + ], + "thresholds": "", + "title": "Uptime", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": ["rgba(245, 54, 54, 0.9)", "rgba(237, 129, 40, 0.89)", "rgba(50, 172, 45, 0.97)"], + "datasource": "Prometheus", + "decimals": null, + "editable": true, + "error": false, + "format": "dateTimeAsIso", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 6, + "y": 4 + }, + "height": "", + "id": 92, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "70%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "process_start_time_seconds{application=\"$application\", instance=\"$instance\"}*1000", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 14400 + } + ], + "thresholds": "", + "title": "Start time", + "type": "singlestat", + "valueFontSize": "70%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": ["rgba(50, 172, 45, 0.97)", "rgba(237, 129, 40, 0.89)", "rgba(245, 54, 54, 0.9)"], + "datasource": "Prometheus", + "decimals": 2, + "editable": true, + "error": false, + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 12, + "y": 4 + }, + "id": 65, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "70%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "sum(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"heap\"})*100/sum(jvm_memory_max_bytes{application=\"$application\",instance=\"$instance\", area=\"heap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "", + "refId": "A", + "step": 14400 + } + ], + "thresholds": "70,90", + "title": "Heap used", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": ["rgba(50, 172, 45, 0.97)", "rgba(237, 129, 40, 0.89)", "rgba(245, 54, 54, 0.9)"], + "datasource": "Prometheus", + "decimals": 2, + "editable": true, + "error": false, + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 18, + "y": 4 + }, + "id": 75, + "interval": null, + "links": [], + "mappingType": 2, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "70%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + }, + { + "from": "-99999999999999999999999999999999", + "text": "N/A", + "to": "0" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "sum(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"nonheap\"})*100/sum(jvm_memory_max_bytes{application=\"$application\",instance=\"$instance\", area=\"nonheap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "", + "refId": "A", + "step": 14400 + } + ], + "thresholds": "70,90", + "title": "Non-Heap used", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + }, + { + "op": "=", + "text": "x", + "value": "" + } + ], + "valueName": "current" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 7 + }, + "id": 126, + "panels": [], + "repeat": null, + "title": "I/O Overview", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 8 + }, + "id": 111, + "legend": { + "avg": false, + "current": true, + "max": false, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(http_server_requests_seconds_count{application=\"$application\", instance=\"$instance\"}[1m]))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "HTTP", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Rate", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": null, + "format": "ops", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "HTTP": "#890f02", + "HTTP - 5xx": "#bf1b00" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 8 + }, + "id": 112, + "legend": { + "avg": false, + "current": true, + "max": false, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(http_server_requests_seconds_count{application=\"$application\", instance=\"$instance\", status=~\"5..\"}[1m]))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "HTTP - 5xx", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Errors", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": null, + "format": "ops", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 8 + }, + "id": 113, + "legend": { + "avg": false, + "current": true, + "max": false, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(http_server_requests_seconds_sum{application=\"$application\", instance=\"$instance\", status!~\"5..\"}[1m]))/sum(rate(http_server_requests_seconds_count{application=\"$application\", instance=\"$instance\", status!~\"5..\"}[1m]))", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "HTTP - AVG", + "refId": "A" + }, + { + "expr": "max(http_server_requests_seconds_max{application=\"$application\", instance=\"$instance\", status!~\"5..\"})", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "HTTP - MAX", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Duration", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 15 + }, + "id": 127, + "panels": [], + "repeat": null, + "title": "JVM Memory", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 16 + }, + "id": 24, + "legend": { + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"heap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "sum(jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", area=\"heap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "committed", + "refId": "B", + "step": 2400 + }, + { + "expr": "sum(jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", area=\"heap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "max", + "refId": "C", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "JVM Heap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 16 + }, + "id": 25, + "legend": { + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"nonheap\"})", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "sum(jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", area=\"nonheap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "committed", + "refId": "B", + "step": 2400 + }, + { + "expr": "sum(jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", area=\"nonheap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "max", + "refId": "C", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "JVM Non-Heap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 16 + }, + "id": 26, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "sum(jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "committed", + "refId": "B", + "step": 2400 + }, + { + "expr": "sum(jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "max", + "refId": "C", + "step": 2400 + }, + { + "expr": "process_memory_vss_bytes{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "hide": true, + "intervalFactor": 2, + "legendFormat": "vss", + "metric": "", + "refId": "D", + "step": 2400 + }, + { + "expr": "process_memory_rss_bytes{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "rss", + "refId": "E", + "step": 2400 + }, + { + "expr": "process_memory_pss_bytes{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "pss", + "refId": "F", + "step": 2400 + }, + { + "expr": "process_memory_swap_bytes{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "swap", + "refId": "G", + "step": 2400 + }, + { + "expr": "process_memory_swappss_bytes{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "swappss", + "refId": "H", + "step": 2400 + }, + { + "expr": "process_memory_pss_bytes{application=\"$application\", instance=\"$instance\"} + process_memory_swap_bytes{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "phys (pss+swap)", + "refId": "I", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "JVM Total", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": "", + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 23 + }, + "id": 128, + "panels": [], + "repeat": null, + "title": "JVM Misc", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 24 + }, + "id": 106, + "legend": { + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "system_cpu_usage{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "system", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "process_cpu_usage{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "process", + "refId": "B" + }, + { + "expr": "avg_over_time(process_cpu_usage{application=\"$application\", instance=\"$instance\"}[1h])", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "process-1h", + "refId": "C" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "CPU", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "decimals": 1, + "format": "percentunit", + "label": "", + "logBase": 1, + "max": "1", + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 6, + "y": 24 + }, + "id": 93, + "legend": { + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "system_load_average_1m{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "system-1m", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "", + "format": "time_series", + "intervalFactor": 2, + "refId": "B" + }, + { + "expr": "system_cpu_count{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "cpu", + "refId": "C" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Load", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "decimals": 1, + "format": "short", + "label": "", + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 12, + "y": 24 + }, + "id": 32, + "legend": { + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_threads_live{application=\"$application\", instance=\"$instance\"} or jvm_threads_live_threads{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "live", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "jvm_threads_daemon{application=\"$application\", instance=\"$instance\"} or jvm_threads_daemon_threads{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "daemon", + "metric": "", + "refId": "B", + "step": 2400 + }, + { + "expr": "jvm_threads_peak{application=\"$application\", instance=\"$instance\"} or jvm_threads_peak_threads{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "peak", + "refId": "C", + "step": 2400 + }, + { + "expr": "process_threads{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "process", + "refId": "D", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Threads", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "blocked": "#bf1b00", + "new": "#fce2de", + "runnable": "#7eb26d", + "terminated": "#511749", + "timed-waiting": "#c15c17", + "waiting": "#eab839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 7, + "w": 6, + "x": 18, + "y": 24 + }, + "id": 124, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_threads_states_threads{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{state}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Thread States", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "debug": "#1F78C1", + "error": "#BF1B00", + "info": "#508642", + "trace": "#6ED0E0", + "warn": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 18, + "x": 0, + "y": 31 + }, + "height": "", + "id": 91, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": true, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "error", + "yaxis": 1 + }, + { + "alias": "warn", + "yaxis": 1 + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "increase(logback_events_total{application=\"$application\", instance=\"$instance\"}[1m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{level}}", + "metric": "", + "refId": "A", + "step": 1200 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Log Events (1m)", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 18, + "y": 31 + }, + "id": 61, + "legend": { + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "process_open_fds{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "open", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "process_max_fds{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "B", + "step": 2400 + }, + { + "expr": "process_files_open{application=\"$application\", instance=\"$instance\"} or process_files_open_files{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "open", + "refId": "C" + }, + { + "expr": "process_files_max{application=\"$application\", instance=\"$instance\"} or process_files_max_files{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "max", + "refId": "D" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "File Descriptors", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": null, + "logBase": 10, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 38 + }, + "id": 129, + "panels": [], + "repeat": "persistence_counts", + "title": "JVM Memory Pools (Heap)", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 39 + }, + "id": 3, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "maxPerRow": 3, + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": "jvm_memory_pool_heap", + "scopedVars": { + "jvm_memory_pool_heap": { + "selected": false, + "text": "PS Eden Space", + "value": "PS Eden Space" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 1800 + }, + { + "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "commited", + "metric": "", + "refId": "B", + "step": 1800 + }, + { + "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "C", + "step": 1800 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$jvm_memory_pool_heap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 39 + }, + "id": 134, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "maxPerRow": 3, + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatIteration": 1553765841423, + "repeatPanelId": 3, + "scopedVars": { + "jvm_memory_pool_heap": { + "selected": false, + "text": "PS Old Gen", + "value": "PS Old Gen" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 1800 + }, + { + "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "commited", + "metric": "", + "refId": "B", + "step": 1800 + }, + { + "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "C", + "step": 1800 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$jvm_memory_pool_heap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 39 + }, + "id": 135, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "maxPerRow": 3, + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatIteration": 1553765841423, + "repeatPanelId": 3, + "scopedVars": { + "jvm_memory_pool_heap": { + "selected": false, + "text": "PS Survivor Space", + "value": "PS Survivor Space" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 1800 + }, + { + "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "commited", + "metric": "", + "refId": "B", + "step": 1800 + }, + { + "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "C", + "step": 1800 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$jvm_memory_pool_heap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 46 + }, + "id": 130, + "panels": [], + "repeat": null, + "title": "JVM Memory Pools (Non-Heap)", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 47 + }, + "id": 78, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "maxPerRow": 3, + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": "jvm_memory_pool_nonheap", + "scopedVars": { + "jvm_memory_pool_nonheap": { + "selected": false, + "text": "Metaspace", + "value": "Metaspace" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 1800 + }, + { + "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "commited", + "metric": "", + "refId": "B", + "step": 1800 + }, + { + "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "C", + "step": 1800 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$jvm_memory_pool_nonheap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 47 + }, + "id": 136, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "maxPerRow": 3, + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatIteration": 1553765841423, + "repeatPanelId": 78, + "scopedVars": { + "jvm_memory_pool_nonheap": { + "selected": false, + "text": "Compressed Class Space", + "value": "Compressed Class Space" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 1800 + }, + { + "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "commited", + "metric": "", + "refId": "B", + "step": 1800 + }, + { + "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "C", + "step": 1800 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$jvm_memory_pool_nonheap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 47 + }, + "id": 137, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "maxPerRow": 3, + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatIteration": 1553765841423, + "repeatPanelId": 78, + "scopedVars": { + "jvm_memory_pool_nonheap": { + "selected": false, + "text": "Code Cache", + "value": "Code Cache" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 1800 + }, + { + "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "commited", + "metric": "", + "refId": "B", + "step": 1800 + }, + { + "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "C", + "step": 1800 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$jvm_memory_pool_nonheap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 54 + }, + "id": 131, + "panels": [], + "repeat": null, + "title": "Garbage Collection", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 55 + }, + "id": 98, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(jvm_gc_pause_seconds_count{application=\"$application\", instance=\"$instance\"}[1m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "{{action}} ({{cause}})", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Collections", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "ops", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": "", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 55 + }, + "id": 101, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(jvm_gc_pause_seconds_sum{application=\"$application\", instance=\"$instance\"}[1m])/rate(jvm_gc_pause_seconds_count{application=\"$application\", instance=\"$instance\"}[1m])", + "format": "time_series", + "hide": false, + "instant": false, + "intervalFactor": 1, + "legendFormat": "avg {{action}} ({{cause}})", + "refId": "A" + }, + { + "expr": "jvm_gc_pause_seconds_max{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "hide": false, + "instant": false, + "intervalFactor": 1, + "legendFormat": "max {{action}} ({{cause}})", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Pause Durations", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": "", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 55 + }, + "id": 99, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(jvm_gc_memory_allocated_bytes_total{application=\"$application\", instance=\"$instance\"}[1m])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "allocated", + "refId": "A" + }, + { + "expr": "rate(jvm_gc_memory_promoted_bytes_total{application=\"$application\", instance=\"$instance\"}[1m])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "promoted", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Allocated/Promoted", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 62 + }, + "id": 132, + "panels": [], + "repeat": null, + "title": "Classloading", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 63 + }, + "id": 37, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_classes_loaded{application=\"$application\", instance=\"$instance\"} or jvm_classes_loaded_classes{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "loaded", + "metric": "", + "refId": "A", + "step": 1200 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Classes loaded", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 63 + }, + "id": 38, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "delta(jvm_classes_loaded{application=\"$application\",instance=\"$instance\"}[5m]) or delta(jvm_classes_loaded_classes{application=\"$application\",instance=\"$instance\"}[5m])", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "delta", + "metric": "", + "refId": "A", + "step": 1200 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Class delta (5m)", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["ops", "short"], + "yaxes": [ + { + "decimals": null, + "format": "short", + "label": "", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 70 + }, + "id": 133, + "panels": [], + "repeat": null, + "title": "Buffer Pools", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 71 + }, + "id": 33, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_buffer_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"direct\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "jvm_buffer_total_capacity_bytes{application=\"$application\", instance=\"$instance\", id=\"direct\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "capacity", + "metric": "", + "refId": "B", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Direct Buffers", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 6, + "y": 71 + }, + "id": 83, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_buffer_count{application=\"$application\", instance=\"$instance\", id=\"direct\"} or jvm_buffer_count_buffers{application=\"$application\", instance=\"$instance\", id=\"direct\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "count", + "metric": "", + "refId": "A", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Direct Buffers", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 12, + "y": 71 + }, + "id": 85, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_buffer_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"mapped\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "jvm_buffer_total_capacity_bytes{application=\"$application\", instance=\"$instance\", id=\"mapped\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "capacity", + "metric": "", + "refId": "B", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Mapped Buffers", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 18, + "y": 71 + }, + "id": 84, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_buffer_count{application=\"$application\", instance=\"$instance\", id=\"mapped\"} or jvm_buffer_count_buffers{application=\"$application\", instance=\"$instance\", id=\"mapped\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "count", + "metric": "", + "refId": "A", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Mapped Buffers", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "refresh": "10s", + "schemaVersion": 18, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "allValue": null, + "current": { + "text": "test", + "value": "test" + }, + "datasource": "Prometheus", + "definition": "", + "hide": 0, + "includeAll": false, + "label": "Application", + "multi": false, + "name": "application", + "options": [], + "query": "label_values(application)", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allFormat": "glob", + "allValue": null, + "current": { + "text": "localhost:8080", + "value": "localhost:8080" + }, + "datasource": "Prometheus", + "definition": "", + "hide": 0, + "includeAll": false, + "label": "Instance", + "multi": false, + "multiFormat": "glob", + "name": "instance", + "options": [], + "query": "label_values(jvm_memory_used_bytes{application=\"$application\"}, instance)", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allFormat": "glob", + "allValue": null, + "current": { + "text": "All", + "value": "$__all" + }, + "datasource": "Prometheus", + "definition": "", + "hide": 0, + "includeAll": true, + "label": "JVM Memory Pools Heap", + "multi": false, + "multiFormat": "glob", + "name": "jvm_memory_pool_heap", + "options": [], + "query": "label_values(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"heap\"},id)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allFormat": "glob", + "allValue": null, + "current": { + "text": "All", + "value": "$__all" + }, + "datasource": "Prometheus", + "definition": "", + "hide": 0, + "includeAll": true, + "label": "JVM Memory Pools Non-Heap", + "multi": false, + "multiFormat": "glob", + "name": "jvm_memory_pool_nonheap", + "options": [], + "query": "label_values(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"nonheap\"},id)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 2, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + } + ] + }, + "time": { + "from": "now-30m", + "to": "now" + }, + "timepicker": { + "now": true, + "refresh_intervals": ["5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d"], + "time_options": ["5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d"] + }, + "timezone": "browser", + "title": "JVM (Micrometer)", + "uid": "Ud1CFe3iz", + "version": 1 +} diff --git a/borestop/src/main/docker/grafana/provisioning/dashboards/dashboard.yml b/borestop/src/main/docker/grafana/provisioning/dashboards/dashboard.yml new file mode 100644 index 0000000000000000000000000000000000000000..4817a83a5edef41d6ab96885d54d417f5cf80426 --- /dev/null +++ b/borestop/src/main/docker/grafana/provisioning/dashboards/dashboard.yml @@ -0,0 +1,11 @@ +apiVersion: 1 + +providers: + - name: 'Prometheus' + orgId: 1 + folder: '' + type: file + disableDeletion: false + editable: true + options: + path: /etc/grafana/provisioning/dashboards diff --git a/borestop/src/main/docker/grafana/provisioning/datasources/datasource.yml b/borestop/src/main/docker/grafana/provisioning/datasources/datasource.yml new file mode 100644 index 0000000000000000000000000000000000000000..57b2bb3eafdfb8a4356a4bbb7dba77439db8ea90 --- /dev/null +++ b/borestop/src/main/docker/grafana/provisioning/datasources/datasource.yml @@ -0,0 +1,50 @@ +apiVersion: 1 + +# list of datasources that should be deleted from the database +deleteDatasources: + - name: Prometheus + orgId: 1 + +# list of datasources to insert/update depending +# whats available in the database +datasources: + # <string, required> name of the datasource. Required + - name: Prometheus + # <string, required> datasource type. Required + type: prometheus + # <string, required> access mode. direct or proxy. Required + access: proxy + # <int> org id. will default to orgId 1 if not specified + orgId: 1 + # <string> url + # On MacOS, replace localhost by host.docker.internal + url: http://localhost:9090 + # <string> database password, if used + password: + # <string> database user, if used + user: + # <string> database name, if used + database: + # <bool> enable/disable basic auth + basicAuth: false + # <string> basic auth username + basicAuthUser: admin + # <string> basic auth password + basicAuthPassword: admin + # <bool> enable/disable with credentials headers + withCredentials: + # <bool> mark as default datasource. Max one per org + isDefault: true + # <map> fields that will be converted to json and stored in json_data + jsonData: + graphiteVersion: '1.1' + tlsAuth: false + tlsAuthWithCACert: false + # <string> json object of data that will be encrypted. + secureJsonData: + tlsCACert: '...' + tlsClientCert: '...' + tlsClientKey: '...' + version: 1 + # <bool> allow users to edit datasources from the UI. + editable: true diff --git a/borestop/src/main/docker/monitoring.yml b/borestop/src/main/docker/monitoring.yml new file mode 100644 index 0000000000000000000000000000000000000000..bac6b99c844e06fd5114ea124049b2d7b4d2ce0f --- /dev/null +++ b/borestop/src/main/docker/monitoring.yml @@ -0,0 +1,26 @@ +version: '2' +services: + borestop-prometheus: + image: prom/prometheus:v2.18.1 + volumes: + - ./prometheus/:/etc/prometheus/ + command: + - '--config.file=/etc/prometheus/prometheus.yml' + ports: + - 9090:9090 + # On MacOS, remove next line and replace localhost by host.docker.internal in prometheus/prometheus.yml and + # grafana/provisioning/datasources/datasource.yml + network_mode: 'host' # to test locally running service + borestop-grafana: + image: grafana/grafana:7.0.1 + volumes: + - ./grafana/provisioning/:/etc/grafana/provisioning/ + environment: + - GF_SECURITY_ADMIN_PASSWORD=admin + - GF_USERS_ALLOW_SIGN_UP=false + - GF_INSTALL_PLUGINS=grafana-piechart-panel + ports: + - 3000:3000 + # On MacOS, remove next line and replace localhost by host.docker.internal in prometheus/prometheus.yml and + # grafana/provisioning/datasources/datasource.yml + network_mode: 'host' # to test locally running service diff --git a/borestop/src/main/docker/postgresql.yml b/borestop/src/main/docker/postgresql.yml new file mode 100644 index 0000000000000000000000000000000000000000..21dfb387e303775bfb84bdced78dc8f92035fb74 --- /dev/null +++ b/borestop/src/main/docker/postgresql.yml @@ -0,0 +1,12 @@ +version: '2' +services: + borestop-postgresql: + image: postgres:12.3 + # volumes: + # - ~/volumes/jhipster/borestop/postgresql/:/var/lib/postgresql/data/ + environment: + - POSTGRES_USER=borestop + - POSTGRES_PASSWORD= + - POSTGRES_HOST_AUTH_METHOD=trust + ports: + - 5432:5432 diff --git a/borestop/src/main/docker/prometheus/prometheus.yml b/borestop/src/main/docker/prometheus/prometheus.yml new file mode 100644 index 0000000000000000000000000000000000000000..b370a2f49569ece2402b1601f9d0511c43081fab --- /dev/null +++ b/borestop/src/main/docker/prometheus/prometheus.yml @@ -0,0 +1,31 @@ +# Sample global config for monitoring JHipster applications +global: + scrape_interval: 15s # By default, scrape targets every 15 seconds. + evaluation_interval: 15s # By default, scrape targets every 15 seconds. + # scrape_timeout is set to the global default (10s). + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'jhipster' + +# A scrape configuration containing exactly one endpoint to scrape: +# Here it's Prometheus itself. +scrape_configs: + # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. + - job_name: 'prometheus' + + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + + # scheme defaults to 'http' enable https in case your application is server via https + #scheme: https + # basic auth is not needed by default. See https://www.jhipster.tech/monitoring/#configuring-metrics-forwarding for details + #basic_auth: + # username: admin + # password: admin + metrics_path: /management/prometheus + static_configs: + - targets: + # On MacOS, replace localhost by host.docker.internal + - localhost:8080 diff --git a/borestop/src/main/docker/sonar.yml b/borestop/src/main/docker/sonar.yml new file mode 100644 index 0000000000000000000000000000000000000000..001568b473827791b670b0fd92112472df76ec8f --- /dev/null +++ b/borestop/src/main/docker/sonar.yml @@ -0,0 +1,7 @@ +version: '2' +services: + borestop-sonar: + image: sonarqube:8.3.1-community + ports: + - 9001:9000 + - 9092:9092 diff --git a/borestop/src/main/java/com/ippon/borestop/ApplicationWebXml.java b/borestop/src/main/java/com/ippon/borestop/ApplicationWebXml.java new file mode 100644 index 0000000000000000000000000000000000000000..ce00b43981d62e1342f90c579f401e345e27b694 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/ApplicationWebXml.java @@ -0,0 +1,19 @@ +package com.ippon.borestop; + +import io.github.jhipster.config.DefaultProfileUtil; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; + +/** + * This is a helper Java class that provides an alternative to creating a {@code web.xml}. + * This will be invoked only when the application is deployed to a Servlet container like Tomcat, JBoss etc. + */ +public class ApplicationWebXml extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + // set a default to use when no profile is configured. + DefaultProfileUtil.addDefaultProfile(application.application()); + return application.sources(BorestopApp.class); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/BorestopApp.java b/borestop/src/main/java/com/ippon/borestop/BorestopApp.java new file mode 100644 index 0000000000000000000000000000000000000000..015bb8093fa43831e47bc5d4bd413e6ef68092fc --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/BorestopApp.java @@ -0,0 +1,104 @@ +package com.ippon.borestop; + +import com.ippon.borestop.config.ApplicationProperties; +import io.github.jhipster.config.DefaultProfileUtil; +import io.github.jhipster.config.JHipsterConstants; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.Collection; +import javax.annotation.PostConstruct; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.core.env.Environment; + +@SpringBootApplication +@EnableConfigurationProperties({ LiquibaseProperties.class, ApplicationProperties.class }) +public class BorestopApp { + private static final Logger log = LoggerFactory.getLogger(BorestopApp.class); + + private final Environment env; + + public BorestopApp(Environment env) { + this.env = env; + } + + /** + * Initializes borestop. + * <p> + * Spring profiles can be configured with a program argument --spring.profiles.active=your-active-profile + * <p> + * You can find more information on how profiles work with JHipster on <a href="https://www.jhipster.tech/profiles/">https://www.jhipster.tech/profiles/</a>. + */ + @PostConstruct + public void initApplication() { + Collection<String> activeProfiles = Arrays.asList(env.getActiveProfiles()); + if ( + activeProfiles.contains(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT) && + activeProfiles.contains(JHipsterConstants.SPRING_PROFILE_PRODUCTION) + ) { + log.error( + "You have misconfigured your application! It should not run " + "with both the 'dev' and 'prod' profiles at the same time." + ); + } + if ( + activeProfiles.contains(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT) && + activeProfiles.contains(JHipsterConstants.SPRING_PROFILE_CLOUD) + ) { + log.error( + "You have misconfigured your application! It should not " + "run with both the 'dev' and 'cloud' profiles at the same time." + ); + } + } + + /** + * Main method, used to run the application. + * + * @param args the command line arguments. + */ + public static void main(String[] args) { + SpringApplication app = new SpringApplication(BorestopApp.class); + DefaultProfileUtil.addDefaultProfile(app); + Environment env = app.run(args).getEnvironment(); + logApplicationStartup(env); + } + + private static void logApplicationStartup(Environment env) { + String protocol = "http"; + if (env.getProperty("server.ssl.key-store") != null) { + protocol = "https"; + } + String serverPort = env.getProperty("server.port"); + String contextPath = env.getProperty("server.servlet.context-path"); + if (StringUtils.isBlank(contextPath)) { + contextPath = "/"; + } + String hostAddress = "localhost"; + try { + hostAddress = InetAddress.getLocalHost().getHostAddress(); + } catch (UnknownHostException e) { + log.warn("The host name could not be determined, using `localhost` as fallback"); + } + log.info( + "\n----------------------------------------------------------\n\t" + + "Application '{}' is running! Access URLs:\n\t" + + "Local: \t\t{}://localhost:{}{}\n\t" + + "External: \t{}://{}:{}{}\n\t" + + "Profile(s): \t{}\n----------------------------------------------------------", + env.getProperty("spring.application.name"), + protocol, + serverPort, + contextPath, + protocol, + hostAddress, + serverPort, + contextPath, + env.getActiveProfiles() + ); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/aop/logging/LoggingAspect.java b/borestop/src/main/java/com/ippon/borestop/aop/logging/LoggingAspect.java new file mode 100644 index 0000000000000000000000000000000000000000..df71391a5dab74e7dffc424ba64b4a0c92cb8264 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/aop/logging/LoggingAspect.java @@ -0,0 +1,108 @@ +package com.ippon.borestop.aop.logging; + +import io.github.jhipster.config.JHipsterConstants; +import java.util.Arrays; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.env.Environment; +import org.springframework.core.env.Profiles; + +/** + * Aspect for logging execution of service and repository Spring components. + * + * By default, it only runs with the "dev" profile. + */ +@Aspect +public class LoggingAspect { + private final Environment env; + + public LoggingAspect(Environment env) { + this.env = env; + } + + /** + * Pointcut that matches all repositories, services and Web REST endpoints. + */ + @Pointcut( + "within(@org.springframework.stereotype.Repository *)" + + " || within(@org.springframework.stereotype.Service *)" + + " || within(@org.springframework.web.bind.annotation.RestController *)" + ) + public void springBeanPointcut() { + // Method is empty as this is just a Pointcut, the implementations are in the advices. + } + + /** + * Pointcut that matches all Spring beans in the application's main packages. + */ + @Pointcut( + "within(com.ippon.borestop.repository..*)" + " || within(com.ippon.borestop.service..*)" + " || within(com.ippon.borestop.web.rest..*)" + ) + public void applicationPackagePointcut() { + // Method is empty as this is just a Pointcut, the implementations are in the advices. + } + + /** + * Retrieves the {@link Logger} associated to the given {@link JoinPoint}. + * + * @param joinPoint join point we want the logger for. + * @return {@link Logger} associated to the given {@link JoinPoint}. + */ + private Logger logger(JoinPoint joinPoint) { + return LoggerFactory.getLogger(joinPoint.getSignature().getDeclaringTypeName()); + } + + /** + * Advice that logs methods throwing exceptions. + * + * @param joinPoint join point for advice. + * @param e exception. + */ + @AfterThrowing(pointcut = "applicationPackagePointcut() && springBeanPointcut()", throwing = "e") + public void logAfterThrowing(JoinPoint joinPoint, Throwable e) { + if (env.acceptsProfiles(Profiles.of(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT))) { + logger(joinPoint) + .error( + "Exception in {}() with cause = \'{}\' and exception = \'{}\'", + joinPoint.getSignature().getName(), + e.getCause() != null ? e.getCause() : "NULL", + e.getMessage(), + e + ); + } else { + logger(joinPoint) + .error("Exception in {}() with cause = {}", joinPoint.getSignature().getName(), e.getCause() != null ? e.getCause() : "NULL"); + } + } + + /** + * Advice that logs when a method is entered and exited. + * + * @param joinPoint join point for advice. + * @return result. + * @throws Throwable throws {@link IllegalArgumentException}. + */ + @Around("applicationPackagePointcut() && springBeanPointcut()") + public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable { + Logger log = logger(joinPoint); + if (log.isDebugEnabled()) { + log.debug("Enter: {}() with argument[s] = {}", joinPoint.getSignature().getName(), Arrays.toString(joinPoint.getArgs())); + } + try { + Object result = joinPoint.proceed(); + if (log.isDebugEnabled()) { + log.debug("Exit: {}() with result = {}", joinPoint.getSignature().getName(), result); + } + return result; + } catch (IllegalArgumentException e) { + log.error("Illegal argument: {} in {}()", Arrays.toString(joinPoint.getArgs()), joinPoint.getSignature().getName()); + throw e; + } + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/config/ApplicationProperties.java b/borestop/src/main/java/com/ippon/borestop/config/ApplicationProperties.java new file mode 100644 index 0000000000000000000000000000000000000000..874f412ab1c2417c133bbe96228de741b77ef170 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/ApplicationProperties.java @@ -0,0 +1,12 @@ +package com.ippon.borestop.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * Properties specific to Borestop. + * <p> + * Properties are configured in the {@code application.yml} file. + * See {@link io.github.jhipster.config.JHipsterProperties} for a good example. + */ +@ConfigurationProperties(prefix = "application", ignoreUnknownFields = false) +public class ApplicationProperties {} diff --git a/borestop/src/main/java/com/ippon/borestop/config/AsyncConfiguration.java b/borestop/src/main/java/com/ippon/borestop/config/AsyncConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..ffc95958c6c97cfd73a0140bde1d18e45551b8a3 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/AsyncConfiguration.java @@ -0,0 +1,45 @@ +package com.ippon.borestop.config; + +import io.github.jhipster.async.ExceptionHandlingAsyncTaskExecutor; +import java.util.concurrent.Executor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; +import org.springframework.aop.interceptor.SimpleAsyncUncaughtExceptionHandler; +import org.springframework.boot.autoconfigure.task.TaskExecutionProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.AsyncConfigurer; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +@Configuration +@EnableAsync +@EnableScheduling +public class AsyncConfiguration implements AsyncConfigurer { + private final Logger log = LoggerFactory.getLogger(AsyncConfiguration.class); + + private final TaskExecutionProperties taskExecutionProperties; + + public AsyncConfiguration(TaskExecutionProperties taskExecutionProperties) { + this.taskExecutionProperties = taskExecutionProperties; + } + + @Override + @Bean(name = "taskExecutor") + public Executor getAsyncExecutor() { + log.debug("Creating Async Task Executor"); + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(taskExecutionProperties.getPool().getCoreSize()); + executor.setMaxPoolSize(taskExecutionProperties.getPool().getMaxSize()); + executor.setQueueCapacity(taskExecutionProperties.getPool().getQueueCapacity()); + executor.setThreadNamePrefix(taskExecutionProperties.getThreadNamePrefix()); + return new ExceptionHandlingAsyncTaskExecutor(executor); + } + + @Override + public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { + return new SimpleAsyncUncaughtExceptionHandler(); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/config/CloudDatabaseConfiguration.java b/borestop/src/main/java/com/ippon/borestop/config/CloudDatabaseConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..c962ed93bdfdcab204735728415feb74edd46314 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/CloudDatabaseConfiguration.java @@ -0,0 +1,24 @@ +package com.ippon.borestop.config; + +import io.github.jhipster.config.JHipsterConstants; +import javax.sql.DataSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.config.java.AbstractCloudConfig; +import org.springframework.context.annotation.*; + +@Configuration +@Profile(JHipsterConstants.SPRING_PROFILE_CLOUD) +public class CloudDatabaseConfiguration extends AbstractCloudConfig { + private final Logger log = LoggerFactory.getLogger(CloudDatabaseConfiguration.class); + + private static final String CLOUD_CONFIGURATION_HIKARI_PREFIX = "spring.datasource.hikari"; + + @Bean + @ConfigurationProperties(CLOUD_CONFIGURATION_HIKARI_PREFIX) + public DataSource dataSource() { + log.info("Configuring JDBC datasource from a cloud provider"); + return connectionFactory().dataSource(); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/config/Constants.java b/borestop/src/main/java/com/ippon/borestop/config/Constants.java new file mode 100644 index 0000000000000000000000000000000000000000..34304cb36f63858163dd37bd39a122ef7becadb4 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/Constants.java @@ -0,0 +1,15 @@ +package com.ippon.borestop.config; + +/** + * Application constants. + */ +public final class Constants { + // Regex for acceptable logins + public static final String LOGIN_REGEX = "^(?>[a-zA-Z0-9!$&*+=?^_`{|}~.-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*)|(?>[_.@A-Za-z0-9-]+)$"; + + public static final String SYSTEM_ACCOUNT = "system"; + public static final String DEFAULT_LANGUAGE = "en"; + public static final String ANONYMOUS_USER = "anonymoususer"; + + private Constants() {} +} diff --git a/borestop/src/main/java/com/ippon/borestop/config/DatabaseConfiguration.java b/borestop/src/main/java/com/ippon/borestop/config/DatabaseConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..fbdadc25d00dee7242cae6b6f0a92baaef201b25 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/DatabaseConfiguration.java @@ -0,0 +1,56 @@ +package com.ippon.borestop.config; + +import io.github.jhipster.config.JHipsterConstants; +import io.github.jhipster.config.h2.H2ConfigurationHelper; +import java.sql.SQLException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import org.springframework.core.env.Environment; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@Configuration +@EnableJpaRepositories("com.ippon.borestop.repository") +@EnableJpaAuditing(auditorAwareRef = "springSecurityAuditorAware") +@EnableTransactionManagement +public class DatabaseConfiguration { + private final Logger log = LoggerFactory.getLogger(DatabaseConfiguration.class); + + private final Environment env; + + public DatabaseConfiguration(Environment env) { + this.env = env; + } + + /** + * Open the TCP port for the H2 database, so it is available remotely. + * + * @return the H2 database TCP server. + * @throws SQLException if the server failed to start. + */ + @Bean(initMethod = "start", destroyMethod = "stop") + @Profile(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT) + public Object h2TCPServer() throws SQLException { + String port = getValidPortForH2(); + log.debug("H2 database is available on port {}", port); + return H2ConfigurationHelper.createServer(port); + } + + private String getValidPortForH2() { + int port = Integer.parseInt(env.getProperty("server.port")); + if (port < 10000) { + port = 10000 + port; + } else { + if (port < 63536) { + port = port + 2000; + } else { + port = port - 2000; + } + } + return String.valueOf(port); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/config/DateTimeFormatConfiguration.java b/borestop/src/main/java/com/ippon/borestop/config/DateTimeFormatConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..e5eb685771c91368e6d0222b7921b82df94efaed --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/DateTimeFormatConfiguration.java @@ -0,0 +1,20 @@ +package com.ippon.borestop.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.format.FormatterRegistry; +import org.springframework.format.datetime.standard.DateTimeFormatterRegistrar; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * Configure the converters to use the ISO format for dates by default. + */ +@Configuration +public class DateTimeFormatConfiguration implements WebMvcConfigurer { + + @Override + public void addFormatters(FormatterRegistry registry) { + DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar(); + registrar.setUseIsoFormat(true); + registrar.registerFormatters(registry); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/config/JacksonConfiguration.java b/borestop/src/main/java/com/ippon/borestop/config/JacksonConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..515b3f44cd70b1b226fd43979e599b4e695b6891 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/JacksonConfiguration.java @@ -0,0 +1,51 @@ +package com.ippon.borestop.config; + +import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module; +import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.zalando.problem.ProblemModule; +import org.zalando.problem.violations.ConstraintViolationProblemModule; + +@Configuration +public class JacksonConfiguration { + + /** + * Support for Java date and time API. + * @return the corresponding Jackson module. + */ + @Bean + public JavaTimeModule javaTimeModule() { + return new JavaTimeModule(); + } + + @Bean + public Jdk8Module jdk8TimeModule() { + return new Jdk8Module(); + } + + /* + * Support for Hibernate types in Jackson. + */ + @Bean + public Hibernate5Module hibernate5Module() { + return new Hibernate5Module(); + } + + /* + * Module for serialization/deserialization of RFC7807 Problem. + */ + @Bean + public ProblemModule problemModule() { + return new ProblemModule(); + } + + /* + * Module for serialization/deserialization of ConstraintViolationProblem. + */ + @Bean + public ConstraintViolationProblemModule constraintViolationProblemModule() { + return new ConstraintViolationProblemModule(); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/config/LiquibaseConfiguration.java b/borestop/src/main/java/com/ippon/borestop/config/LiquibaseConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..e5305f2a3e0947997cf15f7ba13af85e25235f18 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/LiquibaseConfiguration.java @@ -0,0 +1,68 @@ +package com.ippon.borestop.config; + +import io.github.jhipster.config.JHipsterConstants; +import io.github.jhipster.config.liquibase.SpringLiquibaseUtil; +import java.util.concurrent.Executor; +import javax.sql.DataSource; +import liquibase.integration.spring.SpringLiquibase; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; +import org.springframework.boot.autoconfigure.liquibase.LiquibaseDataSource; +import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.core.env.Profiles; + +@Configuration +public class LiquibaseConfiguration { + private final Logger log = LoggerFactory.getLogger(LiquibaseConfiguration.class); + + private final Environment env; + + public LiquibaseConfiguration(Environment env) { + this.env = env; + } + + @Bean + public SpringLiquibase liquibase( + @Qualifier("taskExecutor") Executor executor, + @LiquibaseDataSource ObjectProvider<DataSource> liquibaseDataSource, + LiquibaseProperties liquibaseProperties, + ObjectProvider<DataSource> dataSource, + DataSourceProperties dataSourceProperties + ) { + // If you don't want Liquibase to start asynchronously, substitute by this: + // SpringLiquibase liquibase = SpringLiquibaseUtil.createSpringLiquibase(liquibaseDataSource.getIfAvailable(), liquibaseProperties, dataSource.getIfUnique(), dataSourceProperties); + SpringLiquibase liquibase = SpringLiquibaseUtil.createAsyncSpringLiquibase( + this.env, + executor, + liquibaseDataSource.getIfAvailable(), + liquibaseProperties, + dataSource.getIfUnique(), + dataSourceProperties + ); + liquibase.setChangeLog("classpath:config/liquibase/master.xml"); + liquibase.setContexts(liquibaseProperties.getContexts()); + liquibase.setDefaultSchema(liquibaseProperties.getDefaultSchema()); + liquibase.setLiquibaseSchema(liquibaseProperties.getLiquibaseSchema()); + liquibase.setLiquibaseTablespace(liquibaseProperties.getLiquibaseTablespace()); + liquibase.setDatabaseChangeLogLockTable(liquibaseProperties.getDatabaseChangeLogLockTable()); + liquibase.setDatabaseChangeLogTable(liquibaseProperties.getDatabaseChangeLogTable()); + liquibase.setDropFirst(liquibaseProperties.isDropFirst()); + liquibase.setLabels(liquibaseProperties.getLabels()); + liquibase.setChangeLogParameters(liquibaseProperties.getParameters()); + liquibase.setRollbackFile(liquibaseProperties.getRollbackFile()); + liquibase.setTestRollbackOnUpdate(liquibaseProperties.isTestRollbackOnUpdate()); + if (env.acceptsProfiles(Profiles.of(JHipsterConstants.SPRING_PROFILE_NO_LIQUIBASE))) { + liquibase.setShouldRun(false); + } else { + liquibase.setShouldRun(liquibaseProperties.isEnabled()); + log.debug("Configuring Liquibase"); + } + return liquibase; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/config/LocaleConfiguration.java b/borestop/src/main/java/com/ippon/borestop/config/LocaleConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..22c40b423cb398cffb94139abb03bc31e770b404 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/LocaleConfiguration.java @@ -0,0 +1,26 @@ +package com.ippon.borestop.config; + +import io.github.jhipster.config.locale.AngularCookieLocaleResolver; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.LocaleResolver; +import org.springframework.web.servlet.config.annotation.*; +import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; + +@Configuration +public class LocaleConfiguration implements WebMvcConfigurer { + + @Bean + public LocaleResolver localeResolver() { + AngularCookieLocaleResolver cookieLocaleResolver = new AngularCookieLocaleResolver(); + cookieLocaleResolver.setCookieName("NG_TRANSLATE_LANG_KEY"); + return cookieLocaleResolver; + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor(); + localeChangeInterceptor.setParamName("language"); + registry.addInterceptor(localeChangeInterceptor); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/config/LoggingAspectConfiguration.java b/borestop/src/main/java/com/ippon/borestop/config/LoggingAspectConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..63268ca1fd25c45d457214cb95e3fccf82ed34d8 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/LoggingAspectConfiguration.java @@ -0,0 +1,17 @@ +package com.ippon.borestop.config; + +import com.ippon.borestop.aop.logging.LoggingAspect; +import io.github.jhipster.config.JHipsterConstants; +import org.springframework.context.annotation.*; +import org.springframework.core.env.Environment; + +@Configuration +@EnableAspectJAutoProxy +public class LoggingAspectConfiguration { + + @Bean + @Profile(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT) + public LoggingAspect loggingAspect(Environment env) { + return new LoggingAspect(env); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/config/LoggingConfiguration.java b/borestop/src/main/java/com/ippon/borestop/config/LoggingConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..5b584f0117dcc2a407fd127c74b720d2e872fb7d --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/LoggingConfiguration.java @@ -0,0 +1,51 @@ +package com.ippon.borestop.config; + +import static io.github.jhipster.config.logging.LoggingUtils.*; + +import ch.qos.logback.classic.LoggerContext; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.github.jhipster.config.JHipsterProperties; +import java.util.HashMap; +import java.util.Map; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +/* + * Configures the console and Logstash log appenders from the app properties + */ +@Configuration +public class LoggingConfiguration { + + public LoggingConfiguration( + @Value("${spring.application.name}") String appName, + @Value("${server.port}") String serverPort, + JHipsterProperties jHipsterProperties, + ObjectMapper mapper + ) + throws JsonProcessingException { + LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); + + Map<String, String> map = new HashMap<>(); + map.put("app_name", appName); + map.put("app_port", serverPort); + String customFields = mapper.writeValueAsString(map); + + JHipsterProperties.Logging loggingProperties = jHipsterProperties.getLogging(); + JHipsterProperties.Logging.Logstash logstashProperties = loggingProperties.getLogstash(); + + if (loggingProperties.isUseJsonFormat()) { + addJsonConsoleAppender(context, customFields); + } + if (logstashProperties.isEnabled()) { + addLogstashTcpSocketAppender(context, customFields, logstashProperties); + } + if (loggingProperties.isUseJsonFormat() || logstashProperties.isEnabled()) { + addContextListener(context, customFields, loggingProperties); + } + if (jHipsterProperties.getMetrics().getLogs().isEnabled()) { + setMetricsMarkerLogbackFilter(context, loggingProperties.isUseJsonFormat()); + } + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/config/SecurityConfiguration.java b/borestop/src/main/java/com/ippon/borestop/config/SecurityConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..728f8a2aab90219729f84c1e3f23323e4723510a --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/SecurityConfiguration.java @@ -0,0 +1,99 @@ +package com.ippon.borestop.config; + +import com.ippon.borestop.security.*; +import com.ippon.borestop.security.jwt.*; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; +import org.springframework.http.HttpMethod; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.builders.WebSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.security.web.header.writers.ReferrerPolicyHeaderWriter; +import org.springframework.web.filter.CorsFilter; +import org.zalando.problem.spring.web.advice.security.SecurityProblemSupport; + +@EnableWebSecurity +@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) +@Import(SecurityProblemSupport.class) +public class SecurityConfiguration extends WebSecurityConfigurerAdapter { + private final TokenProvider tokenProvider; + + private final CorsFilter corsFilter; + private final SecurityProblemSupport problemSupport; + + public SecurityConfiguration(TokenProvider tokenProvider, CorsFilter corsFilter, SecurityProblemSupport problemSupport) { + this.tokenProvider = tokenProvider; + this.corsFilter = corsFilter; + this.problemSupport = problemSupport; + } + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + @Override + public void configure(WebSecurity web) { + web + .ignoring() + .antMatchers(HttpMethod.OPTIONS, "/**") + .antMatchers("/app/**/*.{js,html}") + .antMatchers("/i18n/**") + .antMatchers("/content/**") + .antMatchers("/h2-console/**") + .antMatchers("/swagger-ui/index.html") + .antMatchers("/test/**"); + } + + @Override + public void configure(HttpSecurity http) throws Exception { + // @formatter:off + http + .csrf() + .disable() + .addFilterBefore(corsFilter, UsernamePasswordAuthenticationFilter.class) + .exceptionHandling() + .authenticationEntryPoint(problemSupport) + .accessDeniedHandler(problemSupport) + .and() + .headers() + .contentSecurityPolicy("default-src 'self'; frame-src 'self' data:; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://storage.googleapis.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:") + .and() + .referrerPolicy(ReferrerPolicyHeaderWriter.ReferrerPolicy.STRICT_ORIGIN_WHEN_CROSS_ORIGIN) + .and() + .featurePolicy("geolocation 'none'; midi 'none'; sync-xhr 'none'; microphone 'none'; camera 'none'; magnetometer 'none'; gyroscope 'none'; speaker 'none'; fullscreen 'self'; payment 'none'") + .and() + .frameOptions() + .deny() + .and() + .sessionManagement() + .sessionCreationPolicy(SessionCreationPolicy.STATELESS) + .and() + .authorizeRequests() + .antMatchers("/api/authenticate").permitAll() + .antMatchers("/api/register").permitAll() + .antMatchers("/api/activate").permitAll() + .antMatchers("/api/account/reset-password/init").permitAll() + .antMatchers("/api/account/reset-password/finish").permitAll() + .antMatchers("/api/**").authenticated() + .antMatchers("/management/health").permitAll() + .antMatchers("/management/info").permitAll() + .antMatchers("/management/prometheus").permitAll() + .antMatchers("/management/**").hasAuthority(AuthoritiesConstants.ADMIN) + .and() + .httpBasic() + .and() + .apply(securityConfigurerAdapter()); + // @formatter:on + } + + private JWTConfigurer securityConfigurerAdapter() { + return new JWTConfigurer(tokenProvider); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/config/StaticResourcesWebConfiguration.java b/borestop/src/main/java/com/ippon/borestop/config/StaticResourcesWebConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..9cc17d0f91e04d3550a367cc4a6887f38c935970 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/StaticResourcesWebConfiguration.java @@ -0,0 +1,50 @@ +package com.ippon.borestop.config; + +import io.github.jhipster.config.JHipsterConstants; +import io.github.jhipster.config.JHipsterProperties; +import java.util.concurrent.TimeUnit; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import org.springframework.http.CacheControl; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistration; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@Profile({ JHipsterConstants.SPRING_PROFILE_PRODUCTION }) +public class StaticResourcesWebConfiguration implements WebMvcConfigurer { + protected static final String[] RESOURCE_LOCATIONS = new String[] { + "classpath:/static/app/", + "classpath:/static/content/", + "classpath:/static/i18n/" + }; + protected static final String[] RESOURCE_PATHS = new String[] { "/app/*", "/content/*", "/i18n/*" }; + + private final JHipsterProperties jhipsterProperties; + + public StaticResourcesWebConfiguration(JHipsterProperties jHipsterProperties) { + this.jhipsterProperties = jHipsterProperties; + } + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + ResourceHandlerRegistration resourceHandlerRegistration = appendResourceHandler(registry); + initializeResourceHandler(resourceHandlerRegistration); + } + + protected ResourceHandlerRegistration appendResourceHandler(ResourceHandlerRegistry registry) { + return registry.addResourceHandler(RESOURCE_PATHS); + } + + protected void initializeResourceHandler(ResourceHandlerRegistration resourceHandlerRegistration) { + resourceHandlerRegistration.addResourceLocations(RESOURCE_LOCATIONS).setCacheControl(getCacheControl()); + } + + protected CacheControl getCacheControl() { + return CacheControl.maxAge(getJHipsterHttpCacheProperty(), TimeUnit.DAYS).cachePublic(); + } + + private int getJHipsterHttpCacheProperty() { + return jhipsterProperties.getHttp().getCache().getTimeToLiveInDays(); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/config/WebConfigurer.java b/borestop/src/main/java/com/ippon/borestop/config/WebConfigurer.java new file mode 100644 index 0000000000000000000000000000000000000000..85a7845b668cf04e63abe1bff524fb7e4cab2040 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/WebConfigurer.java @@ -0,0 +1,133 @@ +package com.ippon.borestop.config; + +import static java.net.URLDecoder.decode; + +import io.github.jhipster.config.JHipsterConstants; +import io.github.jhipster.config.JHipsterProperties; +import io.github.jhipster.config.h2.H2ConfigurationHelper; +import java.io.File; +import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Paths; +import java.util.*; +import javax.servlet.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.web.server.*; +import org.springframework.boot.web.servlet.ServletContextInitializer; +import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.core.env.Profiles; +import org.springframework.http.MediaType; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; + +/** + * Configuration of web application with Servlet 3.0 APIs. + */ +@Configuration +public class WebConfigurer implements ServletContextInitializer, WebServerFactoryCustomizer<WebServerFactory> { + private final Logger log = LoggerFactory.getLogger(WebConfigurer.class); + + private final Environment env; + + private final JHipsterProperties jHipsterProperties; + + public WebConfigurer(Environment env, JHipsterProperties jHipsterProperties) { + this.env = env; + this.jHipsterProperties = jHipsterProperties; + } + + @Override + public void onStartup(ServletContext servletContext) throws ServletException { + if (env.getActiveProfiles().length != 0) { + log.info("Web application configuration, using profiles: {}", (Object[]) env.getActiveProfiles()); + } + + if (env.acceptsProfiles(Profiles.of(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT))) { + initH2Console(servletContext); + } + log.info("Web application fully configured"); + } + + /** + * Customize the Servlet engine: Mime types, the document root, the cache. + */ + @Override + public void customize(WebServerFactory server) { + setMimeMappings(server); + + // When running in an IDE or with ./mvnw spring-boot:run, set location of the static web assets. + setLocationForStaticAssets(server); + } + + private void setMimeMappings(WebServerFactory server) { + if (server instanceof ConfigurableServletWebServerFactory) { + MimeMappings mappings = new MimeMappings(MimeMappings.DEFAULT); + + // IE issue, see https://github.com/jhipster/generator-jhipster/pull/711 + mappings.add("html", MediaType.TEXT_HTML_VALUE + ";charset=" + StandardCharsets.UTF_8.name().toLowerCase()); + + // CloudFoundry issue, see https://github.com/cloudfoundry/gorouter/issues/64 + mappings.add("json", MediaType.TEXT_HTML_VALUE + ";charset=" + StandardCharsets.UTF_8.name().toLowerCase()); + ConfigurableServletWebServerFactory servletWebServer = (ConfigurableServletWebServerFactory) server; + servletWebServer.setMimeMappings(mappings); + } + } + + private void setLocationForStaticAssets(WebServerFactory server) { + if (server instanceof ConfigurableServletWebServerFactory) { + ConfigurableServletWebServerFactory servletWebServer = (ConfigurableServletWebServerFactory) server; + File root; + String prefixPath = resolvePathPrefix(); + root = new File(prefixPath + "target/classes/static/"); + if (root.exists() && root.isDirectory()) { + servletWebServer.setDocumentRoot(root); + } + } + } + + /** + * Resolve path prefix to static resources. + */ + private String resolvePathPrefix() { + String fullExecutablePath; + try { + fullExecutablePath = decode(this.getClass().getResource("").getPath(), StandardCharsets.UTF_8.name()); + } catch (UnsupportedEncodingException e) { + /* try without decoding if this ever happens */ + fullExecutablePath = this.getClass().getResource("").getPath(); + } + String rootPath = Paths.get(".").toUri().normalize().getPath(); + String extractedPath = fullExecutablePath.replace(rootPath, ""); + int extractionEndIndex = extractedPath.indexOf("target/"); + if (extractionEndIndex <= 0) { + return ""; + } + return extractedPath.substring(0, extractionEndIndex); + } + + @Bean + public CorsFilter corsFilter() { + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + CorsConfiguration config = jHipsterProperties.getCors(); + if (config.getAllowedOrigins() != null && !config.getAllowedOrigins().isEmpty()) { + log.debug("Registering CORS filter"); + source.registerCorsConfiguration("/api/**", config); + source.registerCorsConfiguration("/management/**", config); + source.registerCorsConfiguration("/v2/api-docs", config); + } + return new CorsFilter(source); + } + + /** + * Initializes H2 console. + */ + private void initH2Console(ServletContext servletContext) { + log.debug("Initialize H2 console"); + H2ConfigurationHelper.initH2Console(servletContext); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/config/audit/AuditEventConverter.java b/borestop/src/main/java/com/ippon/borestop/config/audit/AuditEventConverter.java new file mode 100644 index 0000000000000000000000000000000000000000..56abe0e1ea475eed2f42699f1faa9661f8236089 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/audit/AuditEventConverter.java @@ -0,0 +1,88 @@ +package com.ippon.borestop.config.audit; + +import com.ippon.borestop.domain.PersistentAuditEvent; +import java.util.*; +import org.springframework.boot.actuate.audit.AuditEvent; +import org.springframework.security.web.authentication.WebAuthenticationDetails; +import org.springframework.stereotype.Component; + +@Component +public class AuditEventConverter { + + /** + * Convert a list of {@link PersistentAuditEvent}s to a list of {@link AuditEvent}s. + * + * @param persistentAuditEvents the list to convert. + * @return the converted list. + */ + public List<AuditEvent> convertToAuditEvent(Iterable<PersistentAuditEvent> persistentAuditEvents) { + if (persistentAuditEvents == null) { + return Collections.emptyList(); + } + List<AuditEvent> auditEvents = new ArrayList<>(); + for (PersistentAuditEvent persistentAuditEvent : persistentAuditEvents) { + auditEvents.add(convertToAuditEvent(persistentAuditEvent)); + } + return auditEvents; + } + + /** + * Convert a {@link PersistentAuditEvent} to an {@link AuditEvent}. + * + * @param persistentAuditEvent the event to convert. + * @return the converted list. + */ + public AuditEvent convertToAuditEvent(PersistentAuditEvent persistentAuditEvent) { + if (persistentAuditEvent == null) { + return null; + } + return new AuditEvent( + persistentAuditEvent.getAuditEventDate(), + persistentAuditEvent.getPrincipal(), + persistentAuditEvent.getAuditEventType(), + convertDataToObjects(persistentAuditEvent.getData()) + ); + } + + /** + * Internal conversion. This is needed to support the current SpringBoot actuator {@code AuditEventRepository} interface. + * + * @param data the data to convert. + * @return a map of {@link String}, {@link Object}. + */ + public Map<String, Object> convertDataToObjects(Map<String, String> data) { + Map<String, Object> results = new HashMap<>(); + + if (data != null) { + for (Map.Entry<String, String> entry : data.entrySet()) { + results.put(entry.getKey(), entry.getValue()); + } + } + return results; + } + + /** + * Internal conversion. This method will allow to save additional data. + * By default, it will save the object as string. + * + * @param data the data to convert. + * @return a map of {@link String}, {@link String}. + */ + public Map<String, String> convertDataToStrings(Map<String, Object> data) { + Map<String, String> results = new HashMap<>(); + + if (data != null) { + for (Map.Entry<String, Object> entry : data.entrySet()) { + // Extract the data that will be saved. + if (entry.getValue() instanceof WebAuthenticationDetails) { + WebAuthenticationDetails authenticationDetails = (WebAuthenticationDetails) entry.getValue(); + results.put("remoteAddress", authenticationDetails.getRemoteAddress()); + results.put("sessionId", authenticationDetails.getSessionId()); + } else { + results.put(entry.getKey(), Objects.toString(entry.getValue())); + } + } + } + return results; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/config/audit/package-info.java b/borestop/src/main/java/com/ippon/borestop/config/audit/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..fa8b682e11bcb90feef7ce86eaa053dfe2cad29c --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/audit/package-info.java @@ -0,0 +1,4 @@ +/** + * Audit specific code. + */ +package com.ippon.borestop.config.audit; diff --git a/borestop/src/main/java/com/ippon/borestop/config/package-info.java b/borestop/src/main/java/com/ippon/borestop/config/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..a24097d917d307ee2f922095c0581aff66bed44d --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/config/package-info.java @@ -0,0 +1,4 @@ +/** + * Spring Framework configuration files. + */ +package com.ippon.borestop.config; diff --git a/borestop/src/main/java/com/ippon/borestop/domain/AbstractAuditingEntity.java b/borestop/src/main/java/com/ippon/borestop/domain/AbstractAuditingEntity.java new file mode 100644 index 0000000000000000000000000000000000000000..31109e42cd4ff7ed52e2fa5d839b97a63e5d8c5c --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/domain/AbstractAuditingEntity.java @@ -0,0 +1,75 @@ +package com.ippon.borestop.domain; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import java.io.Serializable; +import java.time.Instant; +import javax.persistence.Column; +import javax.persistence.EntityListeners; +import javax.persistence.MappedSuperclass; +import org.springframework.data.annotation.CreatedBy; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedBy; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +/** + * Base abstract class for entities which will hold definitions for created, last modified, created by, + * last modified by attributes. + */ +@MappedSuperclass +@EntityListeners(AuditingEntityListener.class) +public abstract class AbstractAuditingEntity implements Serializable { + private static final long serialVersionUID = 1L; + + @CreatedBy + @Column(name = "created_by", nullable = false, length = 50, updatable = false) + @JsonIgnore + private String createdBy; + + @CreatedDate + @Column(name = "created_date", updatable = false) + @JsonIgnore + private Instant createdDate = Instant.now(); + + @LastModifiedBy + @Column(name = "last_modified_by", length = 50) + @JsonIgnore + private String lastModifiedBy; + + @LastModifiedDate + @Column(name = "last_modified_date") + @JsonIgnore + private Instant lastModifiedDate = Instant.now(); + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Instant getCreatedDate() { + return createdDate; + } + + public void setCreatedDate(Instant createdDate) { + this.createdDate = createdDate; + } + + public String getLastModifiedBy() { + return lastModifiedBy; + } + + public void setLastModifiedBy(String lastModifiedBy) { + this.lastModifiedBy = lastModifiedBy; + } + + public Instant getLastModifiedDate() { + return lastModifiedDate; + } + + public void setLastModifiedDate(Instant lastModifiedDate) { + this.lastModifiedDate = lastModifiedDate; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/domain/Authority.java b/borestop/src/main/java/com/ippon/borestop/domain/Authority.java new file mode 100644 index 0000000000000000000000000000000000000000..381c6724ce26a149e55462afe8a6f8afa4306a77 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/domain/Authority.java @@ -0,0 +1,57 @@ +package com.ippon.borestop.domain; + +import java.io.Serializable; +import java.util.Objects; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * An authority (a security role) used by Spring Security. + */ +@Entity +@Table(name = "jhi_authority") +public class Authority implements Serializable { + private static final long serialVersionUID = 1L; + + @NotNull + @Size(max = 50) + @Id + @Column(length = 50) + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof Authority)) { + return false; + } + return Objects.equals(name, ((Authority) o).name); + } + + @Override + public int hashCode() { + return Objects.hashCode(name); + } + + // prettier-ignore + @Override + public String toString() { + return "Authority{" + + "name='" + name + '\'' + + "}"; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/domain/PersistentAuditEvent.java b/borestop/src/main/java/com/ippon/borestop/domain/PersistentAuditEvent.java new file mode 100644 index 0000000000000000000000000000000000000000..917e4121ba92411fc0a3d97dde18958a3b87c4d8 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/domain/PersistentAuditEvent.java @@ -0,0 +1,107 @@ +package com.ippon.borestop.domain; + +import java.io.Serializable; +import java.time.Instant; +import java.util.HashMap; +import java.util.Map; +import javax.persistence.*; +import javax.validation.constraints.NotNull; + +/** + * Persist AuditEvent managed by the Spring Boot actuator. + * + * @see org.springframework.boot.actuate.audit.AuditEvent + */ +@Entity +@Table(name = "jhi_persistent_audit_event") +public class PersistentAuditEvent implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") + @SequenceGenerator(name = "sequenceGenerator") + @Column(name = "event_id") + private Long id; + + @NotNull + @Column(nullable = false) + private String principal; + + @Column(name = "event_date") + private Instant auditEventDate; + + @Column(name = "event_type") + private String auditEventType; + + @ElementCollection + @MapKeyColumn(name = "name") + @Column(name = "value") + @CollectionTable(name = "jhi_persistent_audit_evt_data", joinColumns = @JoinColumn(name = "event_id")) + private Map<String, String> data = new HashMap<>(); + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getPrincipal() { + return principal; + } + + public void setPrincipal(String principal) { + this.principal = principal; + } + + public Instant getAuditEventDate() { + return auditEventDate; + } + + public void setAuditEventDate(Instant auditEventDate) { + this.auditEventDate = auditEventDate; + } + + public String getAuditEventType() { + return auditEventType; + } + + public void setAuditEventType(String auditEventType) { + this.auditEventType = auditEventType; + } + + public Map<String, String> getData() { + return data; + } + + public void setData(Map<String, String> data) { + this.data = data; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof PersistentAuditEvent)) { + return false; + } + return id != null && id.equals(((PersistentAuditEvent) o).id); + } + + @Override + public int hashCode() { + return 31; + } + + // prettier-ignore + @Override + public String toString() { + return "PersistentAuditEvent{" + + "principal='" + principal + '\'' + + ", auditEventDate=" + auditEventDate + + ", auditEventType='" + auditEventType + '\'' + + '}'; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/domain/User.java b/borestop/src/main/java/com/ippon/borestop/domain/User.java new file mode 100644 index 0000000000000000000000000000000000000000..a43b734dd1467fba6d634e5e56ce147f6c502884 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/domain/User.java @@ -0,0 +1,226 @@ +package com.ippon.borestop.domain; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.ippon.borestop.config.Constants; +import java.io.Serializable; +import java.time.Instant; +import java.util.HashSet; +import java.util.Locale; +import java.util.Set; +import javax.persistence.*; +import javax.validation.constraints.Email; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.StringUtils; +import org.hibernate.annotations.BatchSize; + +/** + * A user. + */ +@Entity +@Table(name = "jhi_user") +public class User extends AbstractAuditingEntity implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") + @SequenceGenerator(name = "sequenceGenerator") + private Long id; + + @NotNull + @Pattern(regexp = Constants.LOGIN_REGEX) + @Size(min = 1, max = 50) + @Column(length = 50, unique = true, nullable = false) + private String login; + + @JsonIgnore + @NotNull + @Size(min = 60, max = 60) + @Column(name = "password_hash", length = 60, nullable = false) + private String password; + + @Size(max = 50) + @Column(name = "first_name", length = 50) + private String firstName; + + @Size(max = 50) + @Column(name = "last_name", length = 50) + private String lastName; + + @Email + @Size(min = 5, max = 254) + @Column(length = 254, unique = true) + private String email; + + @NotNull + @Column(nullable = false) + private boolean activated = false; + + @Size(min = 2, max = 10) + @Column(name = "lang_key", length = 10) + private String langKey; + + @Size(max = 256) + @Column(name = "image_url", length = 256) + private String imageUrl; + + @Size(max = 20) + @Column(name = "activation_key", length = 20) + @JsonIgnore + private String activationKey; + + @Size(max = 20) + @Column(name = "reset_key", length = 20) + @JsonIgnore + private String resetKey; + + @Column(name = "reset_date") + private Instant resetDate = null; + + @JsonIgnore + @ManyToMany + @JoinTable( + name = "jhi_user_authority", + joinColumns = { @JoinColumn(name = "user_id", referencedColumnName = "id") }, + inverseJoinColumns = { @JoinColumn(name = "authority_name", referencedColumnName = "name") } + ) + @BatchSize(size = 20) + private Set<Authority> authorities = new HashSet<>(); + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getLogin() { + return login; + } + + // Lowercase the login before saving it in database + public void setLogin(String login) { + this.login = StringUtils.lowerCase(login, Locale.ENGLISH); + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getImageUrl() { + return imageUrl; + } + + public void setImageUrl(String imageUrl) { + this.imageUrl = imageUrl; + } + + public boolean getActivated() { + return activated; + } + + public void setActivated(boolean activated) { + this.activated = activated; + } + + public String getActivationKey() { + return activationKey; + } + + public void setActivationKey(String activationKey) { + this.activationKey = activationKey; + } + + public String getResetKey() { + return resetKey; + } + + public void setResetKey(String resetKey) { + this.resetKey = resetKey; + } + + public Instant getResetDate() { + return resetDate; + } + + public void setResetDate(Instant resetDate) { + this.resetDate = resetDate; + } + + public String getLangKey() { + return langKey; + } + + public void setLangKey(String langKey) { + this.langKey = langKey; + } + + public Set<Authority> getAuthorities() { + return authorities; + } + + public void setAuthorities(Set<Authority> authorities) { + this.authorities = authorities; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof User)) { + return false; + } + return id != null && id.equals(((User) o).id); + } + + @Override + public int hashCode() { + return 31; + } + + // prettier-ignore + @Override + public String toString() { + return "User{" + + "login='" + login + '\'' + + ", firstName='" + firstName + '\'' + + ", lastName='" + lastName + '\'' + + ", email='" + email + '\'' + + ", imageUrl='" + imageUrl + '\'' + + ", activated='" + activated + '\'' + + ", langKey='" + langKey + '\'' + + ", activationKey='" + activationKey + '\'' + + "}"; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/domain/package-info.java b/borestop/src/main/java/com/ippon/borestop/domain/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..8952b86ca23cc0d0113b102da7ac18b9f67c56ad --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/domain/package-info.java @@ -0,0 +1,4 @@ +/** + * JPA domain objects. + */ +package com.ippon.borestop.domain; diff --git a/borestop/src/main/java/com/ippon/borestop/repository/AuthorityRepository.java b/borestop/src/main/java/com/ippon/borestop/repository/AuthorityRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..490eba346cd6b5c57c0d67430c3b8816a1e88eb0 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/repository/AuthorityRepository.java @@ -0,0 +1,9 @@ +package com.ippon.borestop.repository; + +import com.ippon.borestop.domain.Authority; +import org.springframework.data.jpa.repository.JpaRepository; + +/** + * Spring Data JPA repository for the {@link Authority} entity. + */ +public interface AuthorityRepository extends JpaRepository<Authority, String> {} diff --git a/borestop/src/main/java/com/ippon/borestop/repository/CustomAuditEventRepository.java b/borestop/src/main/java/com/ippon/borestop/repository/CustomAuditEventRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..aa227082d80d1b4c69329bbe68072729b3cdee35 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/repository/CustomAuditEventRepository.java @@ -0,0 +1,92 @@ +package com.ippon.borestop.repository; + +import com.ippon.borestop.config.Constants; +import com.ippon.borestop.config.audit.AuditEventConverter; +import com.ippon.borestop.domain.PersistentAuditEvent; +import java.time.Instant; +import java.util.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.actuate.audit.AuditEvent; +import org.springframework.boot.actuate.audit.AuditEventRepository; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +/** + * An implementation of Spring Boot's {@link AuditEventRepository}. + */ +@Repository +public class CustomAuditEventRepository implements AuditEventRepository { + private static final String AUTHORIZATION_FAILURE = "AUTHORIZATION_FAILURE"; + + /** + * Should be the same as in Liquibase migration. + */ + protected static final int EVENT_DATA_COLUMN_MAX_LENGTH = 255; + + private final PersistenceAuditEventRepository persistenceAuditEventRepository; + + private final AuditEventConverter auditEventConverter; + + private final Logger log = LoggerFactory.getLogger(getClass()); + + public CustomAuditEventRepository( + PersistenceAuditEventRepository persistenceAuditEventRepository, + AuditEventConverter auditEventConverter + ) { + this.persistenceAuditEventRepository = persistenceAuditEventRepository; + this.auditEventConverter = auditEventConverter; + } + + @Override + public List<AuditEvent> find(String principal, Instant after, String type) { + Iterable<PersistentAuditEvent> persistentAuditEvents = persistenceAuditEventRepository.findByPrincipalAndAuditEventDateAfterAndAuditEventType( + principal, + after, + type + ); + return auditEventConverter.convertToAuditEvent(persistentAuditEvents); + } + + @Override + @Transactional(propagation = Propagation.REQUIRES_NEW) + public void add(AuditEvent event) { + if (!AUTHORIZATION_FAILURE.equals(event.getType()) && !Constants.ANONYMOUS_USER.equals(event.getPrincipal())) { + PersistentAuditEvent persistentAuditEvent = new PersistentAuditEvent(); + persistentAuditEvent.setPrincipal(event.getPrincipal()); + persistentAuditEvent.setAuditEventType(event.getType()); + persistentAuditEvent.setAuditEventDate(event.getTimestamp()); + Map<String, String> eventData = auditEventConverter.convertDataToStrings(event.getData()); + persistentAuditEvent.setData(truncate(eventData)); + persistenceAuditEventRepository.save(persistentAuditEvent); + } + } + + /** + * Truncate event data that might exceed column length. + */ + private Map<String, String> truncate(Map<String, String> data) { + Map<String, String> results = new HashMap<>(); + + if (data != null) { + for (Map.Entry<String, String> entry : data.entrySet()) { + String value = entry.getValue(); + if (value != null) { + int length = value.length(); + if (length > EVENT_DATA_COLUMN_MAX_LENGTH) { + value = value.substring(0, EVENT_DATA_COLUMN_MAX_LENGTH); + log.warn( + "Event data for {} too long ({}) has been truncated to {}. Consider increasing column width.", + entry.getKey(), + length, + EVENT_DATA_COLUMN_MAX_LENGTH + ); + } + } + results.put(entry.getKey(), value); + } + } + return results; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/repository/PersistenceAuditEventRepository.java b/borestop/src/main/java/com/ippon/borestop/repository/PersistenceAuditEventRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..7376410f7eb13ad69ea7fb11e612c884ec31e89d --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/repository/PersistenceAuditEventRepository.java @@ -0,0 +1,21 @@ +package com.ippon.borestop.repository; + +import com.ippon.borestop.domain.PersistentAuditEvent; +import java.time.Instant; +import java.util.List; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; + +/** + * Spring Data JPA repository for the {@link PersistentAuditEvent} entity. + */ +public interface PersistenceAuditEventRepository extends JpaRepository<PersistentAuditEvent, Long> { + List<PersistentAuditEvent> findByPrincipal(String principal); + + List<PersistentAuditEvent> findByPrincipalAndAuditEventDateAfterAndAuditEventType(String principal, Instant after, String type); + + Page<PersistentAuditEvent> findAllByAuditEventDateBetween(Instant fromDate, Instant toDate, Pageable pageable); + + List<PersistentAuditEvent> findByAuditEventDateBefore(Instant before); +} diff --git a/borestop/src/main/java/com/ippon/borestop/repository/UserRepository.java b/borestop/src/main/java/com/ippon/borestop/repository/UserRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..235422618ce70ae819b3b117b6bd9497fca6c413 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/repository/UserRepository.java @@ -0,0 +1,35 @@ +package com.ippon.borestop.repository; + +import com.ippon.borestop.domain.User; +import java.time.Instant; +import java.util.List; +import java.util.Optional; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.EntityGraph; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +/** + * Spring Data JPA repository for the {@link User} entity. + */ +@Repository +public interface UserRepository extends JpaRepository<User, Long> { + Optional<User> findOneByActivationKey(String activationKey); + + List<User> findAllByActivatedIsFalseAndActivationKeyIsNotNullAndCreatedDateBefore(Instant dateTime); + + Optional<User> findOneByResetKey(String resetKey); + + Optional<User> findOneByEmailIgnoreCase(String email); + + Optional<User> findOneByLogin(String login); + + @EntityGraph(attributePaths = "authorities") + Optional<User> findOneWithAuthoritiesByLogin(String login); + + @EntityGraph(attributePaths = "authorities") + Optional<User> findOneWithAuthoritiesByEmailIgnoreCase(String email); + + Page<User> findAllByLoginNot(Pageable pageable, String login); +} diff --git a/borestop/src/main/java/com/ippon/borestop/repository/package-info.java b/borestop/src/main/java/com/ippon/borestop/repository/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..25618cca775065e58b302ddddc7de3827b8d6cd1 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/repository/package-info.java @@ -0,0 +1,4 @@ +/** + * Spring Data JPA repositories. + */ +package com.ippon.borestop.repository; diff --git a/borestop/src/main/java/com/ippon/borestop/security/AuthoritiesConstants.java b/borestop/src/main/java/com/ippon/borestop/security/AuthoritiesConstants.java new file mode 100644 index 0000000000000000000000000000000000000000..193b052d875db61a2284cc66d8000b63d25aa63d --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/security/AuthoritiesConstants.java @@ -0,0 +1,14 @@ +package com.ippon.borestop.security; + +/** + * Constants for Spring Security authorities. + */ +public final class AuthoritiesConstants { + public static final String ADMIN = "ROLE_ADMIN"; + + public static final String USER = "ROLE_USER"; + + public static final String ANONYMOUS = "ROLE_ANONYMOUS"; + + private AuthoritiesConstants() {} +} diff --git a/borestop/src/main/java/com/ippon/borestop/security/DomainUserDetailsService.java b/borestop/src/main/java/com/ippon/borestop/security/DomainUserDetailsService.java new file mode 100644 index 0000000000000000000000000000000000000000..29330366b9f33c4d894703a122c2b2ad1d3534fd --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/security/DomainUserDetailsService.java @@ -0,0 +1,61 @@ +package com.ippon.borestop.security; + +import com.ippon.borestop.domain.User; +import com.ippon.borestop.repository.UserRepository; +import java.util.*; +import java.util.stream.Collectors; +import org.hibernate.validator.internal.constraintvalidators.hv.EmailValidator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +/** + * Authenticate a user from the database. + */ +@Component("userDetailsService") +public class DomainUserDetailsService implements UserDetailsService { + private final Logger log = LoggerFactory.getLogger(DomainUserDetailsService.class); + + private final UserRepository userRepository; + + public DomainUserDetailsService(UserRepository userRepository) { + this.userRepository = userRepository; + } + + @Override + @Transactional + public UserDetails loadUserByUsername(final String login) { + log.debug("Authenticating {}", login); + + if (new EmailValidator().isValid(login, null)) { + return userRepository + .findOneWithAuthoritiesByEmailIgnoreCase(login) + .map(user -> createSpringSecurityUser(login, user)) + .orElseThrow(() -> new UsernameNotFoundException("User with email " + login + " was not found in the database")); + } + + String lowercaseLogin = login.toLowerCase(Locale.ENGLISH); + return userRepository + .findOneWithAuthoritiesByLogin(lowercaseLogin) + .map(user -> createSpringSecurityUser(lowercaseLogin, user)) + .orElseThrow(() -> new UsernameNotFoundException("User " + lowercaseLogin + " was not found in the database")); + } + + private org.springframework.security.core.userdetails.User createSpringSecurityUser(String lowercaseLogin, User user) { + if (!user.getActivated()) { + throw new UserNotActivatedException("User " + lowercaseLogin + " was not activated"); + } + List<GrantedAuthority> grantedAuthorities = user + .getAuthorities() + .stream() + .map(authority -> new SimpleGrantedAuthority(authority.getName())) + .collect(Collectors.toList()); + return new org.springframework.security.core.userdetails.User(user.getLogin(), user.getPassword(), grantedAuthorities); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/security/SecurityUtils.java b/borestop/src/main/java/com/ippon/borestop/security/SecurityUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..8e4d195d4d993f497b5b921c5f168bdc1c71a946 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/security/SecurityUtils.java @@ -0,0 +1,79 @@ +package com.ippon.borestop.security; + +import java.util.Optional; +import java.util.stream.Stream; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; + +/** + * Utility class for Spring Security. + */ +public final class SecurityUtils { + + private SecurityUtils() {} + + /** + * Get the login of the current user. + * + * @return the login of the current user. + */ + public static Optional<String> getCurrentUserLogin() { + SecurityContext securityContext = SecurityContextHolder.getContext(); + return Optional.ofNullable(extractPrincipal(securityContext.getAuthentication())); + } + + private static String extractPrincipal(Authentication authentication) { + if (authentication == null) { + return null; + } else if (authentication.getPrincipal() instanceof UserDetails) { + UserDetails springSecurityUser = (UserDetails) authentication.getPrincipal(); + return springSecurityUser.getUsername(); + } else if (authentication.getPrincipal() instanceof String) { + return (String) authentication.getPrincipal(); + } + return null; + } + + /** + * Get the JWT of the current user. + * + * @return the JWT of the current user. + */ + public static Optional<String> getCurrentUserJWT() { + SecurityContext securityContext = SecurityContextHolder.getContext(); + return Optional + .ofNullable(securityContext.getAuthentication()) + .filter(authentication -> authentication.getCredentials() instanceof String) + .map(authentication -> (String) authentication.getCredentials()); + } + + /** + * Check if a user is authenticated. + * + * @return true if the user is authenticated, false otherwise. + */ + public static boolean isAuthenticated() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + return authentication != null && getAuthorities(authentication).noneMatch(AuthoritiesConstants.ANONYMOUS::equals); + } + + /** + * If the current user has a specific authority (security role). + * <p> + * The name of this method comes from the {@code isUserInRole()} method in the Servlet API. + * + * @param authority the authority to check. + * @return true if the current user has the authority, false otherwise. + */ + public static boolean isCurrentUserInRole(String authority) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + return authentication != null && getAuthorities(authentication).anyMatch(authority::equals); + } + + private static Stream<String> getAuthorities(Authentication authentication) { + return authentication.getAuthorities().stream().map(GrantedAuthority::getAuthority); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/security/SpringSecurityAuditorAware.java b/borestop/src/main/java/com/ippon/borestop/security/SpringSecurityAuditorAware.java new file mode 100644 index 0000000000000000000000000000000000000000..13ec4606e0dc2f485d772a7c7d488cb7733496a7 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/security/SpringSecurityAuditorAware.java @@ -0,0 +1,18 @@ +package com.ippon.borestop.security; + +import com.ippon.borestop.config.Constants; +import java.util.Optional; +import org.springframework.data.domain.AuditorAware; +import org.springframework.stereotype.Component; + +/** + * Implementation of {@link AuditorAware} based on Spring Security. + */ +@Component +public class SpringSecurityAuditorAware implements AuditorAware<String> { + + @Override + public Optional<String> getCurrentAuditor() { + return Optional.of(SecurityUtils.getCurrentUserLogin().orElse(Constants.SYSTEM_ACCOUNT)); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/security/UserNotActivatedException.java b/borestop/src/main/java/com/ippon/borestop/security/UserNotActivatedException.java new file mode 100644 index 0000000000000000000000000000000000000000..aa2e1cc0a6245e1c13293f70966ada7f8477b17e --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/security/UserNotActivatedException.java @@ -0,0 +1,18 @@ +package com.ippon.borestop.security; + +import org.springframework.security.core.AuthenticationException; + +/** + * This exception is thrown in case of a not activated user trying to authenticate. + */ +public class UserNotActivatedException extends AuthenticationException { + private static final long serialVersionUID = 1L; + + public UserNotActivatedException(String message) { + super(message); + } + + public UserNotActivatedException(String message, Throwable t) { + super(message, t); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/security/jwt/JWTConfigurer.java b/borestop/src/main/java/com/ippon/borestop/security/jwt/JWTConfigurer.java new file mode 100644 index 0000000000000000000000000000000000000000..796f38b7af9a58b50edd6d081c958024c7b98aae --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/security/jwt/JWTConfigurer.java @@ -0,0 +1,20 @@ +package com.ippon.borestop.security.jwt; + +import org.springframework.security.config.annotation.SecurityConfigurerAdapter; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.web.DefaultSecurityFilterChain; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +public class JWTConfigurer extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> { + private final TokenProvider tokenProvider; + + public JWTConfigurer(TokenProvider tokenProvider) { + this.tokenProvider = tokenProvider; + } + + @Override + public void configure(HttpSecurity http) { + JWTFilter customFilter = new JWTFilter(tokenProvider); + http.addFilterBefore(customFilter, UsernamePasswordAuthenticationFilter.class); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/security/jwt/JWTFilter.java b/borestop/src/main/java/com/ippon/borestop/security/jwt/JWTFilter.java new file mode 100644 index 0000000000000000000000000000000000000000..163363037c49637595ddb12faf689f0f86411334 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/security/jwt/JWTFilter.java @@ -0,0 +1,46 @@ +package com.ippon.borestop.security.jwt; + +import java.io.IOException; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.util.StringUtils; +import org.springframework.web.filter.GenericFilterBean; + +/** + * Filters incoming requests and installs a Spring Security principal if a header corresponding to a valid user is + * found. + */ +public class JWTFilter extends GenericFilterBean { + public static final String AUTHORIZATION_HEADER = "Authorization"; + + private final TokenProvider tokenProvider; + + public JWTFilter(TokenProvider tokenProvider) { + this.tokenProvider = tokenProvider; + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { + HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; + String jwt = resolveToken(httpServletRequest); + if (StringUtils.hasText(jwt) && this.tokenProvider.validateToken(jwt)) { + Authentication authentication = this.tokenProvider.getAuthentication(jwt); + SecurityContextHolder.getContext().setAuthentication(authentication); + } + filterChain.doFilter(servletRequest, servletResponse); + } + + private String resolveToken(HttpServletRequest request) { + String bearerToken = request.getHeader(AUTHORIZATION_HEADER); + if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) { + return bearerToken.substring(7); + } + return null; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/security/jwt/TokenProvider.java b/borestop/src/main/java/com/ippon/borestop/security/jwt/TokenProvider.java new file mode 100644 index 0000000000000000000000000000000000000000..77db1334d6d3ed71bced9c5600c981e2f0745e43 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/security/jwt/TokenProvider.java @@ -0,0 +1,103 @@ +package com.ippon.borestop.security.jwt; + +import io.github.jhipster.config.JHipsterProperties; +import io.jsonwebtoken.*; +import io.jsonwebtoken.io.Decoders; +import io.jsonwebtoken.security.Keys; +import java.nio.charset.StandardCharsets; +import java.security.Key; +import java.util.*; +import java.util.stream.Collectors; +import javax.annotation.PostConstruct; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.User; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +@Component +public class TokenProvider { + private final Logger log = LoggerFactory.getLogger(TokenProvider.class); + + private static final String AUTHORITIES_KEY = "auth"; + + private Key key; + + private long tokenValidityInMilliseconds; + + private long tokenValidityInMillisecondsForRememberMe; + + private final JHipsterProperties jHipsterProperties; + + public TokenProvider(JHipsterProperties jHipsterProperties) { + this.jHipsterProperties = jHipsterProperties; + } + + @PostConstruct + public void init() { + byte[] keyBytes; + String secret = jHipsterProperties.getSecurity().getAuthentication().getJwt().getSecret(); + if (!StringUtils.isEmpty(secret)) { + log.warn( + "Warning: the JWT key used is not Base64-encoded. " + + "We recommend using the `jhipster.security.authentication.jwt.base64-secret` key for optimum security." + ); + keyBytes = secret.getBytes(StandardCharsets.UTF_8); + } else { + log.debug("Using a Base64-encoded JWT secret key"); + keyBytes = Decoders.BASE64.decode(jHipsterProperties.getSecurity().getAuthentication().getJwt().getBase64Secret()); + } + this.key = Keys.hmacShaKeyFor(keyBytes); + this.tokenValidityInMilliseconds = 1000 * jHipsterProperties.getSecurity().getAuthentication().getJwt().getTokenValidityInSeconds(); + this.tokenValidityInMillisecondsForRememberMe = + 1000 * jHipsterProperties.getSecurity().getAuthentication().getJwt().getTokenValidityInSecondsForRememberMe(); + } + + public String createToken(Authentication authentication, boolean rememberMe) { + String authorities = authentication.getAuthorities().stream().map(GrantedAuthority::getAuthority).collect(Collectors.joining(",")); + + long now = (new Date()).getTime(); + Date validity; + if (rememberMe) { + validity = new Date(now + this.tokenValidityInMillisecondsForRememberMe); + } else { + validity = new Date(now + this.tokenValidityInMilliseconds); + } + + return Jwts + .builder() + .setSubject(authentication.getName()) + .claim(AUTHORITIES_KEY, authorities) + .signWith(key, SignatureAlgorithm.HS512) + .setExpiration(validity) + .compact(); + } + + public Authentication getAuthentication(String token) { + Claims claims = Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token).getBody(); + + Collection<? extends GrantedAuthority> authorities = Arrays + .stream(claims.get(AUTHORITIES_KEY).toString().split(",")) + .map(SimpleGrantedAuthority::new) + .collect(Collectors.toList()); + + User principal = new User(claims.getSubject(), "", authorities); + + return new UsernamePasswordAuthenticationToken(principal, token, authorities); + } + + public boolean validateToken(String authToken) { + try { + Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(authToken); + return true; + } catch (JwtException | IllegalArgumentException e) { + log.info("Invalid JWT token."); + log.trace("Invalid JWT token trace.", e); + } + return false; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/security/package-info.java b/borestop/src/main/java/com/ippon/borestop/security/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..34cdc24307ccdabd460add412df831c9adc6507c --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/security/package-info.java @@ -0,0 +1,4 @@ +/** + * Spring Security configuration. + */ +package com.ippon.borestop.security; diff --git a/borestop/src/main/java/com/ippon/borestop/service/AuditEventService.java b/borestop/src/main/java/com/ippon/borestop/service/AuditEventService.java new file mode 100644 index 0000000000000000000000000000000000000000..337c2eb1591b4591c8cb397b2061a7505cd93060 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/service/AuditEventService.java @@ -0,0 +1,77 @@ +package com.ippon.borestop.service; + +import com.ippon.borestop.config.audit.AuditEventConverter; +import com.ippon.borestop.repository.PersistenceAuditEventRepository; +import io.github.jhipster.config.JHipsterProperties; +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.Optional; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.actuate.audit.AuditEvent; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * Service for managing audit events. + * <p> + * This is the default implementation to support SpringBoot Actuator {@code AuditEventRepository}. + */ +@Service +@Transactional +public class AuditEventService { + private final Logger log = LoggerFactory.getLogger(AuditEventService.class); + + private final JHipsterProperties jHipsterProperties; + + private final PersistenceAuditEventRepository persistenceAuditEventRepository; + + private final AuditEventConverter auditEventConverter; + + public AuditEventService( + PersistenceAuditEventRepository persistenceAuditEventRepository, + AuditEventConverter auditEventConverter, + JHipsterProperties jhipsterProperties + ) { + this.persistenceAuditEventRepository = persistenceAuditEventRepository; + this.auditEventConverter = auditEventConverter; + this.jHipsterProperties = jhipsterProperties; + } + + /** + * Old audit events should be automatically deleted after 30 days. + * + * This is scheduled to get fired at 12:00 (am). + */ + @Scheduled(cron = "0 0 12 * * ?") + public void removeOldAuditEvents() { + persistenceAuditEventRepository + .findByAuditEventDateBefore(Instant.now().minus(jHipsterProperties.getAuditEvents().getRetentionPeriod(), ChronoUnit.DAYS)) + .forEach( + auditEvent -> { + log.debug("Deleting audit data {}", auditEvent); + persistenceAuditEventRepository.delete(auditEvent); + } + ); + } + + @Transactional(readOnly = true) + public Page<AuditEvent> findAll(Pageable pageable) { + return persistenceAuditEventRepository.findAll(pageable).map(auditEventConverter::convertToAuditEvent); + } + + @Transactional(readOnly = true) + public Page<AuditEvent> findByDates(Instant fromDate, Instant toDate, Pageable pageable) { + return persistenceAuditEventRepository + .findAllByAuditEventDateBetween(fromDate, toDate, pageable) + .map(auditEventConverter::convertToAuditEvent); + } + + @Transactional(readOnly = true) + public Optional<AuditEvent> find(Long id) { + return persistenceAuditEventRepository.findById(id).map(auditEventConverter::convertToAuditEvent); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/service/EmailAlreadyUsedException.java b/borestop/src/main/java/com/ippon/borestop/service/EmailAlreadyUsedException.java new file mode 100644 index 0000000000000000000000000000000000000000..49a051ca0586fcb27b15062fa559319e7f3dd99e --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/service/EmailAlreadyUsedException.java @@ -0,0 +1,9 @@ +package com.ippon.borestop.service; + +public class EmailAlreadyUsedException extends RuntimeException { + private static final long serialVersionUID = 1L; + + public EmailAlreadyUsedException() { + super("Email is already in use!"); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/service/InvalidPasswordException.java b/borestop/src/main/java/com/ippon/borestop/service/InvalidPasswordException.java new file mode 100644 index 0000000000000000000000000000000000000000..731f85c6b3fc2c6c56a14410ada7b4392f93706e --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/service/InvalidPasswordException.java @@ -0,0 +1,9 @@ +package com.ippon.borestop.service; + +public class InvalidPasswordException extends RuntimeException { + private static final long serialVersionUID = 1L; + + public InvalidPasswordException() { + super("Incorrect password"); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/service/MailService.java b/borestop/src/main/java/com/ippon/borestop/service/MailService.java new file mode 100644 index 0000000000000000000000000000000000000000..72e3f2625fa1dca90a05e9f3845425a495809452 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/service/MailService.java @@ -0,0 +1,111 @@ +package com.ippon.borestop.service; + +import com.ippon.borestop.domain.User; +import io.github.jhipster.config.JHipsterProperties; +import java.nio.charset.StandardCharsets; +import java.util.Locale; +import javax.mail.MessagingException; +import javax.mail.internet.MimeMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.MessageSource; +import org.springframework.mail.MailException; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.thymeleaf.context.Context; +import org.thymeleaf.spring5.SpringTemplateEngine; + +/** + * Service for sending emails. + * <p> + * We use the {@link Async} annotation to send emails asynchronously. + */ +@Service +public class MailService { + private final Logger log = LoggerFactory.getLogger(MailService.class); + + private static final String USER = "user"; + + private static final String BASE_URL = "baseUrl"; + + private final JHipsterProperties jHipsterProperties; + + private final JavaMailSender javaMailSender; + + private final MessageSource messageSource; + + private final SpringTemplateEngine templateEngine; + + public MailService( + JHipsterProperties jHipsterProperties, + JavaMailSender javaMailSender, + MessageSource messageSource, + SpringTemplateEngine templateEngine + ) { + this.jHipsterProperties = jHipsterProperties; + this.javaMailSender = javaMailSender; + this.messageSource = messageSource; + this.templateEngine = templateEngine; + } + + @Async + public void sendEmail(String to, String subject, String content, boolean isMultipart, boolean isHtml) { + log.debug( + "Send email[multipart '{}' and html '{}'] to '{}' with subject '{}' and content={}", + isMultipart, + isHtml, + to, + subject, + content + ); + + // Prepare message using a Spring helper + MimeMessage mimeMessage = javaMailSender.createMimeMessage(); + try { + MimeMessageHelper message = new MimeMessageHelper(mimeMessage, isMultipart, StandardCharsets.UTF_8.name()); + message.setTo(to); + message.setFrom(jHipsterProperties.getMail().getFrom()); + message.setSubject(subject); + message.setText(content, isHtml); + javaMailSender.send(mimeMessage); + log.debug("Sent email to User '{}'", to); + } catch (MailException | MessagingException e) { + log.warn("Email could not be sent to user '{}'", to, e); + } + } + + @Async + public void sendEmailFromTemplate(User user, String templateName, String titleKey) { + if (user.getEmail() == null) { + log.debug("Email doesn't exist for user '{}'", user.getLogin()); + return; + } + Locale locale = Locale.forLanguageTag(user.getLangKey()); + Context context = new Context(locale); + context.setVariable(USER, user); + context.setVariable(BASE_URL, jHipsterProperties.getMail().getBaseUrl()); + String content = templateEngine.process(templateName, context); + String subject = messageSource.getMessage(titleKey, null, locale); + sendEmail(user.getEmail(), subject, content, false, true); + } + + @Async + public void sendActivationEmail(User user) { + log.debug("Sending activation email to '{}'", user.getEmail()); + sendEmailFromTemplate(user, "mail/activationEmail", "email.activation.title"); + } + + @Async + public void sendCreationEmail(User user) { + log.debug("Sending creation email to '{}'", user.getEmail()); + sendEmailFromTemplate(user, "mail/creationEmail", "email.activation.title"); + } + + @Async + public void sendPasswordResetMail(User user) { + log.debug("Sending password reset email to '{}'", user.getEmail()); + sendEmailFromTemplate(user, "mail/passwordResetEmail", "email.reset.title"); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/service/UserService.java b/borestop/src/main/java/com/ippon/borestop/service/UserService.java new file mode 100644 index 0000000000000000000000000000000000000000..b3a5d2c44232ed677705e264a34d51ab6b0958ec --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/service/UserService.java @@ -0,0 +1,313 @@ +package com.ippon.borestop.service; + +import com.ippon.borestop.config.Constants; +import com.ippon.borestop.domain.Authority; +import com.ippon.borestop.domain.User; +import com.ippon.borestop.repository.AuthorityRepository; +import com.ippon.borestop.repository.UserRepository; +import com.ippon.borestop.security.AuthoritiesConstants; +import com.ippon.borestop.security.SecurityUtils; +import com.ippon.borestop.service.dto.UserDTO; +import io.github.jhipster.security.RandomUtil; +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.*; +import java.util.stream.Collectors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * Service class for managing users. + */ +@Service +@Transactional +public class UserService { + private final Logger log = LoggerFactory.getLogger(UserService.class); + + private final UserRepository userRepository; + + private final PasswordEncoder passwordEncoder; + + private final AuthorityRepository authorityRepository; + + public UserService(UserRepository userRepository, PasswordEncoder passwordEncoder, AuthorityRepository authorityRepository) { + this.userRepository = userRepository; + this.passwordEncoder = passwordEncoder; + this.authorityRepository = authorityRepository; + } + + public Optional<User> activateRegistration(String key) { + log.debug("Activating user for activation key {}", key); + return userRepository + .findOneByActivationKey(key) + .map( + user -> { + // activate given user for the registration key. + user.setActivated(true); + user.setActivationKey(null); + log.debug("Activated user: {}", user); + return user; + } + ); + } + + public Optional<User> completePasswordReset(String newPassword, String key) { + log.debug("Reset user password for reset key {}", key); + return userRepository + .findOneByResetKey(key) + .filter(user -> user.getResetDate().isAfter(Instant.now().minusSeconds(86400))) + .map( + user -> { + user.setPassword(passwordEncoder.encode(newPassword)); + user.setResetKey(null); + user.setResetDate(null); + return user; + } + ); + } + + public Optional<User> requestPasswordReset(String mail) { + return userRepository + .findOneByEmailIgnoreCase(mail) + .filter(User::getActivated) + .map( + user -> { + user.setResetKey(RandomUtil.generateResetKey()); + user.setResetDate(Instant.now()); + return user; + } + ); + } + + public User registerUser(UserDTO userDTO, String password) { + userRepository + .findOneByLogin(userDTO.getLogin().toLowerCase()) + .ifPresent( + existingUser -> { + boolean removed = removeNonActivatedUser(existingUser); + if (!removed) { + throw new UsernameAlreadyUsedException(); + } + } + ); + userRepository + .findOneByEmailIgnoreCase(userDTO.getEmail()) + .ifPresent( + existingUser -> { + boolean removed = removeNonActivatedUser(existingUser); + if (!removed) { + throw new EmailAlreadyUsedException(); + } + } + ); + User newUser = new User(); + String encryptedPassword = passwordEncoder.encode(password); + newUser.setLogin(userDTO.getLogin().toLowerCase()); + + // new user gets initially a generated password + newUser.setPassword(encryptedPassword); + newUser.setFirstName(userDTO.getFirstName()); + newUser.setLastName(userDTO.getLastName()); + if (userDTO.getEmail() != null) { + newUser.setEmail(userDTO.getEmail().toLowerCase()); + } + newUser.setImageUrl(userDTO.getImageUrl()); + newUser.setLangKey(userDTO.getLangKey()); + + // new user is not active + newUser.setActivated(false); + + // new user gets registration key + newUser.setActivationKey(RandomUtil.generateActivationKey()); + Set<Authority> authorities = new HashSet<>(); + authorityRepository.findById(AuthoritiesConstants.USER).ifPresent(authorities::add); + newUser.setAuthorities(authorities); + userRepository.save(newUser); + log.debug("Created Information for User: {}", newUser); + return newUser; + } + + private boolean removeNonActivatedUser(User existingUser) { + if (existingUser.getActivated()) { + return false; + } + userRepository.delete(existingUser); + userRepository.flush(); + return true; + } + + public User createUser(UserDTO userDTO) { + User user = new User(); + user.setLogin(userDTO.getLogin().toLowerCase()); + user.setFirstName(userDTO.getFirstName()); + user.setLastName(userDTO.getLastName()); + if (userDTO.getEmail() != null) { + user.setEmail(userDTO.getEmail().toLowerCase()); + } + user.setImageUrl(userDTO.getImageUrl()); + if (userDTO.getLangKey() == null) { + user.setLangKey(Constants.DEFAULT_LANGUAGE); // default language + } else { + user.setLangKey(userDTO.getLangKey()); + } + String encryptedPassword = passwordEncoder.encode(RandomUtil.generatePassword()); + user.setPassword(encryptedPassword); + user.setResetKey(RandomUtil.generateResetKey()); + user.setResetDate(Instant.now()); + user.setActivated(true); + if (userDTO.getAuthorities() != null) { + Set<Authority> authorities = userDTO + .getAuthorities() + .stream() + .map(authorityRepository::findById) + .filter(Optional::isPresent) + .map(Optional::get) + .collect(Collectors.toSet()); + user.setAuthorities(authorities); + } + userRepository.save(user); + log.debug("Created Information for User: {}", user); + return user; + } + + /** + * Update all information for a specific user, and return the modified user. + * + * @param userDTO user to update. + * @return updated user. + */ + public Optional<UserDTO> updateUser(UserDTO userDTO) { + return Optional + .of(userRepository.findById(userDTO.getId())) + .filter(Optional::isPresent) + .map(Optional::get) + .map( + user -> { + user.setLogin(userDTO.getLogin().toLowerCase()); + user.setFirstName(userDTO.getFirstName()); + user.setLastName(userDTO.getLastName()); + if (userDTO.getEmail() != null) { + user.setEmail(userDTO.getEmail().toLowerCase()); + } + user.setImageUrl(userDTO.getImageUrl()); + user.setActivated(userDTO.isActivated()); + user.setLangKey(userDTO.getLangKey()); + Set<Authority> managedAuthorities = user.getAuthorities(); + managedAuthorities.clear(); + userDTO + .getAuthorities() + .stream() + .map(authorityRepository::findById) + .filter(Optional::isPresent) + .map(Optional::get) + .forEach(managedAuthorities::add); + log.debug("Changed Information for User: {}", user); + return user; + } + ) + .map(UserDTO::new); + } + + public void deleteUser(String login) { + userRepository + .findOneByLogin(login) + .ifPresent( + user -> { + userRepository.delete(user); + log.debug("Deleted User: {}", user); + } + ); + } + + /** + * Update basic information (first name, last name, email, language) for the current user. + * + * @param firstName first name of user. + * @param lastName last name of user. + * @param email email id of user. + * @param langKey language key. + * @param imageUrl image URL of user. + */ + public void updateUser(String firstName, String lastName, String email, String langKey, String imageUrl) { + SecurityUtils + .getCurrentUserLogin() + .flatMap(userRepository::findOneByLogin) + .ifPresent( + user -> { + user.setFirstName(firstName); + user.setLastName(lastName); + if (email != null) { + user.setEmail(email.toLowerCase()); + } + user.setLangKey(langKey); + user.setImageUrl(imageUrl); + log.debug("Changed Information for User: {}", user); + } + ); + } + + @Transactional + public void changePassword(String currentClearTextPassword, String newPassword) { + SecurityUtils + .getCurrentUserLogin() + .flatMap(userRepository::findOneByLogin) + .ifPresent( + user -> { + String currentEncryptedPassword = user.getPassword(); + if (!passwordEncoder.matches(currentClearTextPassword, currentEncryptedPassword)) { + throw new InvalidPasswordException(); + } + String encryptedPassword = passwordEncoder.encode(newPassword); + user.setPassword(encryptedPassword); + log.debug("Changed password for User: {}", user); + } + ); + } + + @Transactional(readOnly = true) + public Page<UserDTO> getAllManagedUsers(Pageable pageable) { + return userRepository.findAllByLoginNot(pageable, Constants.ANONYMOUS_USER).map(UserDTO::new); + } + + @Transactional(readOnly = true) + public Optional<User> getUserWithAuthoritiesByLogin(String login) { + return userRepository.findOneWithAuthoritiesByLogin(login); + } + + @Transactional(readOnly = true) + public Optional<User> getUserWithAuthorities() { + return SecurityUtils.getCurrentUserLogin().flatMap(userRepository::findOneWithAuthoritiesByLogin); + } + + /** + * Not activated users should be automatically deleted after 3 days. + * <p> + * This is scheduled to get fired everyday, at 01:00 (am). + */ + @Scheduled(cron = "0 0 1 * * ?") + public void removeNotActivatedUsers() { + userRepository + .findAllByActivatedIsFalseAndActivationKeyIsNotNullAndCreatedDateBefore(Instant.now().minus(3, ChronoUnit.DAYS)) + .forEach( + user -> { + log.debug("Deleting not activated user {}", user.getLogin()); + userRepository.delete(user); + } + ); + } + + /** + * Gets a list of all the authorities. + * @return a list of all the authorities. + */ + @Transactional(readOnly = true) + public List<String> getAuthorities() { + return authorityRepository.findAll().stream().map(Authority::getName).collect(Collectors.toList()); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/service/UsernameAlreadyUsedException.java b/borestop/src/main/java/com/ippon/borestop/service/UsernameAlreadyUsedException.java new file mode 100644 index 0000000000000000000000000000000000000000..ecef27e2f63a9dea8aafd12a1e9eb897e02bc7d9 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/service/UsernameAlreadyUsedException.java @@ -0,0 +1,9 @@ +package com.ippon.borestop.service; + +public class UsernameAlreadyUsedException extends RuntimeException { + private static final long serialVersionUID = 1L; + + public UsernameAlreadyUsedException() { + super("Login name already used!"); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/service/dto/PasswordChangeDTO.java b/borestop/src/main/java/com/ippon/borestop/service/dto/PasswordChangeDTO.java new file mode 100644 index 0000000000000000000000000000000000000000..6243b6d5e733060c704792e1b05976cbf9de803f --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/service/dto/PasswordChangeDTO.java @@ -0,0 +1,34 @@ +package com.ippon.borestop.service.dto; + +/** + * A DTO representing a password change required data - current and new password. + */ +public class PasswordChangeDTO { + private String currentPassword; + private String newPassword; + + public PasswordChangeDTO() { + // Empty constructor needed for Jackson. + } + + public PasswordChangeDTO(String currentPassword, String newPassword) { + this.currentPassword = currentPassword; + this.newPassword = newPassword; + } + + public String getCurrentPassword() { + return currentPassword; + } + + public void setCurrentPassword(String currentPassword) { + this.currentPassword = currentPassword; + } + + public String getNewPassword() { + return newPassword; + } + + public void setNewPassword(String newPassword) { + this.newPassword = newPassword; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/service/dto/UserDTO.java b/borestop/src/main/java/com/ippon/borestop/service/dto/UserDTO.java new file mode 100644 index 0000000000000000000000000000000000000000..730c85e1fd4b7e370bdb8baa42e5ece31d9f7176 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/service/dto/UserDTO.java @@ -0,0 +1,192 @@ +package com.ippon.borestop.service.dto; + +import com.ippon.borestop.config.Constants; +import com.ippon.borestop.domain.Authority; +import com.ippon.borestop.domain.User; +import java.time.Instant; +import java.util.Set; +import java.util.stream.Collectors; +import javax.validation.constraints.*; + +/** + * A DTO representing a user, with his authorities. + */ +public class UserDTO { + private Long id; + + @NotBlank + @Pattern(regexp = Constants.LOGIN_REGEX) + @Size(min = 1, max = 50) + private String login; + + @Size(max = 50) + private String firstName; + + @Size(max = 50) + private String lastName; + + @Email + @Size(min = 5, max = 254) + private String email; + + @Size(max = 256) + private String imageUrl; + + private boolean activated = false; + + @Size(min = 2, max = 10) + private String langKey; + + private String createdBy; + + private Instant createdDate; + + private String lastModifiedBy; + + private Instant lastModifiedDate; + + private Set<String> authorities; + + public UserDTO() { + // Empty constructor needed for Jackson. + } + + public UserDTO(User user) { + this.id = user.getId(); + this.login = user.getLogin(); + this.firstName = user.getFirstName(); + this.lastName = user.getLastName(); + this.email = user.getEmail(); + this.activated = user.getActivated(); + this.imageUrl = user.getImageUrl(); + this.langKey = user.getLangKey(); + this.createdBy = user.getCreatedBy(); + this.createdDate = user.getCreatedDate(); + this.lastModifiedBy = user.getLastModifiedBy(); + this.lastModifiedDate = user.getLastModifiedDate(); + this.authorities = user.getAuthorities().stream().map(Authority::getName).collect(Collectors.toSet()); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getLogin() { + return login; + } + + public void setLogin(String login) { + this.login = login; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getImageUrl() { + return imageUrl; + } + + public void setImageUrl(String imageUrl) { + this.imageUrl = imageUrl; + } + + public boolean isActivated() { + return activated; + } + + public void setActivated(boolean activated) { + this.activated = activated; + } + + public String getLangKey() { + return langKey; + } + + public void setLangKey(String langKey) { + this.langKey = langKey; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Instant getCreatedDate() { + return createdDate; + } + + public void setCreatedDate(Instant createdDate) { + this.createdDate = createdDate; + } + + public String getLastModifiedBy() { + return lastModifiedBy; + } + + public void setLastModifiedBy(String lastModifiedBy) { + this.lastModifiedBy = lastModifiedBy; + } + + public Instant getLastModifiedDate() { + return lastModifiedDate; + } + + public void setLastModifiedDate(Instant lastModifiedDate) { + this.lastModifiedDate = lastModifiedDate; + } + + public Set<String> getAuthorities() { + return authorities; + } + + public void setAuthorities(Set<String> authorities) { + this.authorities = authorities; + } + + // prettier-ignore + @Override + public String toString() { + return "UserDTO{" + + "login='" + login + '\'' + + ", firstName='" + firstName + '\'' + + ", lastName='" + lastName + '\'' + + ", email='" + email + '\'' + + ", imageUrl='" + imageUrl + '\'' + + ", activated=" + activated + + ", langKey='" + langKey + '\'' + + ", createdBy=" + createdBy + + ", createdDate=" + createdDate + + ", lastModifiedBy='" + lastModifiedBy + '\'' + + ", lastModifiedDate=" + lastModifiedDate + + ", authorities=" + authorities + + "}"; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/service/dto/package-info.java b/borestop/src/main/java/com/ippon/borestop/service/dto/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..a9364fad1acceefd343bc41e4e428d0f3b217434 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/service/dto/package-info.java @@ -0,0 +1,4 @@ +/** + * Data Transfer Objects. + */ +package com.ippon.borestop.service.dto; diff --git a/borestop/src/main/java/com/ippon/borestop/service/mapper/UserMapper.java b/borestop/src/main/java/com/ippon/borestop/service/mapper/UserMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..91922e6c3a86ebc1eca0bc9c2e246e8a40c4331a --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/service/mapper/UserMapper.java @@ -0,0 +1,78 @@ +package com.ippon.borestop.service.mapper; + +import com.ippon.borestop.domain.Authority; +import com.ippon.borestop.domain.User; +import com.ippon.borestop.service.dto.UserDTO; +import java.util.*; +import java.util.stream.Collectors; +import org.springframework.stereotype.Service; + +/** + * Mapper for the entity {@link User} and its DTO called {@link UserDTO}. + * + * Normal mappers are generated using MapStruct, this one is hand-coded as MapStruct + * support is still in beta, and requires a manual step with an IDE. + */ +@Service +public class UserMapper { + + public List<UserDTO> usersToUserDTOs(List<User> users) { + return users.stream().filter(Objects::nonNull).map(this::userToUserDTO).collect(Collectors.toList()); + } + + public UserDTO userToUserDTO(User user) { + return new UserDTO(user); + } + + public List<User> userDTOsToUsers(List<UserDTO> userDTOs) { + return userDTOs.stream().filter(Objects::nonNull).map(this::userDTOToUser).collect(Collectors.toList()); + } + + public User userDTOToUser(UserDTO userDTO) { + if (userDTO == null) { + return null; + } else { + User user = new User(); + user.setId(userDTO.getId()); + user.setLogin(userDTO.getLogin()); + user.setFirstName(userDTO.getFirstName()); + user.setLastName(userDTO.getLastName()); + user.setEmail(userDTO.getEmail()); + user.setImageUrl(userDTO.getImageUrl()); + user.setActivated(userDTO.isActivated()); + user.setLangKey(userDTO.getLangKey()); + Set<Authority> authorities = this.authoritiesFromStrings(userDTO.getAuthorities()); + user.setAuthorities(authorities); + return user; + } + } + + private Set<Authority> authoritiesFromStrings(Set<String> authoritiesAsString) { + Set<Authority> authorities = new HashSet<>(); + + if (authoritiesAsString != null) { + authorities = + authoritiesAsString + .stream() + .map( + string -> { + Authority auth = new Authority(); + auth.setName(string); + return auth; + } + ) + .collect(Collectors.toSet()); + } + + return authorities; + } + + public User userFromId(Long id) { + if (id == null) { + return null; + } + User user = new User(); + user.setId(id); + return user; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/service/mapper/package-info.java b/borestop/src/main/java/com/ippon/borestop/service/mapper/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..bc1386b7d792e08b7978da21c943d67f22d5414f --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/service/mapper/package-info.java @@ -0,0 +1,4 @@ +/** + * MapStruct mappers for mapping domain objects and Data Transfer Objects. + */ +package com.ippon.borestop.service.mapper; diff --git a/borestop/src/main/java/com/ippon/borestop/service/package-info.java b/borestop/src/main/java/com/ippon/borestop/service/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..d47ab40f3a7c86d94be8251d042437e016f6775f --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/service/package-info.java @@ -0,0 +1,4 @@ +/** + * Service layer beans. + */ +package com.ippon.borestop.service; diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/AccountResource.java b/borestop/src/main/java/com/ippon/borestop/web/rest/AccountResource.java new file mode 100644 index 0000000000000000000000000000000000000000..a7f2a339d0ef0bfc347b514e832235ec11597970 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/AccountResource.java @@ -0,0 +1,186 @@ +package com.ippon.borestop.web.rest; + +import com.ippon.borestop.domain.User; +import com.ippon.borestop.repository.UserRepository; +import com.ippon.borestop.security.SecurityUtils; +import com.ippon.borestop.service.MailService; +import com.ippon.borestop.service.UserService; +import com.ippon.borestop.service.dto.PasswordChangeDTO; +import com.ippon.borestop.service.dto.UserDTO; +import com.ippon.borestop.web.rest.errors.*; +import com.ippon.borestop.web.rest.vm.KeyAndPasswordVM; +import com.ippon.borestop.web.rest.vm.ManagedUserVM; +import java.util.*; +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; + +/** + * REST controller for managing the current user's account. + */ +@RestController +@RequestMapping("/api") +public class AccountResource { + + private static class AccountResourceException extends RuntimeException { + + private AccountResourceException(String message) { + super(message); + } + } + + private final Logger log = LoggerFactory.getLogger(AccountResource.class); + + private final UserRepository userRepository; + + private final UserService userService; + + private final MailService mailService; + + public AccountResource(UserRepository userRepository, UserService userService, MailService mailService) { + this.userRepository = userRepository; + this.userService = userService; + this.mailService = mailService; + } + + /** + * {@code POST /register} : register the user. + * + * @param managedUserVM the managed user View Model. + * @throws InvalidPasswordException {@code 400 (Bad Request)} if the password is incorrect. + * @throws EmailAlreadyUsedException {@code 400 (Bad Request)} if the email is already used. + * @throws LoginAlreadyUsedException {@code 400 (Bad Request)} if the login is already used. + */ + @PostMapping("/register") + @ResponseStatus(HttpStatus.CREATED) + public void registerAccount(@Valid @RequestBody ManagedUserVM managedUserVM) { + if (!checkPasswordLength(managedUserVM.getPassword())) { + throw new InvalidPasswordException(); + } + User user = userService.registerUser(managedUserVM, managedUserVM.getPassword()); + mailService.sendActivationEmail(user); + } + + /** + * {@code GET /activate} : activate the registered user. + * + * @param key the activation key. + * @throws RuntimeException {@code 500 (Internal Server Error)} if the user couldn't be activated. + */ + @GetMapping("/activate") + public void activateAccount(@RequestParam(value = "key") String key) { + Optional<User> user = userService.activateRegistration(key); + if (!user.isPresent()) { + throw new AccountResourceException("No user was found for this activation key"); + } + } + + /** + * {@code GET /authenticate} : check if the user is authenticated, and return its login. + * + * @param request the HTTP request. + * @return the login if the user is authenticated. + */ + @GetMapping("/authenticate") + public String isAuthenticated(HttpServletRequest request) { + log.debug("REST request to check if the current user is authenticated"); + return request.getRemoteUser(); + } + + /** + * {@code GET /account} : get the current user. + * + * @return the current user. + * @throws RuntimeException {@code 500 (Internal Server Error)} if the user couldn't be returned. + */ + @GetMapping("/account") + public UserDTO getAccount() { + return userService + .getUserWithAuthorities() + .map(UserDTO::new) + .orElseThrow(() -> new AccountResourceException("User could not be found")); + } + + /** + * {@code POST /account} : update the current user information. + * + * @param userDTO the current user information. + * @throws EmailAlreadyUsedException {@code 400 (Bad Request)} if the email is already used. + * @throws RuntimeException {@code 500 (Internal Server Error)} if the user login wasn't found. + */ + @PostMapping("/account") + public void saveAccount(@Valid @RequestBody UserDTO userDTO) { + String userLogin = SecurityUtils.getCurrentUserLogin().orElseThrow(() -> new AccountResourceException("Current user login not found")); + Optional<User> existingUser = userRepository.findOneByEmailIgnoreCase(userDTO.getEmail()); + if (existingUser.isPresent() && (!existingUser.get().getLogin().equalsIgnoreCase(userLogin))) { + throw new EmailAlreadyUsedException(); + } + Optional<User> user = userRepository.findOneByLogin(userLogin); + if (!user.isPresent()) { + throw new AccountResourceException("User could not be found"); + } + userService.updateUser(userDTO.getFirstName(), userDTO.getLastName(), userDTO.getEmail(), userDTO.getLangKey(), userDTO.getImageUrl()); + } + + /** + * {@code POST /account/change-password} : changes the current user's password. + * + * @param passwordChangeDto current and new password. + * @throws InvalidPasswordException {@code 400 (Bad Request)} if the new password is incorrect. + */ + @PostMapping(path = "/account/change-password") + public void changePassword(@RequestBody PasswordChangeDTO passwordChangeDto) { + if (!checkPasswordLength(passwordChangeDto.getNewPassword())) { + throw new InvalidPasswordException(); + } + userService.changePassword(passwordChangeDto.getCurrentPassword(), passwordChangeDto.getNewPassword()); + } + + /** + * {@code POST /account/reset-password/init} : Send an email to reset the password of the user. + * + * @param mail the mail of the user. + */ + @PostMapping(path = "/account/reset-password/init") + public void requestPasswordReset(@RequestBody String mail) { + Optional<User> user = userService.requestPasswordReset(mail); + if (user.isPresent()) { + mailService.sendPasswordResetMail(user.get()); + } else { + // Pretend the request has been successful to prevent checking which emails really exist + // but log that an invalid attempt has been made + log.warn("Password reset requested for non existing mail"); + } + } + + /** + * {@code POST /account/reset-password/finish} : Finish to reset the password of the user. + * + * @param keyAndPassword the generated key and the new password. + * @throws InvalidPasswordException {@code 400 (Bad Request)} if the password is incorrect. + * @throws RuntimeException {@code 500 (Internal Server Error)} if the password could not be reset. + */ + @PostMapping(path = "/account/reset-password/finish") + public void finishPasswordReset(@RequestBody KeyAndPasswordVM keyAndPassword) { + if (!checkPasswordLength(keyAndPassword.getNewPassword())) { + throw new InvalidPasswordException(); + } + Optional<User> user = userService.completePasswordReset(keyAndPassword.getNewPassword(), keyAndPassword.getKey()); + + if (!user.isPresent()) { + throw new AccountResourceException("No user was found for this reset key"); + } + } + + private static boolean checkPasswordLength(String password) { + return ( + !StringUtils.isEmpty(password) && + password.length() >= ManagedUserVM.PASSWORD_MIN_LENGTH && + password.length() <= ManagedUserVM.PASSWORD_MAX_LENGTH + ); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/AuditResource.java b/borestop/src/main/java/com/ippon/borestop/web/rest/AuditResource.java new file mode 100644 index 0000000000000000000000000000000000000000..eadb1438eea9e1948c1a2d0cdb96a66f4054dd0b --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/AuditResource.java @@ -0,0 +1,76 @@ +package com.ippon.borestop.web.rest; + +import com.ippon.borestop.service.AuditEventService; +import io.github.jhipster.web.util.PaginationUtil; +import io.github.jhipster.web.util.ResponseUtil; +import java.time.Instant; +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.List; +import org.springframework.boot.actuate.audit.AuditEvent; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; + +/** + * REST controller for getting the {@link AuditEvent}s. + */ +@RestController +@RequestMapping("/management/audits") +public class AuditResource { + private final AuditEventService auditEventService; + + public AuditResource(AuditEventService auditEventService) { + this.auditEventService = auditEventService; + } + + /** + * {@code GET /audits} : get a page of {@link AuditEvent}s. + * + * @param pageable the pagination information. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the list of {@link AuditEvent}s in body. + */ + @GetMapping + public ResponseEntity<List<AuditEvent>> getAll(Pageable pageable) { + Page<AuditEvent> page = auditEventService.findAll(pageable); + HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(ServletUriComponentsBuilder.fromCurrentRequest(), page); + return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK); + } + + /** + * {@code GET /audits} : get a page of {@link AuditEvent} between the {@code fromDate} and {@code toDate}. + * + * @param fromDate the start of the time period of {@link AuditEvent} to get. + * @param toDate the end of the time period of {@link AuditEvent} to get. + * @param pageable the pagination information. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the list of {@link AuditEvent} in body. + */ + @GetMapping(params = { "fromDate", "toDate" }) + public ResponseEntity<List<AuditEvent>> getByDates( + @RequestParam(value = "fromDate") LocalDate fromDate, + @RequestParam(value = "toDate") LocalDate toDate, + Pageable pageable + ) { + Instant from = fromDate.atStartOfDay(ZoneId.systemDefault()).toInstant(); + Instant to = toDate.atStartOfDay(ZoneId.systemDefault()).plusDays(1).toInstant(); + + Page<AuditEvent> page = auditEventService.findByDates(from, to, pageable); + HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(ServletUriComponentsBuilder.fromCurrentRequest(), page); + return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK); + } + + /** + * {@code GET /audits/:id} : get an {@link AuditEvent} by id. + * + * @param id the id of the entity to get. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the {@link AuditEvent} in body, or status {@code 404 (Not Found)}. + */ + @GetMapping("/{id:.+}") + public ResponseEntity<AuditEvent> get(@PathVariable Long id) { + return ResponseUtil.wrapOrNotFound(auditEventService.find(id)); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/ClientForwardController.java b/borestop/src/main/java/com/ippon/borestop/web/rest/ClientForwardController.java new file mode 100644 index 0000000000000000000000000000000000000000..f5ea63d4351c545a3481dc30b20b753f131299c9 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/ClientForwardController.java @@ -0,0 +1,17 @@ +package com.ippon.borestop.web.rest; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class ClientForwardController { + + /** + * Forwards any unmapped paths (except those containing a period) to the client {@code index.html}. + * @return forward to client {@code index.html}. + */ + @GetMapping(value = "/**/{path:[^\\.]*}") + public String forward() { + return "forward:/"; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/UserJWTController.java b/borestop/src/main/java/com/ippon/borestop/web/rest/UserJWTController.java new file mode 100644 index 0000000000000000000000000000000000000000..e2a6aa375e71cc745bd8b3d334b6fcd9e9b3b486 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/UserJWTController.java @@ -0,0 +1,67 @@ +package com.ippon.borestop.web.rest; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.ippon.borestop.security.jwt.JWTFilter; +import com.ippon.borestop.security.jwt.TokenProvider; +import com.ippon.borestop.web.rest.vm.LoginVM; +import javax.validation.Valid; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.web.bind.annotation.*; + +/** + * Controller to authenticate users. + */ +@RestController +@RequestMapping("/api") +public class UserJWTController { + private final TokenProvider tokenProvider; + + private final AuthenticationManagerBuilder authenticationManagerBuilder; + + public UserJWTController(TokenProvider tokenProvider, AuthenticationManagerBuilder authenticationManagerBuilder) { + this.tokenProvider = tokenProvider; + this.authenticationManagerBuilder = authenticationManagerBuilder; + } + + @PostMapping("/authenticate") + public ResponseEntity<JWTToken> authorize(@Valid @RequestBody LoginVM loginVM) { + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken( + loginVM.getUsername(), + loginVM.getPassword() + ); + + Authentication authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken); + SecurityContextHolder.getContext().setAuthentication(authentication); + boolean rememberMe = (loginVM.isRememberMe() == null) ? false : loginVM.isRememberMe(); + String jwt = tokenProvider.createToken(authentication, rememberMe); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add(JWTFilter.AUTHORIZATION_HEADER, "Bearer " + jwt); + return new ResponseEntity<>(new JWTToken(jwt), httpHeaders, HttpStatus.OK); + } + + /** + * Object to return as body in JWT Authentication. + */ + static class JWTToken { + private String idToken; + + JWTToken(String idToken) { + this.idToken = idToken; + } + + @JsonProperty("id_token") + String getIdToken() { + return idToken; + } + + void setIdToken(String idToken) { + this.idToken = idToken; + } + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/UserResource.java b/borestop/src/main/java/com/ippon/borestop/web/rest/UserResource.java new file mode 100644 index 0000000000000000000000000000000000000000..5f84615baa86387bfadb16c271a1944d94cf0ffa --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/UserResource.java @@ -0,0 +1,183 @@ +package com.ippon.borestop.web.rest; + +import com.ippon.borestop.config.Constants; +import com.ippon.borestop.domain.User; +import com.ippon.borestop.repository.UserRepository; +import com.ippon.borestop.security.AuthoritiesConstants; +import com.ippon.borestop.service.MailService; +import com.ippon.borestop.service.UserService; +import com.ippon.borestop.service.dto.UserDTO; +import com.ippon.borestop.web.rest.errors.BadRequestAlertException; +import com.ippon.borestop.web.rest.errors.EmailAlreadyUsedException; +import com.ippon.borestop.web.rest.errors.LoginAlreadyUsedException; +import io.github.jhipster.web.util.HeaderUtil; +import io.github.jhipster.web.util.PaginationUtil; +import io.github.jhipster.web.util.ResponseUtil; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.*; +import javax.validation.Valid; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; + +/** + * REST controller for managing users. + * <p> + * This class accesses the {@link User} entity, and needs to fetch its collection of authorities. + * <p> + * For a normal use-case, it would be better to have an eager relationship between User and Authority, + * and send everything to the client side: there would be no View Model and DTO, a lot less code, and an outer-join + * which would be good for performance. + * <p> + * We use a View Model and a DTO for 3 reasons: + * <ul> + * <li>We want to keep a lazy association between the user and the authorities, because people will + * quite often do relationships with the user, and we don't want them to get the authorities all + * the time for nothing (for performance reasons). This is the #1 goal: we should not impact our users' + * application because of this use-case.</li> + * <li> Not having an outer join causes n+1 requests to the database. This is not a real issue as + * we have by default a second-level cache. This means on the first HTTP call we do the n+1 requests, + * but then all authorities come from the cache, so in fact it's much better than doing an outer join + * (which will get lots of data from the database, for each HTTP call).</li> + * <li> As this manages users, for security reasons, we'd rather have a DTO layer.</li> + * </ul> + * <p> + * Another option would be to have a specific JPA entity graph to handle this case. + */ +@RestController +@RequestMapping("/api") +public class UserResource { + private final Logger log = LoggerFactory.getLogger(UserResource.class); + + @Value("${jhipster.clientApp.name}") + private String applicationName; + + private final UserService userService; + + private final UserRepository userRepository; + + private final MailService mailService; + + public UserResource(UserService userService, UserRepository userRepository, MailService mailService) { + this.userService = userService; + this.userRepository = userRepository; + this.mailService = mailService; + } + + /** + * {@code POST /users} : Creates a new user. + * <p> + * Creates a new user if the login and email are not already used, and sends an + * mail with an activation link. + * The user needs to be activated on creation. + * + * @param userDTO the user to create. + * @return the {@link ResponseEntity} with status {@code 201 (Created)} and with body the new user, or with status {@code 400 (Bad Request)} if the login or email is already in use. + * @throws URISyntaxException if the Location URI syntax is incorrect. + * @throws BadRequestAlertException {@code 400 (Bad Request)} if the login or email is already in use. + */ + @PostMapping("/users") + @PreAuthorize("hasAuthority(\"" + AuthoritiesConstants.ADMIN + "\")") + public ResponseEntity<User> createUser(@Valid @RequestBody UserDTO userDTO) throws URISyntaxException { + log.debug("REST request to save User : {}", userDTO); + + if (userDTO.getId() != null) { + throw new BadRequestAlertException("A new user cannot already have an ID", "userManagement", "idexists"); + // Lowercase the user login before comparing with database + } else if (userRepository.findOneByLogin(userDTO.getLogin().toLowerCase()).isPresent()) { + throw new LoginAlreadyUsedException(); + } else if (userRepository.findOneByEmailIgnoreCase(userDTO.getEmail()).isPresent()) { + throw new EmailAlreadyUsedException(); + } else { + User newUser = userService.createUser(userDTO); + mailService.sendCreationEmail(newUser); + return ResponseEntity + .created(new URI("/api/users/" + newUser.getLogin())) + .headers(HeaderUtil.createAlert(applicationName, "userManagement.created", newUser.getLogin())) + .body(newUser); + } + } + + /** + * {@code PUT /users} : Updates an existing User. + * + * @param userDTO the user to update. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated user. + * @throws EmailAlreadyUsedException {@code 400 (Bad Request)} if the email is already in use. + * @throws LoginAlreadyUsedException {@code 400 (Bad Request)} if the login is already in use. + */ + @PutMapping("/users") + @PreAuthorize("hasAuthority(\"" + AuthoritiesConstants.ADMIN + "\")") + public ResponseEntity<UserDTO> updateUser(@Valid @RequestBody UserDTO userDTO) { + log.debug("REST request to update User : {}", userDTO); + Optional<User> existingUser = userRepository.findOneByEmailIgnoreCase(userDTO.getEmail()); + if (existingUser.isPresent() && (!existingUser.get().getId().equals(userDTO.getId()))) { + throw new EmailAlreadyUsedException(); + } + existingUser = userRepository.findOneByLogin(userDTO.getLogin().toLowerCase()); + if (existingUser.isPresent() && (!existingUser.get().getId().equals(userDTO.getId()))) { + throw new LoginAlreadyUsedException(); + } + Optional<UserDTO> updatedUser = userService.updateUser(userDTO); + + return ResponseUtil.wrapOrNotFound(updatedUser, HeaderUtil.createAlert(applicationName, "userManagement.updated", userDTO.getLogin())); + } + + /** + * {@code GET /users} : get all users. + * + * @param pageable the pagination information. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body all users. + */ + @GetMapping("/users") + public ResponseEntity<List<UserDTO>> getAllUsers(Pageable pageable) { + final Page<UserDTO> page = userService.getAllManagedUsers(pageable); + HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(ServletUriComponentsBuilder.fromCurrentRequest(), page); + return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK); + } + + /** + * Gets a list of all roles. + * @return a string list of all roles. + */ + @GetMapping("/users/authorities") + @PreAuthorize("hasAuthority(\"" + AuthoritiesConstants.ADMIN + "\")") + public List<String> getAuthorities() { + return userService.getAuthorities(); + } + + /** + * {@code GET /users/:login} : get the "login" user. + * + * @param login the login of the user to find. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the "login" user, or with status {@code 404 (Not Found)}. + */ + @GetMapping("/users/{login:" + Constants.LOGIN_REGEX + "}") + public ResponseEntity<UserDTO> getUser(@PathVariable String login) { + log.debug("REST request to get User : {}", login); + return ResponseUtil.wrapOrNotFound(userService.getUserWithAuthoritiesByLogin(login).map(UserDTO::new)); + } + + /** + * {@code DELETE /users/:login} : delete the "login" User. + * + * @param login the login of the user to delete. + * @return the {@link ResponseEntity} with status {@code 204 (NO_CONTENT)}. + */ + @DeleteMapping("/users/{login:" + Constants.LOGIN_REGEX + "}") + @PreAuthorize("hasAuthority(\"" + AuthoritiesConstants.ADMIN + "\")") + public ResponseEntity<Void> deleteUser(@PathVariable String login) { + log.debug("REST request to delete User: {}", login); + userService.deleteUser(login); + return ResponseEntity.noContent().headers(HeaderUtil.createAlert(applicationName, "userManagement.deleted", login)).build(); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/errors/BadRequestAlertException.java b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/BadRequestAlertException.java new file mode 100644 index 0000000000000000000000000000000000000000..2dab39d05a5ba732ed40c98db8b499e89c7c5653 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/BadRequestAlertException.java @@ -0,0 +1,40 @@ +package com.ippon.borestop.web.rest.errors; + +import java.net.URI; +import java.util.HashMap; +import java.util.Map; +import org.zalando.problem.AbstractThrowableProblem; +import org.zalando.problem.Status; + +public class BadRequestAlertException extends AbstractThrowableProblem { + private static final long serialVersionUID = 1L; + + private final String entityName; + + private final String errorKey; + + public BadRequestAlertException(String defaultMessage, String entityName, String errorKey) { + this(ErrorConstants.DEFAULT_TYPE, defaultMessage, entityName, errorKey); + } + + public BadRequestAlertException(URI type, String defaultMessage, String entityName, String errorKey) { + super(type, defaultMessage, Status.BAD_REQUEST, null, null, null, getAlertParameters(entityName, errorKey)); + this.entityName = entityName; + this.errorKey = errorKey; + } + + public String getEntityName() { + return entityName; + } + + public String getErrorKey() { + return errorKey; + } + + private static Map<String, Object> getAlertParameters(String entityName, String errorKey) { + Map<String, Object> parameters = new HashMap<>(); + parameters.put("message", "error." + errorKey); + parameters.put("params", entityName); + return parameters; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/errors/EmailAlreadyUsedException.java b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/EmailAlreadyUsedException.java new file mode 100644 index 0000000000000000000000000000000000000000..8d061fed270a8a4a405d8a342734eb48c0a2c86c --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/EmailAlreadyUsedException.java @@ -0,0 +1,9 @@ +package com.ippon.borestop.web.rest.errors; + +public class EmailAlreadyUsedException extends BadRequestAlertException { + private static final long serialVersionUID = 1L; + + public EmailAlreadyUsedException() { + super(ErrorConstants.EMAIL_ALREADY_USED_TYPE, "Email is already in use!", "userManagement", "emailexists"); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/errors/ErrorConstants.java b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/ErrorConstants.java new file mode 100644 index 0000000000000000000000000000000000000000..8f88c93009852551ac7d1c3db0e8e4835cf3b45a --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/ErrorConstants.java @@ -0,0 +1,16 @@ +package com.ippon.borestop.web.rest.errors; + +import java.net.URI; + +public final class ErrorConstants { + public static final String ERR_CONCURRENCY_FAILURE = "error.concurrencyFailure"; + public static final String ERR_VALIDATION = "error.validation"; + public static final String PROBLEM_BASE_URL = "https://www.jhipster.tech/problem"; + public static final URI DEFAULT_TYPE = URI.create(PROBLEM_BASE_URL + "/problem-with-message"); + public static final URI CONSTRAINT_VIOLATION_TYPE = URI.create(PROBLEM_BASE_URL + "/constraint-violation"); + public static final URI INVALID_PASSWORD_TYPE = URI.create(PROBLEM_BASE_URL + "/invalid-password"); + public static final URI EMAIL_ALREADY_USED_TYPE = URI.create(PROBLEM_BASE_URL + "/email-already-used"); + public static final URI LOGIN_ALREADY_USED_TYPE = URI.create(PROBLEM_BASE_URL + "/login-already-used"); + + private ErrorConstants() {} +} diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/errors/ExceptionTranslator.java b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/ExceptionTranslator.java new file mode 100644 index 0000000000000000000000000000000000000000..b63464c5cbf10c6fddd9dc8548c47aea5fcbe7bd --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/ExceptionTranslator.java @@ -0,0 +1,134 @@ +package com.ippon.borestop.web.rest.errors; + +import io.github.jhipster.web.util.HeaderUtil; +import java.util.List; +import java.util.stream.Collectors; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import javax.servlet.http.HttpServletRequest; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.dao.ConcurrencyFailureException; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.context.request.NativeWebRequest; +import org.zalando.problem.DefaultProblem; +import org.zalando.problem.Problem; +import org.zalando.problem.ProblemBuilder; +import org.zalando.problem.Status; +import org.zalando.problem.spring.web.advice.ProblemHandling; +import org.zalando.problem.spring.web.advice.security.SecurityAdviceTrait; +import org.zalando.problem.violations.ConstraintViolationProblem; + +/** + * Controller advice to translate the server side exceptions to client-friendly json structures. + * The error response follows RFC7807 - Problem Details for HTTP APIs (https://tools.ietf.org/html/rfc7807). + */ +@ControllerAdvice +public class ExceptionTranslator implements ProblemHandling, SecurityAdviceTrait { + private static final String FIELD_ERRORS_KEY = "fieldErrors"; + private static final String MESSAGE_KEY = "message"; + private static final String PATH_KEY = "path"; + private static final String VIOLATIONS_KEY = "violations"; + + @Value("${jhipster.clientApp.name}") + private String applicationName; + + /** + * Post-process the Problem payload to add the message key for the front-end if needed. + */ + @Override + public ResponseEntity<Problem> process(@Nullable ResponseEntity<Problem> entity, NativeWebRequest request) { + if (entity == null) { + return entity; + } + Problem problem = entity.getBody(); + if (!(problem instanceof ConstraintViolationProblem || problem instanceof DefaultProblem)) { + return entity; + } + ProblemBuilder builder = Problem + .builder() + .withType(Problem.DEFAULT_TYPE.equals(problem.getType()) ? ErrorConstants.DEFAULT_TYPE : problem.getType()) + .withStatus(problem.getStatus()) + .withTitle(problem.getTitle()) + .with(PATH_KEY, request.getNativeRequest(HttpServletRequest.class).getRequestURI()); + + if (problem instanceof ConstraintViolationProblem) { + builder.with(VIOLATIONS_KEY, ((ConstraintViolationProblem) problem).getViolations()).with(MESSAGE_KEY, ErrorConstants.ERR_VALIDATION); + } else { + builder.withCause(((DefaultProblem) problem).getCause()).withDetail(problem.getDetail()).withInstance(problem.getInstance()); + problem.getParameters().forEach(builder::with); + if (!problem.getParameters().containsKey(MESSAGE_KEY) && problem.getStatus() != null) { + builder.with(MESSAGE_KEY, "error.http." + problem.getStatus().getStatusCode()); + } + } + return new ResponseEntity<>(builder.build(), entity.getHeaders(), entity.getStatusCode()); + } + + @Override + public ResponseEntity<Problem> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, @Nonnull NativeWebRequest request) { + BindingResult result = ex.getBindingResult(); + List<FieldErrorVM> fieldErrors = result + .getFieldErrors() + .stream() + .map(f -> new FieldErrorVM(f.getObjectName().replaceFirst("DTO$", ""), f.getField(), f.getCode())) + .collect(Collectors.toList()); + + Problem problem = Problem + .builder() + .withType(ErrorConstants.CONSTRAINT_VIOLATION_TYPE) + .withTitle("Method argument not valid") + .withStatus(defaultConstraintViolationStatus()) + .with(MESSAGE_KEY, ErrorConstants.ERR_VALIDATION) + .with(FIELD_ERRORS_KEY, fieldErrors) + .build(); + return create(ex, problem, request); + } + + @ExceptionHandler + public ResponseEntity<Problem> handleEmailAlreadyUsedException( + com.ippon.borestop.service.EmailAlreadyUsedException ex, + NativeWebRequest request + ) { + EmailAlreadyUsedException problem = new EmailAlreadyUsedException(); + return create( + problem, + request, + HeaderUtil.createFailureAlert(applicationName, true, problem.getEntityName(), problem.getErrorKey(), problem.getMessage()) + ); + } + + @ExceptionHandler + public ResponseEntity<Problem> handleUsernameAlreadyUsedException( + com.ippon.borestop.service.UsernameAlreadyUsedException ex, + NativeWebRequest request + ) { + LoginAlreadyUsedException problem = new LoginAlreadyUsedException(); + return create( + problem, + request, + HeaderUtil.createFailureAlert(applicationName, true, problem.getEntityName(), problem.getErrorKey(), problem.getMessage()) + ); + } + + @ExceptionHandler + public ResponseEntity<Problem> handleInvalidPasswordException( + com.ippon.borestop.service.InvalidPasswordException ex, + NativeWebRequest request + ) { + return create(new InvalidPasswordException(), request); + } + + @ExceptionHandler + public ResponseEntity<Problem> handleBadRequestAlertException(BadRequestAlertException ex, NativeWebRequest request) { + return create(ex, request, HeaderUtil.createFailureAlert(applicationName, true, ex.getEntityName(), ex.getErrorKey(), ex.getMessage())); + } + + @ExceptionHandler + public ResponseEntity<Problem> handleConcurrencyFailure(ConcurrencyFailureException ex, NativeWebRequest request) { + Problem problem = Problem.builder().withStatus(Status.CONFLICT).with(MESSAGE_KEY, ErrorConstants.ERR_CONCURRENCY_FAILURE).build(); + return create(ex, problem, request); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/errors/FieldErrorVM.java b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/FieldErrorVM.java new file mode 100644 index 0000000000000000000000000000000000000000..46a2bf76275a328b62743daabc5c8d1d809782f7 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/FieldErrorVM.java @@ -0,0 +1,31 @@ +package com.ippon.borestop.web.rest.errors; + +import java.io.Serializable; + +public class FieldErrorVM implements Serializable { + private static final long serialVersionUID = 1L; + + private final String objectName; + + private final String field; + + private final String message; + + public FieldErrorVM(String dto, String field, String message) { + this.objectName = dto; + this.field = field; + this.message = message; + } + + public String getObjectName() { + return objectName; + } + + public String getField() { + return field; + } + + public String getMessage() { + return message; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/errors/InvalidPasswordException.java b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/InvalidPasswordException.java new file mode 100644 index 0000000000000000000000000000000000000000..8d5ae4664736d947cf067d36c603cab48dced293 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/InvalidPasswordException.java @@ -0,0 +1,12 @@ +package com.ippon.borestop.web.rest.errors; + +import org.zalando.problem.AbstractThrowableProblem; +import org.zalando.problem.Status; + +public class InvalidPasswordException extends AbstractThrowableProblem { + private static final long serialVersionUID = 1L; + + public InvalidPasswordException() { + super(ErrorConstants.INVALID_PASSWORD_TYPE, "Incorrect password", Status.BAD_REQUEST); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/errors/LoginAlreadyUsedException.java b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/LoginAlreadyUsedException.java new file mode 100644 index 0000000000000000000000000000000000000000..7c22b6c952067501a40990f378628dfc463cfaa8 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/LoginAlreadyUsedException.java @@ -0,0 +1,9 @@ +package com.ippon.borestop.web.rest.errors; + +public class LoginAlreadyUsedException extends BadRequestAlertException { + private static final long serialVersionUID = 1L; + + public LoginAlreadyUsedException() { + super(ErrorConstants.LOGIN_ALREADY_USED_TYPE, "Login name already used!", "userManagement", "userexists"); + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/errors/package-info.java b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..a55530291e9e1deeb220117049070985b0403fcc --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/errors/package-info.java @@ -0,0 +1,6 @@ +/** + * Specific errors used with Zalando's "problem-spring-web" library. + * + * More information on https://github.com/zalando/problem-spring-web + */ +package com.ippon.borestop.web.rest.errors; diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/package-info.java b/borestop/src/main/java/com/ippon/borestop/web/rest/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..ef7b35134f5dd3a608dcd2a83df386cca7f1bc66 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/package-info.java @@ -0,0 +1,4 @@ +/** + * Spring MVC REST controllers. + */ +package com.ippon.borestop.web.rest; diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/vm/KeyAndPasswordVM.java b/borestop/src/main/java/com/ippon/borestop/web/rest/vm/KeyAndPasswordVM.java new file mode 100644 index 0000000000000000000000000000000000000000..72f6d0a0e851b973b7c2741804a83aecbdb6e34f --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/vm/KeyAndPasswordVM.java @@ -0,0 +1,26 @@ +package com.ippon.borestop.web.rest.vm; + +/** + * View Model object for storing the user's key and password. + */ +public class KeyAndPasswordVM { + private String key; + + private String newPassword; + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getNewPassword() { + return newPassword; + } + + public void setNewPassword(String newPassword) { + this.newPassword = newPassword; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/vm/LoginVM.java b/borestop/src/main/java/com/ippon/borestop/web/rest/vm/LoginVM.java new file mode 100644 index 0000000000000000000000000000000000000000..1e1b8bb8fb611886ad1636a0af44d7413a7a6efe --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/vm/LoginVM.java @@ -0,0 +1,52 @@ +package com.ippon.borestop.web.rest.vm; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * View Model object for storing a user's credentials. + */ +public class LoginVM { + @NotNull + @Size(min = 1, max = 50) + private String username; + + @NotNull + @Size(min = 4, max = 100) + private String password; + + private Boolean rememberMe; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Boolean isRememberMe() { + return rememberMe; + } + + public void setRememberMe(Boolean rememberMe) { + this.rememberMe = rememberMe; + } + + // prettier-ignore + @Override + public String toString() { + return "LoginVM{" + + "username='" + username + '\'' + + ", rememberMe=" + rememberMe + + '}'; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/vm/ManagedUserVM.java b/borestop/src/main/java/com/ippon/borestop/web/rest/vm/ManagedUserVM.java new file mode 100644 index 0000000000000000000000000000000000000000..9e3482cdc24aabd5440d458f653b838bf6efd378 --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/vm/ManagedUserVM.java @@ -0,0 +1,34 @@ +package com.ippon.borestop.web.rest.vm; + +import com.ippon.borestop.service.dto.UserDTO; +import javax.validation.constraints.Size; + +/** + * View Model extending the UserDTO, which is meant to be used in the user management UI. + */ +public class ManagedUserVM extends UserDTO { + public static final int PASSWORD_MIN_LENGTH = 4; + + public static final int PASSWORD_MAX_LENGTH = 100; + + @Size(min = PASSWORD_MIN_LENGTH, max = PASSWORD_MAX_LENGTH) + private String password; + + public ManagedUserVM() { + // Empty constructor needed for Jackson. + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + // prettier-ignore + @Override + public String toString() { + return "ManagedUserVM{" + super.toString() + "} "; + } +} diff --git a/borestop/src/main/java/com/ippon/borestop/web/rest/vm/package-info.java b/borestop/src/main/java/com/ippon/borestop/web/rest/vm/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..02e5124959c9b40cb8d6546baf49fd02cd8ac1ce --- /dev/null +++ b/borestop/src/main/java/com/ippon/borestop/web/rest/vm/package-info.java @@ -0,0 +1,4 @@ +/** + * View Models used by Spring MVC REST controllers. + */ +package com.ippon.borestop.web.rest.vm; diff --git a/borestop/src/main/jib/entrypoint.sh b/borestop/src/main/jib/entrypoint.sh new file mode 100644 index 0000000000000000000000000000000000000000..ab662b400c11b93ee349c457ae18508b76225083 --- /dev/null +++ b/borestop/src/main/jib/entrypoint.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +echo "The application will start in ${JHIPSTER_SLEEP}s..." && sleep ${JHIPSTER_SLEEP} +exec java ${JAVA_OPTS} -noverify -XX:+AlwaysPreTouch -Djava.security.egd=file:/dev/./urandom -cp /app/resources/:/app/classes/:/app/libs/* "com.ippon.borestop.BorestopApp" "$@" diff --git a/borestop/src/main/resources/.h2.server.properties b/borestop/src/main/resources/.h2.server.properties new file mode 100644 index 0000000000000000000000000000000000000000..da85d0d2da4fb27002fc171e08a6788870a5f6e6 --- /dev/null +++ b/borestop/src/main/resources/.h2.server.properties @@ -0,0 +1,5 @@ +#H2 Server Properties +0=JHipster H2 (Disk)|org.h2.Driver|jdbc\:h2\:file\:./target/h2db/db/borestop|borestop +webAllowOthers=true +webPort=8082 +webSSL=false diff --git a/borestop/src/main/resources/banner.txt b/borestop/src/main/resources/banner.txt new file mode 100644 index 0000000000000000000000000000000000000000..e0bc55aaffa9b6c51d63a1a67ecf8d533f51e0d2 --- /dev/null +++ b/borestop/src/main/resources/banner.txt @@ -0,0 +1,10 @@ + + ${AnsiColor.GREEN} ██╗${AnsiColor.RED} ██╗ ██╗ ████████╗ ███████╗ ██████╗ ████████╗ ████████╗ ███████╗ + ${AnsiColor.GREEN} ██║${AnsiColor.RED} ██║ ██║ â•šâ•â•â–ˆâ–ˆâ•”â•â•â• ██╔â•â•â•â–ˆâ–ˆâ•— ██╔â•â•â•â•â• â•šâ•â•â–ˆâ–ˆâ•”â•â•â• ██╔â•â•â•â•â•â• ██╔â•â•â•â–ˆâ–ˆâ•— + ${AnsiColor.GREEN} ██║${AnsiColor.RED} ████████║ ██║ ███████╔╠╚█████╗ ██║ ██████╗ ███████╔╠+ ${AnsiColor.GREEN}██╗ ██║${AnsiColor.RED} ██╔â•â•â•â–ˆâ–ˆâ•‘ ██║ ██╔â•â•â•â•â• â•šâ•â•â•â–ˆâ–ˆâ•— ██║ ██╔â•â•â•â• ██╔â•â•â–ˆâ–ˆâ•‘ + ${AnsiColor.GREEN}╚██████╔â•${AnsiColor.RED} ██║ ██║ ████████╗ ██║ ██████╔╠██║ ████████╗ ██║ ╚██╗ + ${AnsiColor.GREEN} â•šâ•â•â•â•â•â• ${AnsiColor.RED} â•šâ•â• â•šâ•â• â•šâ•â•â•â•â•â•â•â• â•šâ•â• â•šâ•â•â•â•â•â• â•šâ•â• â•šâ•â•â•â•â•â•â•â• â•šâ•â• â•šâ•â• + +${AnsiColor.BRIGHT_BLUE}:: JHipster 🤓 :: Running Spring Boot ${spring-boot.version} :: +:: https://www.jhipster.tech ::${AnsiColor.DEFAULT} diff --git a/borestop/src/main/resources/config/application-dev.yml b/borestop/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000000000000000000000000000000000000..a98fd1a45beb2af743b8519979c44d6aa07834fd --- /dev/null +++ b/borestop/src/main/resources/config/application-dev.yml @@ -0,0 +1,116 @@ +# =================================================================== +# Spring Boot configuration for the "dev" profile. +# +# This configuration overrides the application.yml file. +# +# More information on profiles: https://www.jhipster.tech/profiles/ +# More information on configuration properties: https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +# =================================================================== +# Standard Spring Boot properties. +# Full reference is available at: +# http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html +# =================================================================== + +logging: + level: + ROOT: DEBUG + io.github.jhipster: DEBUG + com.ippon.borestop: DEBUG + +spring: + profiles: + active: dev + include: + - swagger + # Uncomment to activate TLS for the dev profile + #- tls + devtools: + restart: + enabled: true + additional-exclude: static/**,.h2.server.properties + livereload: + enabled: false # we use Webpack dev server + BrowserSync for livereload + jackson: + serialization: + indent-output: true + datasource: + type: com.zaxxer.hikari.HikariDataSource + url: jdbc:h2:file:./target/h2db/db/borestop;DB_CLOSE_DELAY=-1 + username: borestop + password: + hikari: + poolName: Hikari + auto-commit: false + h2: + console: + enabled: false + jpa: + database-platform: io.github.jhipster.domain.util.FixedH2Dialect + show-sql: true + liquibase: + # Remove 'faker' if you do not want the sample data to be loaded automatically + contexts: dev, faker + mail: + host: localhost + port: 25 + username: + password: + messages: + cache-duration: PT1S # 1 second, see the ISO 8601 standard + thymeleaf: + cache: false + +server: + port: 8080 + +# =================================================================== +# JHipster specific properties +# +# Full reference is available at: https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +jhipster: + # CORS is only enabled by default with the "dev" profile, so BrowserSync can access the API + cors: + allowed-origins: '*' + allowed-methods: '*' + allowed-headers: '*' + exposed-headers: 'Authorization,Link,X-Total-Count' + allow-credentials: true + max-age: 1800 + security: + authentication: + jwt: + # This token must be encoded using Base64 and be at least 256 bits long (you can type `openssl rand -base64 64` on your command line to generate a 512 bits one) + base64-secret: NzdiMjRkMmMxZDNkMGY2ZWIyYTcxYWNhYzM4YTBiZjMzOWQzZDQyM2VjY2UwOGRlZDVjZTNiOTdkMWMzNWEzZGNkNzg4YTk2ZDFhZWYwMjUxZjU1ZWFiY2U1ZjA2ZDI1MzFiNTJmMTk5NzE2ZmIzMTE0YzMwYTMzODliYzhhY2E= + # Token is valid 24 hours + token-validity-in-seconds: 86400 + token-validity-in-seconds-for-remember-me: 2592000 + mail: # specific JHipster mail property, for standard properties see MailProperties + base-url: http://127.0.0.1:8080 + metrics: + logs: # Reports metrics in the logs + enabled: false + report-frequency: 60 # in seconds + logging: + use-json-format: false # By default, logs are not in Json format + logstash: # Forward logs to logstash over a socket, used by LoggingConfiguration + enabled: false + host: localhost + port: 5000 + queue-size: 512 + audit-events: + retention-period: 30 # Number of days before audit events are deleted. + +# =================================================================== +# Application specific properties +# Add your own application properties here, see the ApplicationProperties class +# to have type-safe configuration, like in the JHipsterProperties above +# +# More documentation is available at: +# https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +# application: diff --git a/borestop/src/main/resources/config/application-prod.yml b/borestop/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000000000000000000000000000000000000..e57f6a806c396da0459c16dc418871f33d90b2a1 --- /dev/null +++ b/borestop/src/main/resources/config/application-prod.yml @@ -0,0 +1,129 @@ +# =================================================================== +# Spring Boot configuration for the "prod" profile. +# +# This configuration overrides the application.yml file. +# +# More information on profiles: https://www.jhipster.tech/profiles/ +# More information on configuration properties: https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +# =================================================================== +# Standard Spring Boot properties. +# Full reference is available at: +# http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html +# =================================================================== + +logging: + level: + ROOT: INFO + io.github.jhipster: INFO + com.ippon.borestop: INFO + +management: + metrics: + export: + prometheus: + enabled: false + +spring: + devtools: + restart: + enabled: false + livereload: + enabled: false + datasource: + type: com.zaxxer.hikari.HikariDataSource + url: jdbc:postgresql://localhost:5432/borestop + username: borestop + password: + hikari: + poolName: Hikari + auto-commit: false + jpa: + database-platform: io.github.jhipster.domain.util.FixedPostgreSQL10Dialect + show-sql: false + # Replace by 'prod, faker' to add the faker context and have sample data loaded in production + liquibase: + contexts: prod + mail: + host: localhost + port: 25 + username: + password: + thymeleaf: + cache: true + +# =================================================================== +# To enable TLS in production, generate a certificate using: +# keytool -genkey -alias borestop -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650 +# +# You can also use Let's Encrypt: +# https://maximilian-boehm.com/hp2121/Create-a-Java-Keystore-JKS-from-Let-s-Encrypt-Certificates.htm +# +# Then, modify the server.ssl properties so your "server" configuration looks like: +# +# server: +# port: 443 +# ssl: +# key-store: classpath:config/tls/keystore.p12 +# key-store-password: password +# key-store-type: PKCS12 +# key-alias: selfsigned +# # The ciphers suite enforce the security by deactivating some old and deprecated SSL cipher, this list was tested against SSL Labs (https://www.ssllabs.com/ssltest/) +# ciphers: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 ,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 ,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 ,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA,TLS_RSA_WITH_CAMELLIA_256_CBC_SHA,TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA,TLS_RSA_WITH_CAMELLIA_128_CBC_SHA +# =================================================================== +server: + port: 8080 + compression: + enabled: true + mime-types: text/html,text/xml,text/plain,text/css, application/javascript, application/json + min-response-size: 1024 + +# =================================================================== +# JHipster specific properties +# +# Full reference is available at: https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +jhipster: + http: + cache: # Used by the CachingHttpHeadersFilter + timeToLiveInDays: 1461 + security: + authentication: + jwt: + # This token must be encoded using Base64 and be at least 256 bits long (you can type `openssl rand -base64 64` on your command line to generate a 512 bits one) + # As this is the PRODUCTION configuration, you MUST change the default key, and store it securely: + # - In the JHipster Registry (which includes a Spring Cloud Config server) + # - In a separate `application-prod.yml` file, in the same folder as your executable JAR file + # - In the `JHIPSTER_SECURITY_AUTHENTICATION_JWT_BASE64_SECRET` environment variable + base64-secret: NzdiMjRkMmMxZDNkMGY2ZWIyYTcxYWNhYzM4YTBiZjMzOWQzZDQyM2VjY2UwOGRlZDVjZTNiOTdkMWMzNWEzZGNkNzg4YTk2ZDFhZWYwMjUxZjU1ZWFiY2U1ZjA2ZDI1MzFiNTJmMTk5NzE2ZmIzMTE0YzMwYTMzODliYzhhY2E= + # Token is valid 24 hours + token-validity-in-seconds: 86400 + token-validity-in-seconds-for-remember-me: 2592000 + mail: # specific JHipster mail property, for standard properties see MailProperties + base-url: http://my-server-url-to-change # Modify according to your server's URL + metrics: + logs: # Reports metrics in the logs + enabled: false + report-frequency: 60 # in seconds + logging: + use-json-format: false # By default, logs are not in Json format + logstash: # Forward logs to logstash over a socket, used by LoggingConfiguration + enabled: false + host: localhost + port: 5000 + queue-size: 512 + audit-events: + retention-period: 30 # Number of days before audit events are deleted. + +# =================================================================== +# Application specific properties +# Add your own application properties here, see the ApplicationProperties class +# to have type-safe configuration, like in the JHipsterProperties above +# +# More documentation is available at: +# https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +# application: diff --git a/borestop/src/main/resources/config/application-tls.yml b/borestop/src/main/resources/config/application-tls.yml new file mode 100644 index 0000000000000000000000000000000000000000..27c9cd85745ff819f3fc60c6d37a203af3d111c5 --- /dev/null +++ b/borestop/src/main/resources/config/application-tls.yml @@ -0,0 +1,19 @@ +# =================================================================== +# Activate this profile to enable TLS and HTTP/2. +# +# JHipster has generated a self-signed certificate, which will be used to encrypt traffic. +# As your browser will not understand this certificate, you will need to import it. +# +# Another (easiest) solution with Chrome is to enable the "allow-insecure-localhost" flag +# at chrome://flags/#allow-insecure-localhost +# =================================================================== +server: + ssl: + key-store: classpath:config/tls/keystore.p12 + key-store-password: password + key-store-type: PKCS12 + key-alias: selfsigned + ciphers: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 + enabled-protocols: TLSv1.2 + http2: + enabled: true diff --git a/borestop/src/main/resources/config/application.yml b/borestop/src/main/resources/config/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..aac8814b92c7641cfdb3d3f47e9d6aab2341b2fc --- /dev/null +++ b/borestop/src/main/resources/config/application.yml @@ -0,0 +1,165 @@ +# =================================================================== +# Spring Boot configuration. +# +# This configuration will be overridden by the Spring profile you use, +# for example application-dev.yml if you use the "dev" profile. +# +# More information on profiles: https://www.jhipster.tech/profiles/ +# More information on configuration properties: https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +# =================================================================== +# Standard Spring Boot properties. +# Full reference is available at: +# http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html +# =================================================================== + +management: + endpoints: + web: + base-path: /management + exposure: + include: ['configprops', 'env', 'health', 'info', 'jhimetrics', 'logfile', 'loggers', 'prometheus', 'threaddump'] + endpoint: + health: + show-details: when_authorized + roles: 'ROLE_ADMIN' + jhimetrics: + enabled: true + info: + git: + mode: full + health: + mail: + enabled: false # When using the MailService, configure an SMTP server and set this to true + metrics: + export: + # Prometheus is the default metrics backend + prometheus: + enabled: true + step: 60 + enable: + http: true + jvm: true + logback: true + process: true + system: true + distribution: + percentiles-histogram: + all: true + percentiles: + all: 0, 0.5, 0.75, 0.95, 0.99, 1.0 + tags: + application: ${spring.application.name} + web: + server: + request: + autotime: + enabled: true + +spring: + application: + name: borestop + profiles: + # The commented value for `active` can be replaced with valid Spring profiles to load. + # Otherwise, it will be filled in by maven when building the JAR file + # Either way, it can be overridden by `--spring.profiles.active` value passed in the commandline or `-Dspring.profiles.active` set in `JAVA_OPTS` + active: #spring.profiles.active# + jmx: + enabled: false + data: + jpa: + repositories: + bootstrap-mode: deferred + jpa: + open-in-view: false + properties: + hibernate.jdbc.time_zone: UTC + hibernate.id.new_generator_mappings: true + hibernate.connection.provider_disables_autocommit: true + hibernate.cache.use_second_level_cache: false + hibernate.cache.use_query_cache: false + hibernate.generate_statistics: false + # modify batch size as necessary + hibernate.jdbc.batch_size: 25 + hibernate.order_inserts: true + hibernate.order_updates: true + hibernate.query.fail_on_pagination_over_collection_fetch: true + hibernate.query.in_clause_parameter_padding: true + hibernate: + ddl-auto: none + naming: + physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy + implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy + messages: + basename: i18n/messages + main: + allow-bean-definition-overriding: true + task: + execution: + thread-name-prefix: borestop-task- + pool: + core-size: 2 + max-size: 50 + queue-capacity: 10000 + scheduling: + thread-name-prefix: borestop-scheduling- + pool: + size: 2 + thymeleaf: + mode: HTML + output: + ansi: + console-available: true + +server: + servlet: + session: + cookie: + http-only: true + +# Properties to be exposed on the /info management endpoint +info: + # Comma separated list of profiles that will trigger the ribbon to show + display-ribbon-on-profiles: 'dev' + +# =================================================================== +# JHipster specific properties +# +# Full reference is available at: https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +jhipster: + clientApp: + name: 'borestopApp' + # By default CORS is disabled. Uncomment to enable. + # cors: + # allowed-origins: "*" + # allowed-methods: "*" + # allowed-headers: "*" + # exposed-headers: "Authorization,Link,X-Total-Count" + # allow-credentials: true + # max-age: 1800 + mail: + from: borestop@localhost + swagger: + default-include-pattern: /api/.* + title: borestop API + description: borestop API documentation + version: 0.0.1 + terms-of-service-url: + contact-name: + contact-url: + contact-email: + license: unlicensed + license-url: +# =================================================================== +# Application specific properties +# Add your own application properties here, see the ApplicationProperties class +# to have type-safe configuration, like in the JHipsterProperties above +# +# More documentation is available at: +# https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +# application: diff --git a/borestop/src/main/resources/config/liquibase/changelog/00000000000000_initial_schema.xml b/borestop/src/main/resources/config/liquibase/changelog/00000000000000_initial_schema.xml new file mode 100644 index 0000000000000000000000000000000000000000..e2762c962f11cf7f57c4ebb9cf671ce09d02e842 --- /dev/null +++ b/borestop/src/main/resources/config/liquibase/changelog/00000000000000_initial_schema.xml @@ -0,0 +1,159 @@ +<?xml version="1.0" encoding="utf-8"?> +<databaseChangeLog + xmlns="http://www.liquibase.org/xml/ns/dbchangelog" + xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.9.xsd + http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd"> + + <changeSet id="00000000000000" author="jhipster"> + <createSequence sequenceName="sequence_generator" startValue="1050" incrementBy="50"/> + </changeSet> + + <!-- + JHipster core tables. + The initial schema has the '00000000000001' id, so that it is over-written if we re-generate it. + --> + <changeSet id="00000000000001" author="jhipster"> + <createTable tableName="jhi_user"> + <column name="id" type="bigint" > + <constraints primaryKey="true" nullable="false"/> + </column> + <column name="login" type="varchar(50)"> + <constraints unique="true" nullable="false" uniqueConstraintName="ux_user_login"/> + </column> + <column name="password_hash" type="varchar(60)"/> + <column name="first_name" type="varchar(50)"/> + <column name="last_name" type="varchar(50)"/> + <column name="email" type="varchar(191)"> + <constraints unique="true" nullable="true" uniqueConstraintName="ux_user_email"/> + </column> + <column name="image_url" type="varchar(256)"/> + <column name="activated" type="boolean" valueBoolean="false"> + <constraints nullable="false" /> + </column> + <column name="lang_key" type="varchar(10)"/> + <column name="activation_key" type="varchar(20)"/> + <column name="reset_key" type="varchar(20)"/> + <column name="created_by" type="varchar(50)"> + <constraints nullable="false"/> + </column> + <column name="created_date" type="timestamp"/> + <column name="reset_date" type="timestamp"> + <constraints nullable="true"/> + </column> + <column name="last_modified_by" type="varchar(50)"/> + <column name="last_modified_date" type="timestamp"/> + </createTable> + + <createTable tableName="jhi_authority"> + <column name="name" type="varchar(50)"> + <constraints primaryKey="true" nullable="false"/> + </column> + </createTable> + + <createTable tableName="jhi_user_authority"> + <column name="user_id" type="bigint"> + <constraints nullable="false"/> + </column> + <column name="authority_name" type="varchar(50)"> + <constraints nullable="false"/> + </column> + </createTable> + + <addPrimaryKey columnNames="user_id, authority_name" tableName="jhi_user_authority"/> + + <addForeignKeyConstraint baseColumnNames="authority_name" + baseTableName="jhi_user_authority" + constraintName="fk_authority_name" + referencedColumnNames="name" + referencedTableName="jhi_authority"/> + + <addForeignKeyConstraint baseColumnNames="user_id" + baseTableName="jhi_user_authority" + constraintName="fk_user_id" + referencedColumnNames="id" + referencedTableName="jhi_user"/> + + <addNotNullConstraint columnName="password_hash" + columnDataType="varchar(60)" + tableName="jhi_user"/> + <loadData + file="config/liquibase/data/user.csv" + separator=";" + tableName="jhi_user"> + <column name="id" type="numeric"/> + <column name="activated" type="boolean"/> + <column name="created_date" type="timestamp"/> + </loadData> + <dropDefaultValue tableName="jhi_user" columnName="created_date" columnDataType="datetime"/> + <loadData + file="config/liquibase/data/authority.csv" + separator=";" + tableName="jhi_authority"> + <column name="name" type="string"/> + </loadData> + + <loadData + file="config/liquibase/data/user_authority.csv" + separator=";" + tableName="jhi_user_authority"> + <column name="user_id" type="numeric"/> + </loadData> + <createTable tableName="jhi_persistent_audit_event"> + <column name="event_id" type="bigint" > + <constraints primaryKey="true" nullable="false"/> + </column> + <column name="principal" type="varchar(50)"> + <constraints nullable="false" /> + </column> + <column name="event_date" type="timestamp"/> + <column name="event_type" type="varchar(255)"/> + </createTable> + + <createTable tableName="jhi_persistent_audit_evt_data"> + <column name="event_id" type="bigint"> + <constraints nullable="false"/> + </column> + <column name="name" type="varchar(150)"> + <constraints nullable="false"/> + </column> + <column name="value" type="varchar(255)"/> + </createTable> + <addPrimaryKey columnNames="event_id, name" tableName="jhi_persistent_audit_evt_data"/> + + <createIndex indexName="idx_persistent_audit_event" + tableName="jhi_persistent_audit_event" + unique="false"> + <column name="principal" type="varchar(50)"/> + <column name="event_date" type="timestamp"/> + </createIndex> + + <createIndex indexName="idx_persistent_audit_evt_data" + tableName="jhi_persistent_audit_evt_data" + unique="false"> + <column name="event_id" type="bigint"/> + </createIndex> + + <addForeignKeyConstraint baseColumnNames="event_id" + baseTableName="jhi_persistent_audit_evt_data" + constraintName="fk_evt_pers_audit_evt_data" + referencedColumnNames="event_id" + referencedTableName="jhi_persistent_audit_event"/> + </changeSet> + + <changeSet author="jhipster" id="00000000000002" context="test"> + <createTable tableName="jhi_date_time_wrapper"> + <column name="id" type="BIGINT"> + <constraints primaryKey="true" primaryKeyName="jhi_date_time_wrapperPK"/> + </column> + <column name="instant" type="timestamp"/> + <column name="local_date_time" type="timestamp"/> + <column name="offset_date_time" type="timestamp"/> + <column name="zoned_date_time" type="timestamp"/> + <column name="local_time" type="time"/> + <column name="offset_time" type="time"/> + <column name="local_date" type="date"/> + </createTable> + </changeSet> +</databaseChangeLog> diff --git a/borestop/src/main/resources/config/liquibase/data/authority.csv b/borestop/src/main/resources/config/liquibase/data/authority.csv new file mode 100644 index 0000000000000000000000000000000000000000..af5c6dfa186d3b5de3b3eb854ea9a044c222459e --- /dev/null +++ b/borestop/src/main/resources/config/liquibase/data/authority.csv @@ -0,0 +1,3 @@ +name +ROLE_ADMIN +ROLE_USER diff --git a/borestop/src/main/resources/config/liquibase/data/user.csv b/borestop/src/main/resources/config/liquibase/data/user.csv new file mode 100644 index 0000000000000000000000000000000000000000..b25922b69906608d69e4bc7df7fbe8c156f28cf5 --- /dev/null +++ b/borestop/src/main/resources/config/liquibase/data/user.csv @@ -0,0 +1,5 @@ +id;login;password_hash;first_name;last_name;email;image_url;activated;lang_key;created_by;last_modified_by +1;system;$2a$10$mE.qmcV0mFU5NcKh73TZx.z4ueI/.bDWbj0T1BYyqP481kGGarKLG;System;System;system@localhost;;true;en;system;system +2;anonymoususer;$2a$10$j8S5d7Sr7.8VTOYNviDPOeWX8KcYILUVJBsYV83Y5NtECayypx9lO;Anonymous;User;anonymous@localhost;;true;en;system;system +3;admin;$2a$10$gSAhZrxMllrbgj/kkK9UceBPpChGWJA7SYIb1Mqo.n5aNLq1/oRrC;Administrator;Administrator;admin@localhost;;true;en;system;system +4;user;$2a$10$VEjxo0jq2YG9Rbk2HmX9S.k1uZBGYUHdUcid3g/vfiEl7lwWgOH/K;User;User;user@localhost;;true;en;system;system diff --git a/borestop/src/main/resources/config/liquibase/data/user_authority.csv b/borestop/src/main/resources/config/liquibase/data/user_authority.csv new file mode 100644 index 0000000000000000000000000000000000000000..06c5feeeeace8bb0cb9ea59256a3bdb777caad62 --- /dev/null +++ b/borestop/src/main/resources/config/liquibase/data/user_authority.csv @@ -0,0 +1,6 @@ +user_id;authority_name +1;ROLE_ADMIN +1;ROLE_USER +3;ROLE_ADMIN +3;ROLE_USER +4;ROLE_USER diff --git a/borestop/src/main/resources/config/liquibase/master.xml b/borestop/src/main/resources/config/liquibase/master.xml new file mode 100644 index 0000000000000000000000000000000000000000..ed94bf4b45a84c855650be7e0f83f0272765bd0a --- /dev/null +++ b/borestop/src/main/resources/config/liquibase/master.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<databaseChangeLog + xmlns="http://www.liquibase.org/xml/ns/dbchangelog" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.9.xsd"> + + <property name="now" value="now()" dbms="h2"/> + <property name="now" value="current_timestamp" dbms="postgresql"/> + + <property name="floatType" value="float4" dbms="postgresql, h2"/> + <property name="floatType" value="float" dbms="mysql, oracle, mssql, mariadb"/> + <property name="clobType" value="longvarchar" dbms="h2"/> + <property name="clobType" value="clob" dbms="mysql, oracle, mssql, mariadb, postgresql"/> + <property name="uuidType" value="uuid" dbms="h2, postgresql"/> + + <include file="config/liquibase/changelog/00000000000000_initial_schema.xml" relativeToChangelogFile="false"/> + <!-- jhipster-needle-liquibase-add-changelog - JHipster will add liquibase changelogs here --> + <!-- jhipster-needle-liquibase-add-constraints-changelog - JHipster will add liquibase constraints changelogs here --> + <!-- jhipster-needle-liquibase-add-incremental-changelog - JHipster will add incremental liquibase changelogs here --> +</databaseChangeLog> diff --git a/borestop/src/main/resources/config/tls/keystore.p12 b/borestop/src/main/resources/config/tls/keystore.p12 new file mode 100644 index 0000000000000000000000000000000000000000..ef47ed6c55c3757c2659d62308309cc0387489d4 Binary files /dev/null and b/borestop/src/main/resources/config/tls/keystore.p12 differ diff --git a/borestop/src/main/resources/i18n/messages.properties b/borestop/src/main/resources/i18n/messages.properties new file mode 100644 index 0000000000000000000000000000000000000000..ea138657422f978c7c15c07e8e2dd1b3eb759bf1 --- /dev/null +++ b/borestop/src/main/resources/i18n/messages.properties @@ -0,0 +1,21 @@ +# Error page +error.title=Your request cannot be processed +error.subtitle=Sorry, an error has occurred. +error.status=Status: +error.message=Message: + +# Activation email +email.activation.title=borestop account activation is required +email.activation.greeting=Dear {0} +email.activation.text1=Your borestop account has been created, please click on the URL below to activate it: +email.activation.text2=Regards, +email.signature=borestop Team. + +# Creation email +email.creation.text1=Your borestop account has been created, please click on the URL below to access it: + +# Reset email +email.reset.title=borestop password reset +email.reset.greeting=Dear {0} +email.reset.text1=For your borestop account a password reset was requested, please click on the URL below to reset it: +email.reset.text2=Regards, diff --git a/borestop/src/main/resources/i18n/messages_en.properties b/borestop/src/main/resources/i18n/messages_en.properties new file mode 100644 index 0000000000000000000000000000000000000000..73f69f64e6e476df57aa9ad5e3b718f279e2ee8f --- /dev/null +++ b/borestop/src/main/resources/i18n/messages_en.properties @@ -0,0 +1,21 @@ +# Error page +error.title=Your request cannot be processed +error.subtitle=Sorry, an error has occurred. +error.status=Status: +error.message=Message: + +# Activation email +email.activation.title=borestop account activation +email.activation.greeting=Dear {0} +email.activation.text1=Your borestop account has been created, please click on the URL below to activate it: +email.activation.text2=Regards, +email.signature=borestop Team. + +# Creation email +email.creation.text1=Your borestop account has been created, please click on the URL below to access it: + +# Reset email +email.reset.title=borestop password reset +email.reset.greeting=Dear {0} +email.reset.text1=For your borestop account a password reset was requested, please click on the URL below to reset it: +email.reset.text2=Regards, diff --git a/borestop/src/main/resources/logback-spring.xml b/borestop/src/main/resources/logback-spring.xml new file mode 100644 index 0000000000000000000000000000000000000000..46f66b0e9466ce3866dbaaea9f7743a0fadcadec --- /dev/null +++ b/borestop/src/main/resources/logback-spring.xml @@ -0,0 +1,68 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE configuration> + +<configuration scan="true"> + <include resource="org/springframework/boot/logging/logback/base.xml"/> + +<!-- The FILE and ASYNC appenders are here as examples for a production configuration --> +<!-- + <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern> + <maxHistory>90</maxHistory> + </rollingPolicy> + <encoder> + <charset>utf-8</charset> + <Pattern>%d %-5level [%thread] %logger{0}: %msg%n</Pattern> + </encoder> + </appender> + + <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"> + <queueSize>512</queueSize> + <appender-ref ref="FILE"/> + </appender> + + <root level="${logging.level.root}"> + <appender-ref ref="ASYNC"/> + </root> +--> + + <logger name="javax.activation" level="WARN"/> + <logger name="javax.mail" level="WARN"/> + <logger name="javax.management.remote" level="WARN"/> + <logger name="javax.xml.bind" level="WARN"/> + <logger name="ch.qos.logback" level="WARN"/> + <logger name="com.ryantenney" level="WARN"/> + <logger name="com.sun" level="WARN"/> + <logger name="com.zaxxer" level="WARN"/> + <logger name="io.undertow" level="WARN"/> + <logger name="io.undertow.websockets.jsr" level="ERROR"/> + <logger name="org.apache" level="WARN"/> + <logger name="org.apache.catalina.startup.DigesterFactory" level="OFF"/> + <logger name="org.bson" level="WARN"/> + <logger name="org.hibernate.validator" level="WARN"/> + <logger name="org.hibernate" level="WARN"/> + <logger name="org.hibernate.ejb.HibernatePersistence" level="OFF"/> + <logger name="org.postgresql" level="WARN"/> + <logger name="org.springframework" level="WARN"/> + <logger name="org.springframework.web" level="WARN"/> + <logger name="org.springframework.security" level="WARN"/> + <logger name="org.springframework.cache" level="WARN"/> + <logger name="org.thymeleaf" level="WARN"/> + <logger name="org.xnio" level="WARN"/> + <logger name="springfox" level="WARN"/> + <logger name="sun.rmi" level="WARN"/> + <logger name="liquibase" level="WARN"/> + <logger name="LiquibaseSchemaResolver" level="INFO"/> + <logger name="springfox.documentation.schema.property" level="ERROR"/> + <logger name="sun.rmi.transport" level="WARN"/> + <!-- jhipster-needle-logback-add-log - JHipster will add a new log with level --> + + <!-- https://logback.qos.ch/manual/configuration.html#shutdownHook and https://jira.qos.ch/browse/LOGBACK-1090 --> + <shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook"/> + + <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"> + <resetJUL>true</resetJUL> + </contextListener> + +</configuration> diff --git a/borestop/src/main/resources/templates/error.html b/borestop/src/main/resources/templates/error.html new file mode 100644 index 0000000000000000000000000000000000000000..a421bd26bead9e6802a3a93b06e0c654fc084eef --- /dev/null +++ b/borestop/src/main/resources/templates/error.html @@ -0,0 +1,87 @@ +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.thymeleaf.org" th:lang="${#locale.language}" lang="en"> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> + <link rel="icon" href="${baseUrl}/favicon.ico" /> + <title>Your request cannot be processed</title> + <style> + ::-moz-selection { + background: #b3d4fc; + text-shadow: none; + } + + ::selection { + background: #b3d4fc; + text-shadow: none; + } + + html { + padding: 30px 10px; + font-size: 20px; + line-height: 1.4; + color: #737373; + background: #3E8ACC; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + } + + html, + input { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + } + + body { + max-width: 1000px; + _width: 500px; + padding: 30px 20px 50px; + border: 1px solid #b3b3b3; + border-radius: 4px; + margin: 0 auto; + box-shadow: 0 1px 10px #a7a7a7, inset 0 1px 0 #fff; + background: #fcfcfc; + } + + h1 { + margin: 0 10px; + font-size: 50px; + text-align: center; + } + + h1 span { + color: #bbb; + } + + h3 { + margin: 1.5em 0 0.5em; + } + + p { + margin: 1em 0; + } + + ul { + padding: 0 0 0 40px; + margin: 1em 0; + } + + .container { + max-width: 800px; + _width: 380px; + margin: 0 auto; + } + </style> +</head> +<body> +<div class="container"> + <h1 th:text="#{error.title}">Your request cannot be processed <span>:(</span></h1> + + <p th:text="#{error.subtitle}">Sorry, an error has occurred.</p> + + <span th:text="#{error.status}">Status:</span> <span th:text="${error}"></span> (<span th:text="${error}"></span>)<br/> + <span th:if="${!#strings.isEmpty(message)}"> + <span th:text="#{error.message}">Message:</span> <span th:text="${message}"></span><br/> + </span> +</div> +</body> +</html> diff --git a/borestop/src/main/resources/templates/mail/activationEmail.html b/borestop/src/main/resources/templates/mail/activationEmail.html new file mode 100644 index 0000000000000000000000000000000000000000..07d8d3b13b752bd29c151c83996c2f34e96df441 --- /dev/null +++ b/borestop/src/main/resources/templates/mail/activationEmail.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org" th:lang="${#locale.language}" lang="en"> + <head> + <title th:text="#{email.activation.title}">JHipster activation</title> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> + <link rel="icon" th:href="@{|${baseUrl}/favicon.ico|}" /> + </head> + <body> + <p th:text="#{email.activation.greeting(${user.login})}"> + Dear + </p> + <p th:text="#{email.activation.text1}"> + Your JHipster account has been created, please click on the URL below to activate it: + </p> + <p> + <a th:with="url=(@{|${baseUrl}/account/activate?key=${user.activationKey}|})" th:href="${url}" + th:text="${url}">Activation link</a> + </p> + <p> + <span th:text="#{email.activation.text2}">Regards, </span> + <br/> + <em th:text="#{email.signature}">JHipster.</em> + </p> + </body> +</html> diff --git a/borestop/src/main/resources/templates/mail/creationEmail.html b/borestop/src/main/resources/templates/mail/creationEmail.html new file mode 100644 index 0000000000000000000000000000000000000000..1d9276e3fce9072b6ea8441d5f1aff3415fdec4f --- /dev/null +++ b/borestop/src/main/resources/templates/mail/creationEmail.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org" th:lang="${#locale.language}" lang="en"> + <head> + <title th:text="#{email.activation.title}">JHipster creation</title> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> + <link rel="icon" th:href="@{|${baseUrl}/favicon.ico|}" /> + </head> + <body> + <p th:text="#{email.activation.greeting(${user.login})}"> + Dear + </p> + <p th:text="#{email.creation.text1}"> + Your JHipster account has been created, please click on the URL below to access it: + </p> + <p> + <a th:with="url=(@{|${baseUrl}/account/reset/finish?key=${user.resetKey}|})" th:href="${url}" + th:text="${url}">Login link</a> + </p> + <p> + <span th:text="#{email.activation.text2}">Regards, </span> + <br/> + <em th:text="#{email.signature}">JHipster.</em> + </p> + </body> +</html> diff --git a/borestop/src/main/resources/templates/mail/passwordResetEmail.html b/borestop/src/main/resources/templates/mail/passwordResetEmail.html new file mode 100644 index 0000000000000000000000000000000000000000..4e709cf05af969fb016a96fff127bea21cc29be7 --- /dev/null +++ b/borestop/src/main/resources/templates/mail/passwordResetEmail.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org" th:lang="${#locale.language}" lang="en"> + <head> + <title th:text="#{email.reset.title}">JHipster password reset</title> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> + <link rel="icon" th:href="@{|${baseUrl}/favicon.ico|}" /> + </head> + <body> + <p th:text="#{email.reset.greeting(${user.login})}"> + Dear + </p> + <p th:text="#{email.reset.text1}"> + For your JHipster account a password reset was requested, please click on the URL below to reset it: + </p> + <p> + <a th:with="url=(@{|${baseUrl}/account/reset/finish?key=${user.resetKey}|})" th:href="${url}" + th:text="${url}">Login link</a> + </p> + <p> + <span th:text="#{email.reset.text2}">Regards, </span> + <br/> + <em th:text="#{email.signature}">JHipster.</em> + </p> + </body> +</html> diff --git a/borestop/src/main/webapp/404.html b/borestop/src/main/webapp/404.html new file mode 100644 index 0000000000000000000000000000000000000000..21a47e54db2b9d144919d9342c5a3daacccedc0b --- /dev/null +++ b/borestop/src/main/webapp/404.html @@ -0,0 +1,61 @@ +<!doctype html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <title>Page Not Found</title> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <link rel="icon" href="favicon.ico" /> + <style> + + * { + line-height: 1.2; + margin: 0; + } + + html { + color: #888; + display: table; + font-family: sans-serif; + height: 100%; + text-align: center; + width: 100%; + } + + body { + display: table-cell; + vertical-align: middle; + margin: 2em auto; + } + + h1 { + color: #555; + font-size: 2em; + font-weight: 400; + } + + p { + margin: 0 auto; + width: 280px; + } + + @media only screen and (max-width: 280px) { + + body, p { + width: 95%; + } + + h1 { + font-size: 1.5em; + margin: 0 0 0.3em; + } + + } + + </style> +</head> +<body> + <h1>Page Not Found</h1> + <p>Sorry, but the page you were trying to view does not exist.</p> +</body> +</html> +<!-- IE needs 512+ bytes: http://blogs.msdn.com/b/ieinternals/archive/2010/08/19/http-error-pages-in-internet-explorer.aspx --> diff --git a/borestop/src/main/webapp/WEB-INF/web.xml b/borestop/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000000000000000000000000000000000..f1611b515aed4372086d7ba19567fe5f895a4775 --- /dev/null +++ b/borestop/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8"?> +<web-app + xmlns="http://java.sun.com/xml/ns/javaee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" + version="3.0"> + + <mime-mapping> + <extension>html</extension> + <mime-type>text/html;charset=utf-8</mime-type> + </mime-mapping> + +</web-app> diff --git a/borestop/src/main/webapp/app/account/account.module.ts b/borestop/src/main/webapp/app/account/account.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..179347b4c0e98e7af220e9b44f434e73a7e50c1a --- /dev/null +++ b/borestop/src/main/webapp/app/account/account.module.ts @@ -0,0 +1,27 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { BorestopSharedModule } from 'app/shared/shared.module'; + +import { PasswordStrengthBarComponent } from './password/password-strength-bar.component'; +import { RegisterComponent } from './register/register.component'; +import { ActivateComponent } from './activate/activate.component'; +import { PasswordComponent } from './password/password.component'; +import { PasswordResetInitComponent } from './password-reset/init/password-reset-init.component'; +import { PasswordResetFinishComponent } from './password-reset/finish/password-reset-finish.component'; +import { SettingsComponent } from './settings/settings.component'; +import { accountState } from './account.route'; + +@NgModule({ + imports: [BorestopSharedModule, RouterModule.forChild(accountState)], + declarations: [ + ActivateComponent, + RegisterComponent, + PasswordComponent, + PasswordStrengthBarComponent, + PasswordResetInitComponent, + PasswordResetFinishComponent, + SettingsComponent + ] +}) +export class AccountModule {} diff --git a/borestop/src/main/webapp/app/account/account.route.ts b/borestop/src/main/webapp/app/account/account.route.ts new file mode 100644 index 0000000000000000000000000000000000000000..3c15bb74c15c66b38fa44df746cdfaba6d6cfeac --- /dev/null +++ b/borestop/src/main/webapp/app/account/account.route.ts @@ -0,0 +1,17 @@ +import { Routes } from '@angular/router'; + +import { activateRoute } from './activate/activate.route'; +import { passwordRoute } from './password/password.route'; +import { passwordResetFinishRoute } from './password-reset/finish/password-reset-finish.route'; +import { passwordResetInitRoute } from './password-reset/init/password-reset-init.route'; +import { registerRoute } from './register/register.route'; +import { settingsRoute } from './settings/settings.route'; + +const ACCOUNT_ROUTES = [activateRoute, passwordRoute, passwordResetFinishRoute, passwordResetInitRoute, registerRoute, settingsRoute]; + +export const accountState: Routes = [ + { + path: '', + children: ACCOUNT_ROUTES + } +]; diff --git a/borestop/src/main/webapp/app/account/activate/activate.component.html b/borestop/src/main/webapp/app/account/activate/activate.component.html new file mode 100644 index 0000000000000000000000000000000000000000..92b942b2e2740f64b4459ecc164e389f70a11751 --- /dev/null +++ b/borestop/src/main/webapp/app/account/activate/activate.component.html @@ -0,0 +1,16 @@ +<div> + <div class="row justify-content-center"> + <div class="col-md-8"> + <h1 jhiTranslate="activate.title">Activation</h1> + + <div class="alert alert-success" *ngIf="success"> + <span jhiTranslate="activate.messages.success"><strong>Your user account has been activated.</strong> Please </span> + <a class="alert-link" (click)="login()" jhiTranslate="global.messages.info.authenticated.link">sign in</a>. + </div> + + <div class="alert alert-danger" *ngIf="error" jhiTranslate="activate.messages.error"> + <strong>Your user could not be activated.</strong> Please use the registration form to sign up. + </div> + </div> + </div> +</div> diff --git a/borestop/src/main/webapp/app/account/activate/activate.component.ts b/borestop/src/main/webapp/app/account/activate/activate.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..8020af1df27c5b18b1f58eed9a09d39601072f51 --- /dev/null +++ b/borestop/src/main/webapp/app/account/activate/activate.component.ts @@ -0,0 +1,28 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { flatMap } from 'rxjs/operators'; + +import { LoginModalService } from 'app/core/login/login-modal.service'; +import { ActivateService } from './activate.service'; + +@Component({ + selector: 'jhi-activate', + templateUrl: './activate.component.html' +}) +export class ActivateComponent implements OnInit { + error = false; + success = false; + + constructor(private activateService: ActivateService, private loginModalService: LoginModalService, private route: ActivatedRoute) {} + + ngOnInit(): void { + this.route.queryParams.pipe(flatMap(params => this.activateService.get(params.key))).subscribe( + () => (this.success = true), + () => (this.error = true) + ); + } + + login(): void { + this.loginModalService.open(); + } +} diff --git a/borestop/src/main/webapp/app/account/activate/activate.route.ts b/borestop/src/main/webapp/app/account/activate/activate.route.ts new file mode 100644 index 0000000000000000000000000000000000000000..a988352daf89b923f6a3fd9de0ae2e9435e00633 --- /dev/null +++ b/borestop/src/main/webapp/app/account/activate/activate.route.ts @@ -0,0 +1,12 @@ +import { Route } from '@angular/router'; + +import { ActivateComponent } from './activate.component'; + +export const activateRoute: Route = { + path: 'activate', + component: ActivateComponent, + data: { + authorities: [], + pageTitle: 'activate.title' + } +}; diff --git a/borestop/src/main/webapp/app/account/activate/activate.service.ts b/borestop/src/main/webapp/app/account/activate/activate.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..9cac51ef184b760fd7c5c2698e0542c33cd544ee --- /dev/null +++ b/borestop/src/main/webapp/app/account/activate/activate.service.ts @@ -0,0 +1,16 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpParams } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { SERVER_API_URL } from 'app/app.constants'; + +@Injectable({ providedIn: 'root' }) +export class ActivateService { + constructor(private http: HttpClient) {} + + get(key: string): Observable<{}> { + return this.http.get(SERVER_API_URL + 'api/activate', { + params: new HttpParams().set('key', key) + }); + } +} diff --git a/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.html b/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.html new file mode 100644 index 0000000000000000000000000000000000000000..61c54ad63c490e162c8b8e80e383b17d29c425a7 --- /dev/null +++ b/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.html @@ -0,0 +1,90 @@ +<div> + <div class="row justify-content-center"> + <div class="col-md-4"> + <h1 jhiTranslate="reset.finish.title">Reset password</h1> + + <div class="alert alert-danger" jhiTranslate="reset.finish.messages.keymissing" *ngIf="initialized && !key"> + <strong>The password reset key is missing.</strong> + </div> + + <div class="alert alert-warning" *ngIf="key && !success"> + <span jhiTranslate="reset.finish.messages.info">Choose a new password</span> + </div> + + <div class="alert alert-danger" *ngIf="error"> + <span jhiTranslate="reset.finish.messages.error">Your password couldn't be reset. Remember a password request is only valid for 24 hours.</span> + </div> + + <div class="alert alert-success" *ngIf="success"> + <span jhiTranslate="reset.finish.messages.success"><strong>Your password has been reset.</strong> Please </span> + <a class="alert-link" (click)="login()" jhiTranslate="global.messages.info.authenticated.link">sign in</a>. + </div> + + <div class="alert alert-danger" *ngIf="doNotMatch" jhiTranslate="global.messages.error.dontmatch"> + The password and its confirmation do not match! + </div> + + <div *ngIf="key && !success"> + <form name="form" role="form" (ngSubmit)="finishReset()" [formGroup]="passwordForm"> + <div class="form-group"> + <label class="form-control-label" for="newPassword" jhiTranslate="global.form.newpassword.label">New password</label> + <input type="password" class="form-control" id="newPassword" name="newPassword" + placeholder="{{ 'global.form.newpassword.placeholder' | translate }}" + formControlName="newPassword" #newPassword> + + <div *ngIf="passwordForm.get('newPassword')!.invalid && (passwordForm.get('newPassword')!.dirty || passwordForm.get('newPassword')!.touched)"> + <small class="form-text text-danger" + *ngIf="passwordForm.get('newPassword')?.errors?.required" + jhiTranslate="global.messages.validate.newpassword.required"> + Your password is required. + </small> + + <small class="form-text text-danger" + *ngIf="passwordForm.get('newPassword')?.errors?.minlength" + jhiTranslate="global.messages.validate.newpassword.minlength"> + Your password is required to be at least 4 characters. + </small> + + <small class="form-text text-danger" + *ngIf="passwordForm.get('newPassword')?.errors?.maxlength" + jhiTranslate="global.messages.validate.newpassword.maxlength"> + Your password cannot be longer than 50 characters. + </small> + </div> + + <jhi-password-strength-bar [passwordToCheck]="passwordForm.get('newPassword')!.value"></jhi-password-strength-bar> + </div> + + <div class="form-group"> + <label class="form-control-label" for="confirmPassword" jhiTranslate="global.form.confirmpassword.label">New password confirmation</label> + <input type="password" class="form-control" id="confirmPassword" name="confirmPassword" + placeholder="{{ 'global.form.confirmpassword.placeholder' | translate }}" + formControlName="confirmPassword"> + + <div *ngIf="passwordForm.get('confirmPassword')!.invalid && (passwordForm.get('confirmPassword')!.dirty || passwordForm.get('confirmPassword')!.touched)"> + <small class="form-text text-danger" + *ngIf="passwordForm.get('confirmPassword')?.errors?.required" + jhiTranslate="global.messages.validate.confirmpassword.required"> + Your password confirmation is required. + </small> + + <small class="form-text text-danger" + *ngIf="passwordForm.get('confirmPassword')?.errors?.minlength" + jhiTranslate="global.messages.validate.confirmpassword.minlength"> + Your password confirmation is required to be at least 4 characters. + </small> + + <small class="form-text text-danger" + *ngIf="passwordForm.get('confirmPassword')?.errors?.maxlength" + jhiTranslate="global.messages.validate.confirmpassword.maxlength"> + Your password confirmation cannot be longer than 50 characters. + </small> + </div> + </div> + + <button type="submit" [disabled]="passwordForm.invalid" class="btn btn-primary" jhiTranslate="reset.finish.form.button">Reset Password</button> + </form> + </div> + </div> + </div> +</div> diff --git a/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.ts b/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..579d141e0c1e0d54a6c16d7cc3e38292c7443efa --- /dev/null +++ b/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.ts @@ -0,0 +1,69 @@ +import { Component, OnInit, AfterViewInit, ElementRef, ViewChild } from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; + +import { LoginModalService } from 'app/core/login/login-modal.service'; +import { PasswordResetFinishService } from './password-reset-finish.service'; + +@Component({ + selector: 'jhi-password-reset-finish', + templateUrl: './password-reset-finish.component.html' +}) +export class PasswordResetFinishComponent implements OnInit, AfterViewInit { + @ViewChild('newPassword', { static: false }) + newPassword?: ElementRef; + + initialized = false; + doNotMatch = false; + error = false; + success = false; + key = ''; + + passwordForm = this.fb.group({ + newPassword: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(50)]], + confirmPassword: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(50)]] + }); + + constructor( + private passwordResetFinishService: PasswordResetFinishService, + private loginModalService: LoginModalService, + private route: ActivatedRoute, + private fb: FormBuilder + ) {} + + ngOnInit(): void { + this.route.queryParams.subscribe(params => { + if (params['key']) { + this.key = params['key']; + } + this.initialized = true; + }); + } + + ngAfterViewInit(): void { + if (this.newPassword) { + this.newPassword.nativeElement.focus(); + } + } + + finishReset(): void { + this.doNotMatch = false; + this.error = false; + + const newPassword = this.passwordForm.get(['newPassword'])!.value; + const confirmPassword = this.passwordForm.get(['confirmPassword'])!.value; + + if (newPassword !== confirmPassword) { + this.doNotMatch = true; + } else { + this.passwordResetFinishService.save(this.key, newPassword).subscribe( + () => (this.success = true), + () => (this.error = true) + ); + } + } + + login(): void { + this.loginModalService.open(); + } +} diff --git a/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.route.ts b/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.route.ts new file mode 100644 index 0000000000000000000000000000000000000000..0cff2b0744bd6b1b31fb206b0eca2110e1106ebe --- /dev/null +++ b/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.route.ts @@ -0,0 +1,12 @@ +import { Route } from '@angular/router'; + +import { PasswordResetFinishComponent } from './password-reset-finish.component'; + +export const passwordResetFinishRoute: Route = { + path: 'reset/finish', + component: PasswordResetFinishComponent, + data: { + authorities: [], + pageTitle: 'global.menu.account.password' + } +}; diff --git a/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.service.ts b/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..24736292014875ba61d02e1f81e1c99344a5da27 --- /dev/null +++ b/borestop/src/main/webapp/app/account/password-reset/finish/password-reset-finish.service.ts @@ -0,0 +1,14 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { SERVER_API_URL } from 'app/app.constants'; + +@Injectable({ providedIn: 'root' }) +export class PasswordResetFinishService { + constructor(private http: HttpClient) {} + + save(key: string, newPassword: string): Observable<{}> { + return this.http.post(SERVER_API_URL + 'api/account/reset-password/finish', { key, newPassword }); + } +} diff --git a/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.component.html b/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.component.html new file mode 100644 index 0000000000000000000000000000000000000000..3c05c6d972e089142010b463fd90a145d5ff6568 --- /dev/null +++ b/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.component.html @@ -0,0 +1,53 @@ +<div> + <div class="row justify-content-center"> + <div class="col-md-8"> + <h1 jhiTranslate="reset.request.title">Reset your password</h1> + + <jhi-alert-error></jhi-alert-error> + + <div class="alert alert-warning" *ngIf="!success"> + <span jhiTranslate="reset.request.messages.info">Enter the email address you used to register.</span> + </div> + + <div class="alert alert-success" *ngIf="success"> + <span jhiTranslate="reset.request.messages.success">Check your emails for details on how to reset your password.</span> + </div> + + <form *ngIf="!success" name="form" role="form" (ngSubmit)="requestReset()" [formGroup]="resetRequestForm"> + <div class="form-group"> + <label class="form-control-label" for="email" jhiTranslate="global.form.email.label">Email</label> + <input type="email" class="form-control" id="email" name="email" placeholder="{{ 'global.form.email.placeholder' | translate }}" + formControlName="email" #email> + + <div *ngIf="resetRequestForm.get('email')!.invalid && (resetRequestForm.get('email')!.dirty || resetRequestForm.get('email')!.touched)"> + <small class="form-text text-danger" + *ngIf="resetRequestForm.get('email')?.errors?.required" + jhiTranslate="global.messages.validate.email.required"> + Your email is required. + </small> + + <small class="form-text text-danger" + *ngIf="resetRequestForm.get('email')?.errors?.email" + jhiTranslate="global.messages.validate.email.invalid"> + Your email is invalid. + </small> + + <small class="form-text text-danger" + *ngIf="resetRequestForm.get('email')?.errors?.minlength" + jhiTranslate="global.messages.validate.email.minlength"> + Your email is required to be at least 5 characters. + </small> + + <small class="form-text text-danger" + *ngIf="resetRequestForm.get('email')?.errors?.maxlength" + jhiTranslate="global.messages.validate.email.maxlength"> + Your email cannot be longer than 100 characters. + </small> + </div> + </div> + + <button type="submit" [disabled]="resetRequestForm.invalid" class="btn btn-primary" jhiTranslate="reset.request.form.button">Reset</button> + </form> + </div> + </div> +</div> diff --git a/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.component.ts b/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..e8d4fb403f7fbcaf868dc471d9d062fc73cf3ef8 --- /dev/null +++ b/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.component.ts @@ -0,0 +1,30 @@ +import { Component, AfterViewInit, ElementRef, ViewChild } from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; + +import { PasswordResetInitService } from './password-reset-init.service'; + +@Component({ + selector: 'jhi-password-reset-init', + templateUrl: './password-reset-init.component.html' +}) +export class PasswordResetInitComponent implements AfterViewInit { + @ViewChild('email', { static: false }) + email?: ElementRef; + + success = false; + resetRequestForm = this.fb.group({ + email: ['', [Validators.required, Validators.minLength(5), Validators.maxLength(254), Validators.email]] + }); + + constructor(private passwordResetInitService: PasswordResetInitService, private fb: FormBuilder) {} + + ngAfterViewInit(): void { + if (this.email) { + this.email.nativeElement.focus(); + } + } + + requestReset(): void { + this.passwordResetInitService.save(this.resetRequestForm.get(['email'])!.value).subscribe(() => (this.success = true)); + } +} diff --git a/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.route.ts b/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.route.ts new file mode 100644 index 0000000000000000000000000000000000000000..887c77bc24e2e5b4231eef5640d148c246bc64d7 --- /dev/null +++ b/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.route.ts @@ -0,0 +1,12 @@ +import { Route } from '@angular/router'; + +import { PasswordResetInitComponent } from './password-reset-init.component'; + +export const passwordResetInitRoute: Route = { + path: 'reset/request', + component: PasswordResetInitComponent, + data: { + authorities: [], + pageTitle: 'global.menu.account.password' + } +}; diff --git a/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.service.ts b/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..368500c39b1b268e4af7bbade8cc44d5ef54bd77 --- /dev/null +++ b/borestop/src/main/webapp/app/account/password-reset/init/password-reset-init.service.ts @@ -0,0 +1,14 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { SERVER_API_URL } from 'app/app.constants'; + +@Injectable({ providedIn: 'root' }) +export class PasswordResetInitService { + constructor(private http: HttpClient) {} + + save(mail: string): Observable<{}> { + return this.http.post(SERVER_API_URL + 'api/account/reset-password/init', mail); + } +} diff --git a/borestop/src/main/webapp/app/account/password/password-strength-bar.component.ts b/borestop/src/main/webapp/app/account/password/password-strength-bar.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..ebeca9296e02aa38771c8fc4a3b7245c2b3ac031 --- /dev/null +++ b/borestop/src/main/webapp/app/account/password/password-strength-bar.component.ts @@ -0,0 +1,85 @@ +import { Component, ElementRef, Input, Renderer2 } from '@angular/core'; + +@Component({ + selector: 'jhi-password-strength-bar', + template: ` + <div id="strength"> + <small jhiTranslate="global.messages.validate.newpassword.strength">Password strength:</small> + <ul id="strengthBar"> + <li class="point"></li> + <li class="point"></li> + <li class="point"></li> + <li class="point"></li> + <li class="point"></li> + </ul> + </div> + `, + styleUrls: ['password-strength-bar.scss'] +}) +export class PasswordStrengthBarComponent { + colors = ['#F00', '#F90', '#FF0', '#9F0', '#0F0']; + + constructor(private renderer: Renderer2, private elementRef: ElementRef) {} + + measureStrength(p: string): number { + let force = 0; + const regex = /[$-/:-?{-~!"^_`[\]]/g; // " + const lowerLetters = /[a-z]+/.test(p); + const upperLetters = /[A-Z]+/.test(p); + const numbers = /[0-9]+/.test(p); + const symbols = regex.test(p); + + const flags = [lowerLetters, upperLetters, numbers, symbols]; + const passedMatches = flags.filter((isMatchedFlag: boolean) => { + return isMatchedFlag === true; + }).length; + + force += 2 * p.length + (p.length >= 10 ? 1 : 0); + force += passedMatches * 10; + + // penalty (short password) + force = p.length <= 6 ? Math.min(force, 10) : force; + + // penalty (poor variety of characters) + force = passedMatches === 1 ? Math.min(force, 10) : force; + force = passedMatches === 2 ? Math.min(force, 20) : force; + force = passedMatches === 3 ? Math.min(force, 40) : force; + + return force; + } + + getColor(s: number): { idx: number; color: string } { + let idx = 0; + if (s <= 10) { + idx = 0; + } else if (s <= 20) { + idx = 1; + } else if (s <= 30) { + idx = 2; + } else if (s <= 40) { + idx = 3; + } else { + idx = 4; + } + return { idx: idx + 1, color: this.colors[idx] }; + } + + @Input() + set passwordToCheck(password: string) { + if (password) { + const c = this.getColor(this.measureStrength(password)); + const element = this.elementRef.nativeElement; + if (element.className) { + this.renderer.removeClass(element, element.className); + } + const lis = element.getElementsByTagName('li'); + for (let i = 0; i < lis.length; i++) { + if (i < c.idx) { + this.renderer.setStyle(lis[i], 'backgroundColor', c.color); + } else { + this.renderer.setStyle(lis[i], 'backgroundColor', '#DDD'); + } + } + } + } +} diff --git a/borestop/src/main/webapp/app/account/password/password-strength-bar.scss b/borestop/src/main/webapp/app/account/password/password-strength-bar.scss new file mode 100644 index 0000000000000000000000000000000000000000..67ce4687a3527ee38673fd320516072fcd67ce55 --- /dev/null +++ b/borestop/src/main/webapp/app/account/password/password-strength-bar.scss @@ -0,0 +1,23 @@ +/* ========================================================================== +start Password strength bar style +========================================================================== */ +ul#strength { + display: inline; + list-style: none; + margin: 0; + margin-left: 15px; + padding: 0; + vertical-align: 2px; +} + +.point { + background: #ddd; + border-radius: 2px; + display: inline-block; + height: 5px; + margin-right: 1px; + width: 20px; + &:last-child { + margin: 0 !important; + } +} diff --git a/borestop/src/main/webapp/app/account/password/password.component.html b/borestop/src/main/webapp/app/account/password/password.component.html new file mode 100644 index 0000000000000000000000000000000000000000..020d32f4f64ad338e378457df33a92550557e57d --- /dev/null +++ b/borestop/src/main/webapp/app/account/password/password.component.html @@ -0,0 +1,94 @@ +<div> + <div class="row justify-content-center"> + <div class="col-md-8" *ngIf="account$ | async as account"> + <h2 jhiTranslate="password.title" [translateValues]="{ username: account.login }">Password for [<strong>{{ account.login }}</strong>]</h2> + + <div class="alert alert-success" *ngIf="success" jhiTranslate="password.messages.success"> + <strong>Password changed!</strong> + </div> + + <div class="alert alert-danger" *ngIf="error" jhiTranslate="password.messages.error"> + <strong>An error has occurred!</strong> The password could not be changed. + </div> + + <div class="alert alert-danger" *ngIf="doNotMatch" jhiTranslate="global.messages.error.dontmatch"> + The password and its confirmation do not match! + </div> + + <form name="form" role="form" (ngSubmit)="changePassword()" [formGroup]="passwordForm"> + <div class="form-group"> + <label class="form-control-label" for="currentPassword" jhiTranslate="global.form.currentpassword.label">Current password</label> + <input type="password" class="form-control" id="currentPassword" name="currentPassword" + placeholder="{{ 'global.form.currentpassword.placeholder' | translate }}" + formControlName="currentPassword"> + + <div *ngIf="passwordForm.get('currentPassword')!.invalid && (passwordForm.get('currentPassword')!.dirty || passwordForm.get('currentPassword')!.touched)" > + <small class="form-text text-danger" + *ngIf="passwordForm.get('currentPassword')?.errors?.required" + jhiTranslate="global.messages.validate.newpassword.required"> + Your password is required. + </small> + </div> + </div> + + <div class="form-group"> + <label class="form-control-label" for="newPassword" jhiTranslate="global.form.newpassword.label">New password</label> + <input type="password" class="form-control" id="newPassword" name="newPassword" + placeholder="{{ 'global.form.newpassword.placeholder' | translate }}" + formControlName="newPassword"> + + <div *ngIf="passwordForm.get('newPassword')!.invalid && (passwordForm.get('newPassword')!.dirty || passwordForm.get('newPassword')!.touched)"> + <small class="form-text text-danger" + *ngIf="passwordForm.get('newPassword')?.errors?.required" + jhiTranslate="global.messages.validate.newpassword.required"> + Your password is required. + </small> + + <small class="form-text text-danger" + *ngIf="passwordForm.get('newPassword')?.errors?.minlength" + jhiTranslate="global.messages.validate.newpassword.minlength"> + Your password is required to be at least 4 characters. + </small> + + <small class="form-text text-danger" + *ngIf="passwordForm.get('newPassword')?.errors?.maxlength" + jhiTranslate="global.messages.validate.newpassword.maxlength"> + Your password cannot be longer than 50 characters. + </small> + </div> + + <jhi-password-strength-bar [passwordToCheck]="passwordForm.get('newPassword')!.value"></jhi-password-strength-bar> + </div> + + <div class="form-group"> + <label class="form-control-label" for="confirmPassword" jhiTranslate="global.form.confirmpassword.label">New password confirmation</label> + <input type="password" class="form-control" id="confirmPassword" name="confirmPassword" + placeholder="{{ 'global.form.confirmpassword.placeholder' | translate }}" + formControlName="confirmPassword"> + + <div *ngIf="passwordForm.get('confirmPassword')!.invalid && (passwordForm.get('confirmPassword')!.dirty || passwordForm.get('confirmPassword')!.touched)"> + <small class="form-text text-danger" + *ngIf="passwordForm.get('confirmPassword')?.errors?.required" + jhiTranslate="global.messages.validate.confirmpassword.required"> + Your confirmation password is required. + </small> + + <small class="form-text text-danger" + *ngIf="passwordForm.get('confirmPassword')?.errors?.minlength" + jhiTranslate="global.messages.validate.confirmpassword.minlength"> + Your confirmation password is required to be at least 4 characters. + </small> + + <small class="form-text text-danger" + *ngIf="passwordForm.get('confirmPassword')?.errors?.maxlength" + jhiTranslate="global.messages.validate.confirmpassword.maxlength"> + Your confirmation password cannot be longer than 50 characters. + </small> + </div> + </div> + + <button type="submit" [disabled]="passwordForm.invalid" class="btn btn-primary" jhiTranslate="password.form.button">Save</button> + </form> + </div> + </div> +</div> diff --git a/borestop/src/main/webapp/app/account/password/password.component.ts b/borestop/src/main/webapp/app/account/password/password.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..5ceca30344db1e3ba9fc6fae708a746b0e91ba99 --- /dev/null +++ b/borestop/src/main/webapp/app/account/password/password.component.ts @@ -0,0 +1,45 @@ +import { Component, OnInit } from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; +import { Observable } from 'rxjs'; + +import { AccountService } from 'app/core/auth/account.service'; +import { Account } from 'app/core/user/account.model'; +import { PasswordService } from './password.service'; + +@Component({ + selector: 'jhi-password', + templateUrl: './password.component.html' +}) +export class PasswordComponent implements OnInit { + doNotMatch = false; + error = false; + success = false; + account$?: Observable<Account | null>; + passwordForm = this.fb.group({ + currentPassword: ['', [Validators.required]], + newPassword: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(50)]], + confirmPassword: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(50)]] + }); + + constructor(private passwordService: PasswordService, private accountService: AccountService, private fb: FormBuilder) {} + + ngOnInit(): void { + this.account$ = this.accountService.identity(); + } + + changePassword(): void { + this.error = false; + this.success = false; + this.doNotMatch = false; + + const newPassword = this.passwordForm.get(['newPassword'])!.value; + if (newPassword !== this.passwordForm.get(['confirmPassword'])!.value) { + this.doNotMatch = true; + } else { + this.passwordService.save(newPassword, this.passwordForm.get(['currentPassword'])!.value).subscribe( + () => (this.success = true), + () => (this.error = true) + ); + } + } +} diff --git a/borestop/src/main/webapp/app/account/password/password.route.ts b/borestop/src/main/webapp/app/account/password/password.route.ts new file mode 100644 index 0000000000000000000000000000000000000000..ab3b6264f7d23584c3e031db26f50a9d862f5cd4 --- /dev/null +++ b/borestop/src/main/webapp/app/account/password/password.route.ts @@ -0,0 +1,15 @@ +import { Route } from '@angular/router'; + +import { UserRouteAccessService } from 'app/core/auth/user-route-access-service'; +import { PasswordComponent } from './password.component'; +import { Authority } from 'app/shared/constants/authority.constants'; + +export const passwordRoute: Route = { + path: 'password', + component: PasswordComponent, + data: { + authorities: [Authority.USER], + pageTitle: 'global.menu.account.password' + }, + canActivate: [UserRouteAccessService] +}; diff --git a/borestop/src/main/webapp/app/account/password/password.service.ts b/borestop/src/main/webapp/app/account/password/password.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..13017f8ce4ecd00d681b6b4bf796e7d09a00caa3 --- /dev/null +++ b/borestop/src/main/webapp/app/account/password/password.service.ts @@ -0,0 +1,14 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { SERVER_API_URL } from 'app/app.constants'; + +@Injectable({ providedIn: 'root' }) +export class PasswordService { + constructor(private http: HttpClient) {} + + save(newPassword: string, currentPassword: string): Observable<{}> { + return this.http.post(SERVER_API_URL + 'api/account/change-password', { currentPassword, newPassword }); + } +} diff --git a/borestop/src/main/webapp/app/account/register/register.component.html b/borestop/src/main/webapp/app/account/register/register.component.html new file mode 100644 index 0000000000000000000000000000000000000000..7f8c8136cd399a31557c01dc3bd7baaba370daef --- /dev/null +++ b/borestop/src/main/webapp/app/account/register/register.component.html @@ -0,0 +1,158 @@ +<div> + <div class="row justify-content-center"> + <div class="col-md-8"> + <h1 jhiTranslate="register.title">Registration</h1> + + <div class="alert alert-success" *ngIf="success" jhiTranslate="register.messages.success"> + <strong>Registration saved!</strong> Please check your email for confirmation. + </div> + + <div class="alert alert-danger" *ngIf="error" jhiTranslate="register.messages.error.fail"> + <strong>Registration failed!</strong> Please try again later. + </div> + + <div class="alert alert-danger" *ngIf="errorUserExists" jhiTranslate="register.messages.error.userexists"> + <strong>Login name already registered!</strong> Please choose another one. + </div> + + <div class="alert alert-danger" *ngIf="errorEmailExists" jhiTranslate="register.messages.error.emailexists"> + <strong>Email is already in use!</strong> Please choose another one. + </div> + + <div class="alert alert-danger" *ngIf="doNotMatch" jhiTranslate="global.messages.error.dontmatch"> + The password and its confirmation do not match! + </div> + </div> + </div> + + <div class="row justify-content-center"> + <div class="col-md-8"> + <form name="form" role="form" (ngSubmit)="register()" [formGroup]="registerForm" *ngIf="!success"> + <div class="form-group"> + <label class="form-control-label" for="login" jhiTranslate="global.form.username.label">Username</label> + <input type="text" class="form-control" id="login" name="login" placeholder="{{ 'global.form.username.placeholder' | translate }}" + formControlName="login" #login> + + <div *ngIf="registerForm.get('login')!.invalid && (registerForm.get('login')!.dirty || registerForm.get('login')!.touched)"> + <small class="form-text text-danger" + *ngIf="registerForm.get('login')?.errors?.required" + jhiTranslate="register.messages.validate.login.required"> + Your username is required. + </small> + + <small class="form-text text-danger" + *ngIf="registerForm.get('login')?.errors?.minlength" + jhiTranslate="register.messages.validate.login.minlength"> + Your username is required to be at least 1 character. + </small> + + <small class="form-text text-danger" + *ngIf="registerForm.get('login')?.errors?.maxlength" + jhiTranslate="register.messages.validate.login.maxlength"> + Your username cannot be longer than 50 characters. + </small> + + <small class="form-text text-danger" + *ngIf="registerForm.get('login')?.errors?.pattern" + jhiTranslate="register.messages.validate.login.pattern"> + Your username can only contain letters and digits. + </small> + </div> + </div> + + <div class="form-group"> + <label class="form-control-label" for="email" jhiTranslate="global.form.email.label">Email</label> + <input type="email" class="form-control" id="email" name="email" placeholder="{{ 'global.form.email.placeholder' | translate }}" + formControlName="email"> + + <div *ngIf="registerForm.get('email')!.invalid && (registerForm.get('email')!.dirty || registerForm.get('email')!.touched)"> + <small class="form-text text-danger" + *ngIf="registerForm.get('email')?.errors?.required" + jhiTranslate="global.messages.validate.email.required"> + Your email is required. + </small> + + <small class="form-text text-danger" + *ngIf="registerForm.get('email')?.errors?.invalid" + jhiTranslate="global.messages.validate.email.invalid"> + Your email is invalid. + </small> + + <small class="form-text text-danger" + *ngIf="registerForm.get('email')?.errors?.minlength" + jhiTranslate="global.messages.validate.email.minlength"> + Your email is required to be at least 5 characters. + </small> + + <small class="form-text text-danger" + *ngIf="registerForm.get('email')?.errors?.maxlength" + jhiTranslate="global.messages.validate.email.maxlength"> + Your email cannot be longer than 100 characters. + </small> + </div> + </div> + + <div class="form-group"> + <label class="form-control-label" for="password" jhiTranslate="global.form.newpassword.label">New password</label> + <input type="password" class="form-control" id="password" name="password" placeholder="{{ 'global.form.newpassword.placeholder' | translate }}" + formControlName="password"> + + <div *ngIf="registerForm.get('password')!.invalid && (registerForm.get('password')!.dirty || registerForm.get('password')!.touched)"> + <small class="form-text text-danger" + *ngIf="registerForm.get('password')?.errors?.required" + jhiTranslate="global.messages.validate.newpassword.required"> + Your password is required. + </small> + + <small class="form-text text-danger" + *ngIf="registerForm.get('password')?.errors?.minlength" + jhiTranslate="global.messages.validate.newpassword.minlength"> + Your password is required to be at least 4 characters. + </small> + + <small class="form-text text-danger" + *ngIf="registerForm.get('password')?.errors?.maxlength" + jhiTranslate="global.messages.validate.newpassword.maxlength"> + Your password cannot be longer than 50 characters. + </small> + </div> + + <jhi-password-strength-bar [passwordToCheck]="registerForm.get('password')!.value"></jhi-password-strength-bar> + </div> + + <div class="form-group"> + <label class="form-control-label" for="confirmPassword" jhiTranslate="global.form.confirmpassword.label">New password confirmation</label> + <input type="password" class="form-control" id="confirmPassword" name="confirmPassword" placeholder="{{ 'global.form.confirmpassword.placeholder' | translate }}" + formControlName="confirmPassword"> + + <div *ngIf="registerForm.get('confirmPassword')!.invalid && (registerForm.get('confirmPassword')!.dirty || registerForm.get('confirmPassword')!.touched)"> + <small class="form-text text-danger" + *ngIf="registerForm.get('confirmPassword')?.errors?.required" + jhiTranslate="global.messages.validate.confirmpassword.required"> + Your confirmation password is required. + </small> + + <small class="form-text text-danger" + *ngIf="registerForm.get('confirmPassword')?.errors?.minlength" + jhiTranslate="global.messages.validate.confirmpassword.minlength"> + Your confirmation password is required to be at least 4 characters. + </small> + + <small class="form-text text-danger" + *ngIf="registerForm.get('confirmPassword')?.errors?.maxlength" + jhiTranslate="global.messages.validate.confirmpassword.maxlength"> + Your confirmation password cannot be longer than 50 characters. + </small> + </div> + </div> + + <button type="submit" [disabled]="registerForm.invalid" class="btn btn-primary" jhiTranslate="register.form.button">Register</button> + </form> + + <div class="mt-3 alert alert-warning"> + <span jhiTranslate="global.messages.info.authenticated.prefix">If you want to </span> + <a class="alert-link" (click)="openLogin()" jhiTranslate="global.messages.info.authenticated.link">sign in</a><span jhiTranslate="global.messages.info.authenticated.suffix">, you can try the default accounts:<br/>- Administrator (login="admin" and password="admin") <br/>- User (login="user" and password="user").</span> + </div> + </div> + </div> +</div> diff --git a/borestop/src/main/webapp/app/account/register/register.component.ts b/borestop/src/main/webapp/app/account/register/register.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..5c54223facd2a81f1c24bd02d9cd448eec23b273 --- /dev/null +++ b/borestop/src/main/webapp/app/account/register/register.component.ts @@ -0,0 +1,84 @@ +import { Component, AfterViewInit, ElementRef, ViewChild } from '@angular/core'; +import { HttpErrorResponse } from '@angular/common/http'; +import { FormBuilder, Validators } from '@angular/forms'; +import { JhiLanguageService } from 'ng-jhipster'; + +import { EMAIL_ALREADY_USED_TYPE, LOGIN_ALREADY_USED_TYPE } from 'app/shared/constants/error.constants'; +import { LoginModalService } from 'app/core/login/login-modal.service'; +import { RegisterService } from './register.service'; + +@Component({ + selector: 'jhi-register', + templateUrl: './register.component.html' +}) +export class RegisterComponent implements AfterViewInit { + @ViewChild('login', { static: false }) + login?: ElementRef; + + doNotMatch = false; + error = false; + errorEmailExists = false; + errorUserExists = false; + success = false; + + registerForm = this.fb.group({ + login: [ + '', + [ + Validators.required, + Validators.minLength(1), + Validators.maxLength(50), + Validators.pattern('^[a-zA-Z0-9!$&*+=?^_`{|}~.-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$|^[_.@A-Za-z0-9-]+$') + ] + ], + email: ['', [Validators.required, Validators.minLength(5), Validators.maxLength(254), Validators.email]], + password: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(50)]], + confirmPassword: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(50)]] + }); + + constructor( + private languageService: JhiLanguageService, + private loginModalService: LoginModalService, + private registerService: RegisterService, + private fb: FormBuilder + ) {} + + ngAfterViewInit(): void { + if (this.login) { + this.login.nativeElement.focus(); + } + } + + register(): void { + this.doNotMatch = false; + this.error = false; + this.errorEmailExists = false; + this.errorUserExists = false; + + const password = this.registerForm.get(['password'])!.value; + if (password !== this.registerForm.get(['confirmPassword'])!.value) { + this.doNotMatch = true; + } else { + const login = this.registerForm.get(['login'])!.value; + const email = this.registerForm.get(['email'])!.value; + this.registerService.save({ login, email, password, langKey: this.languageService.getCurrentLanguage() }).subscribe( + () => (this.success = true), + response => this.processError(response) + ); + } + } + + openLogin(): void { + this.loginModalService.open(); + } + + private processError(response: HttpErrorResponse): void { + if (response.status === 400 && response.error.type === LOGIN_ALREADY_USED_TYPE) { + this.errorUserExists = true; + } else if (response.status === 400 && response.error.type === EMAIL_ALREADY_USED_TYPE) { + this.errorEmailExists = true; + } else { + this.error = true; + } + } +} diff --git a/borestop/src/main/webapp/app/account/register/register.route.ts b/borestop/src/main/webapp/app/account/register/register.route.ts new file mode 100644 index 0000000000000000000000000000000000000000..f4ede9d3ab68c2a93b76c78c373177938d9871d7 --- /dev/null +++ b/borestop/src/main/webapp/app/account/register/register.route.ts @@ -0,0 +1,12 @@ +import { Route } from '@angular/router'; + +import { RegisterComponent } from './register.component'; + +export const registerRoute: Route = { + path: 'register', + component: RegisterComponent, + data: { + authorities: [], + pageTitle: 'register.title' + } +}; diff --git a/borestop/src/main/webapp/app/account/register/register.service.ts b/borestop/src/main/webapp/app/account/register/register.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..9a519152bc2a4e34fb111949b59d78c709fcd1fb --- /dev/null +++ b/borestop/src/main/webapp/app/account/register/register.service.ts @@ -0,0 +1,15 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { SERVER_API_URL } from 'app/app.constants'; +import { IUser } from 'app/core/user/user.model'; + +@Injectable({ providedIn: 'root' }) +export class RegisterService { + constructor(private http: HttpClient) {} + + save(account: IUser): Observable<{}> { + return this.http.post(SERVER_API_URL + 'api/register', account); + } +} diff --git a/borestop/src/main/webapp/app/account/settings/settings.component.html b/borestop/src/main/webapp/app/account/settings/settings.component.html new file mode 100644 index 0000000000000000000000000000000000000000..e7665a3edcc9bdebd175e5969a68928846a0026a --- /dev/null +++ b/borestop/src/main/webapp/app/account/settings/settings.component.html @@ -0,0 +1,108 @@ +<div> + <div class="row justify-content-center"> + <div class="col-md-8"> + <h2 jhiTranslate="settings.title" [translateValues]="{ username: account.login }" *ngIf="account">User settings for [<b>{{ account.login }}</b>]</h2> + + <div class="alert alert-success" *ngIf="success" jhiTranslate="settings.messages.success"> + <strong>Settings saved!</strong> + </div> + + <jhi-alert-error></jhi-alert-error> + + <form name="form" role="form" (ngSubmit)="save()" [formGroup]="settingsForm" *ngIf="account" novalidate> + <div class="form-group"> + <label class="form-control-label" for="firstName" jhiTranslate="settings.form.firstname">First Name</label> + <input type="text" class="form-control" id="firstName" name="firstName" placeholder="{{ 'settings.form.firstname.placeholder' | translate }}" + formControlName="firstName"> + + <div *ngIf="settingsForm.get('firstName')!.invalid && (settingsForm.get('firstName')!.dirty || settingsForm.get('firstName')!.touched)"> + <small class="form-text text-danger" + *ngIf="settingsForm.get('firstName')?.errors?.required" + jhiTranslate="settings.messages.validate.firstname.required"> + Your first name is required. + </small> + + <small class="form-text text-danger" + *ngIf="settingsForm.get('firstName')?.errors?.minlength" + jhiTranslate="settings.messages.validate.firstname.minlength"> + Your first name is required to be at least 1 character. + </small> + + <small class="form-text text-danger" + *ngIf="settingsForm.get('firstName')?.errors?.maxlength" + jhiTranslate="settings.messages.validate.firstname.maxlength"> + Your first name cannot be longer than 50 characters. + </small> + </div> + </div> + + <div class="form-group"> + <label class="form-control-label" for="lastName" jhiTranslate="settings.form.lastname">Last Name</label> + <input type="text" class="form-control" id="lastName" name="lastName" placeholder="{{ 'settings.form.lastname.placeholder' | translate }}" + formControlName="lastName"> + + <div *ngIf="settingsForm.get('lastName')!.invalid && (settingsForm.get('lastName')!.dirty || settingsForm.get('lastName')!.touched)"> + <small class="form-text text-danger" + *ngIf="settingsForm.get('lastName')?.errors?.required" + jhiTranslate="settings.messages.validate.lastname.required"> + Your last name is required. + </small> + + <small class="form-text text-danger" + *ngIf="settingsForm.get('lastName')?.errors?.minlength" + jhiTranslate="settings.messages.validate.lastname.minlength"> + Your last name is required to be at least 1 character. + </small> + + <small class="form-text text-danger" + *ngIf="settingsForm.get('lastName')?.errors?.maxlength" + jhiTranslate="settings.messages.validate.lastname.maxlength"> + Your last name cannot be longer than 50 characters. + </small> + </div> + </div> + + <div class="form-group"> + <label class="form-control-label" for="email" jhiTranslate="global.form.email.label">Email</label> + <input type="email" class="form-control" id="email" name="email" placeholder="{{ 'global.form.email.placeholder' | translate }}" + formControlName="email"> + + <div *ngIf="settingsForm.get('email')!.invalid && (settingsForm.get('email')!.dirty || settingsForm.get('email')!.touched)"> + <small class="form-text text-danger" + *ngIf="settingsForm.get('email')?.errors?.required" + jhiTranslate="global.messages.validate.email.required"> + Your email is required. + </small> + + <small class="form-text text-danger" + *ngIf="settingsForm.get('email')?.errors?.email" + jhiTranslate="global.messages.validate.email.invalid"> + Your email is invalid. + </small> + + <small class="form-text text-danger" + *ngIf="settingsForm.get('email')?.errors?.minlength" + jhiTranslate="global.messages.validate.email.minlength"> + Your email is required to be at least 5 characters. + </small> + + <small class="form-text text-danger" + *ngIf="settingsForm.get('email')?.errors?.maxlength" + jhiTranslate="global.messages.validate.email.maxlength"> + Your email cannot be longer than 100 characters. + </small> + </div> + </div> + + <div class="form-group" *ngIf="languages && languages.length > 0"> + <label for="langKey" jhiTranslate="settings.form.language">Language</label> + <select class="form-control" id="langKey" name="langKey" formControlName="langKey"> + <option *ngFor="let language of languages" [value]="language">{{ language | findLanguageFromKey }}</option> + </select> + </div> + + <button type="submit" [disabled]="settingsForm.invalid" class="btn btn-primary" jhiTranslate="settings.form.button">Save</button> + </form> + </div> + </div> +</div> diff --git a/borestop/src/main/webapp/app/account/settings/settings.component.ts b/borestop/src/main/webapp/app/account/settings/settings.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..b40197f600106c6eac6eefd4e5f03d0616b9a229 --- /dev/null +++ b/borestop/src/main/webapp/app/account/settings/settings.component.ts @@ -0,0 +1,59 @@ +import { Component, OnInit } from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; +import { JhiLanguageService } from 'ng-jhipster'; + +import { AccountService } from 'app/core/auth/account.service'; +import { Account } from 'app/core/user/account.model'; +import { LANGUAGES } from 'app/core/language/language.constants'; + +@Component({ + selector: 'jhi-settings', + templateUrl: './settings.component.html' +}) +export class SettingsComponent implements OnInit { + account!: Account; + success = false; + languages = LANGUAGES; + settingsForm = this.fb.group({ + firstName: [undefined, [Validators.required, Validators.minLength(1), Validators.maxLength(50)]], + lastName: [undefined, [Validators.required, Validators.minLength(1), Validators.maxLength(50)]], + email: [undefined, [Validators.required, Validators.minLength(5), Validators.maxLength(254), Validators.email]], + langKey: [undefined] + }); + + constructor(private accountService: AccountService, private fb: FormBuilder, private languageService: JhiLanguageService) {} + + ngOnInit(): void { + this.accountService.identity().subscribe(account => { + if (account) { + this.settingsForm.patchValue({ + firstName: account.firstName, + lastName: account.lastName, + email: account.email, + langKey: account.langKey + }); + + this.account = account; + } + }); + } + + save(): void { + this.success = false; + + this.account.firstName = this.settingsForm.get('firstName')!.value; + this.account.lastName = this.settingsForm.get('lastName')!.value; + this.account.email = this.settingsForm.get('email')!.value; + this.account.langKey = this.settingsForm.get('langKey')!.value; + + this.accountService.save(this.account).subscribe(() => { + this.success = true; + + this.accountService.authenticate(this.account); + + if (this.account.langKey !== this.languageService.getCurrentLanguage()) { + this.languageService.changeLanguage(this.account.langKey); + } + }); + } +} diff --git a/borestop/src/main/webapp/app/account/settings/settings.route.ts b/borestop/src/main/webapp/app/account/settings/settings.route.ts new file mode 100644 index 0000000000000000000000000000000000000000..2deeda95d1afb75b36ac753d176fc8988d67fbed --- /dev/null +++ b/borestop/src/main/webapp/app/account/settings/settings.route.ts @@ -0,0 +1,15 @@ +import { Route } from '@angular/router'; + +import { UserRouteAccessService } from 'app/core/auth/user-route-access-service'; +import { SettingsComponent } from './settings.component'; +import { Authority } from 'app/shared/constants/authority.constants'; + +export const settingsRoute: Route = { + path: 'settings', + component: SettingsComponent, + data: { + authorities: [Authority.USER], + pageTitle: 'global.menu.account.settings' + }, + canActivate: [UserRouteAccessService] +}; diff --git a/borestop/src/main/webapp/app/admin/admin-routing.module.ts b/borestop/src/main/webapp/app/admin/admin-routing.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..f10ae6846ca3020da5476dfd174249da86bfcc50 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/admin-routing.module.ts @@ -0,0 +1,44 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +/* jhipster-needle-add-admin-module-import - JHipster will add admin modules imports here */ + +@NgModule({ + imports: [ + /* jhipster-needle-add-admin-module - JHipster will add admin modules here */ + RouterModule.forChild([ + { + path: 'user-management', + loadChildren: () => import('./user-management/user-management.module').then(m => m.UserManagementModule), + data: { + pageTitle: 'userManagement.home.title' + } + }, + { + path: 'audits', + loadChildren: () => import('./audits/audits.module').then(m => m.AuditsModule) + }, + { + path: 'configuration', + loadChildren: () => import('./configuration/configuration.module').then(m => m.ConfigurationModule) + }, + { + path: 'docs', + loadChildren: () => import('./docs/docs.module').then(m => m.DocsModule) + }, + { + path: 'health', + loadChildren: () => import('./health/health.module').then(m => m.HealthModule) + }, + { + path: 'logs', + loadChildren: () => import('./logs/logs.module').then(m => m.LogsModule) + }, + { + path: 'metrics', + loadChildren: () => import('./metrics/metrics.module').then(m => m.MetricsModule) + } + /* jhipster-needle-add-admin-route - JHipster will add admin routes here */ + ]) + ] +}) +export class AdminRoutingModule {} diff --git a/borestop/src/main/webapp/app/admin/audits/audit-data.model.ts b/borestop/src/main/webapp/app/admin/audits/audit-data.model.ts new file mode 100644 index 0000000000000000000000000000000000000000..7d5bef460e5d83729cd0793261c6b5780c2cf444 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/audits/audit-data.model.ts @@ -0,0 +1,3 @@ +export class AuditData { + constructor(public remoteAddress?: string, public sessionId?: string, public message?: string) {} +} diff --git a/borestop/src/main/webapp/app/admin/audits/audit.model.ts b/borestop/src/main/webapp/app/admin/audits/audit.model.ts new file mode 100644 index 0000000000000000000000000000000000000000..5c6410745e87174adb42c7398cc5640e10ea0fc3 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/audits/audit.model.ts @@ -0,0 +1,5 @@ +import { AuditData } from './audit-data.model'; + +export class Audit { + constructor(public data: AuditData, public principal: string, public timestamp: string, public type: string) {} +} diff --git a/borestop/src/main/webapp/app/admin/audits/audits.component.html b/borestop/src/main/webapp/app/admin/audits/audits.component.html new file mode 100644 index 0000000000000000000000000000000000000000..4884222333e0231d2c02272f01840f682b675db8 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/audits/audits.component.html @@ -0,0 +1,67 @@ +<div> + <h2 id="audits-page-heading" jhiTranslate="audits.title">Audits</h2> + + <jhi-alert-error></jhi-alert-error> + + <div class="row"> + <div class="col-md-5"> + <h4 jhiTranslate="audits.filter.title">Filter by date</h4> + + <div class="input-group mb-3"> + <div class="input-group-prepend"> + <span class="input-group-text" jhiTranslate="audits.filter.from">from</span> + </div> + <input type="date" class="form-control" name="start" [(ngModel)]="fromDate" (ngModelChange)="transition()" required/> + + <div class="input-group-append"> + <span class="input-group-text" jhiTranslate="audits.filter.to">To</span> + </div> + <input type="date" class="form-control" name="end" [(ngModel)]="toDate" (ngModelChange)="transition()" required/> + </div> + </div> + </div> + + <div class="alert alert-warning" *ngIf="audits?.length === 0"> + <span jhiTranslate="audits.notFound">No audit found</span> + </div> + + <div class="table-responsive" *ngIf="audits && audits.length > 0"> + <table class="table table-sm table-striped" aria-describedby="audits-page-heading"> + <thead [ngSwitch]="canLoad()"> + <tr jhiSort [(predicate)]="predicate" [(ascending)]="ascending" [callback]="transition.bind(this)" *ngSwitchCase="true"> + <th scope="col" jhiSortBy="auditEventDate"><span jhiTranslate="audits.table.header.date">Date</span> <fa-icon icon="sort"></fa-icon></th> + <th scope="col" jhiSortBy="principal"><span jhiTranslate="audits.table.header.principal">User</span> <fa-icon icon="sort"></fa-icon></th> + <th scope="col" jhiSortBy="auditEventType"><span jhiTranslate="audits.table.header.status">State</span> <fa-icon icon="sort"></fa-icon></th> + <th scope="col"><span jhiTranslate="audits.table.header.data">Extra data</span></th> + </tr> + <tr *ngSwitchCase="false"> + <th scope="col"><span jhiTranslate="audits.table.header.date">Date</span></th> + <th scope="col"><span jhiTranslate="audits.table.header.principal">User</span></th> + <th scope="col"><span jhiTranslate="audits.table.header.status">State</span></th> + <th scope="col"><span jhiTranslate="audits.table.header.data">Extra data</span></th> + </tr> + </thead> + <tbody> + <tr *ngFor="let audit of audits"> + <td><span>{{ audit.timestamp | date:'medium' }}</span></td> + <td><small>{{ audit.principal }}</small></td> + <td>{{ audit.type }}</td> + <td> + <span *ngIf="audit.data?.message">{{ audit.data.message }}</span> + <span *ngIf="audit.data?.remoteAddress"><span jhiTranslate="audits.table.data.remoteAddress">Remote Address</span> {{ audit.data.remoteAddress }}</span> + </td> + </tr> + </tbody> + </table> + </div> + + <div *ngIf="audits && audits.length > 0"> + <div class="row justify-content-center"> + <jhi-item-count [page]="page" [total]="totalItems" [itemsPerPage]="itemsPerPage"></jhi-item-count> + </div> + + <div class="row justify-content-center"> + <ngb-pagination [collectionSize]="totalItems" [(page)]="page" [pageSize]="itemsPerPage" [maxSize]="5" [rotate]="true" [boundaryLinks]="true" (pageChange)="transition()" [disabled]="!canLoad()"></ngb-pagination> + </div> + </div> +</div> diff --git a/borestop/src/main/webapp/app/admin/audits/audits.component.ts b/borestop/src/main/webapp/app/admin/audits/audits.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..f9683c18a2729537e9c74fa8eb539cdfa6593f7b --- /dev/null +++ b/borestop/src/main/webapp/app/admin/audits/audits.component.ts @@ -0,0 +1,115 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpResponse, HttpHeaders } from '@angular/common/http'; +import { DatePipe } from '@angular/common'; +import { ActivatedRoute, ParamMap, Router, Data } from '@angular/router'; +import { combineLatest } from 'rxjs'; + +import { ITEMS_PER_PAGE } from 'app/shared/constants/pagination.constants'; +import { Audit } from './audit.model'; +import { AuditsService } from './audits.service'; + +@Component({ + selector: 'jhi-audit', + templateUrl: './audits.component.html' +}) +export class AuditsComponent implements OnInit { + audits?: Audit[]; + fromDate = ''; + itemsPerPage = ITEMS_PER_PAGE; + page!: number; + predicate!: string; + ascending!: boolean; + toDate = ''; + totalItems = 0; + + private dateFormat = 'yyyy-MM-dd'; + + constructor( + private auditsService: AuditsService, + private activatedRoute: ActivatedRoute, + private datePipe: DatePipe, + private router: Router + ) {} + + ngOnInit(): void { + this.toDate = this.today(); + this.fromDate = this.previousMonth(); + this.handleNavigation(); + } + + canLoad(): boolean { + return this.fromDate !== '' && this.toDate !== ''; + } + + transition(): void { + if (this.canLoad()) { + this.router.navigate(['/admin/audits'], { + queryParams: { + page: this.page, + sort: this.predicate + ',' + (this.ascending ? 'asc' : 'desc'), + from: this.fromDate, + to: this.toDate + } + }); + } + } + + private previousMonth(): string { + let date = new Date(); + if (date.getMonth() === 0) { + date = new Date(date.getFullYear() - 1, 11, date.getDate()); + } else { + date = new Date(date.getFullYear(), date.getMonth() - 1, date.getDate()); + } + return this.datePipe.transform(date, this.dateFormat)!; + } + + private today(): string { + // Today + 1 day - needed if the current day must be included + const date = new Date(); + date.setDate(date.getDate() + 1); + return this.datePipe.transform(date, this.dateFormat)!; + } + + private handleNavigation(): void { + combineLatest(this.activatedRoute.data, this.activatedRoute.queryParamMap, (data: Data, params: ParamMap) => { + const page = params.get('page'); + this.page = page !== null ? +page : 1; + const sort = (params.get('sort') ?? data['defaultSort']).split(','); + this.predicate = sort[0]; + this.ascending = sort[1] === 'asc'; + if (params.get('from')) { + this.fromDate = this.datePipe.transform(params.get('from'), this.dateFormat)!; + } + if (params.get('to')) { + this.toDate = this.datePipe.transform(params.get('to'), this.dateFormat)!; + } + this.loadData(); + }).subscribe(); + } + + private loadData(): void { + this.auditsService + .query({ + page: this.page - 1, + size: this.itemsPerPage, + sort: this.sort(), + fromDate: this.fromDate, + toDate: this.toDate + }) + .subscribe((res: HttpResponse<Audit[]>) => this.onSuccess(res.body, res.headers)); + } + + private sort(): string[] { + const result = [this.predicate + ',' + (this.ascending ? 'asc' : 'desc')]; + if (this.predicate !== 'id') { + result.push('id'); + } + return result; + } + + private onSuccess(audits: Audit[] | null, headers: HttpHeaders): void { + this.totalItems = Number(headers.get('X-Total-Count')); + this.audits = audits || []; + } +} diff --git a/borestop/src/main/webapp/app/admin/audits/audits.module.ts b/borestop/src/main/webapp/app/admin/audits/audits.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..15d1fbe6090ea14d45d1bad34cb4efa8c97be227 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/audits/audits.module.ts @@ -0,0 +1,13 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { BorestopSharedModule } from 'app/shared/shared.module'; + +import { AuditsComponent } from './audits.component'; + +import { auditsRoute } from './audits.route'; + +@NgModule({ + imports: [BorestopSharedModule, RouterModule.forChild([auditsRoute])], + declarations: [AuditsComponent] +}) +export class AuditsModule {} diff --git a/borestop/src/main/webapp/app/admin/audits/audits.route.ts b/borestop/src/main/webapp/app/admin/audits/audits.route.ts new file mode 100644 index 0000000000000000000000000000000000000000..14e86977f2c1b08efd8957d78293c53b99e1d401 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/audits/audits.route.ts @@ -0,0 +1,12 @@ +import { Route } from '@angular/router'; + +import { AuditsComponent } from './audits.component'; + +export const auditsRoute: Route = { + path: '', + component: AuditsComponent, + data: { + pageTitle: 'audits.title', + defaultSort: 'auditEventDate,desc' + } +}; diff --git a/borestop/src/main/webapp/app/admin/audits/audits.service.ts b/borestop/src/main/webapp/app/admin/audits/audits.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..d86bf47bd3f98c069e0e2114981cf29822839345 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/audits/audits.service.ts @@ -0,0 +1,28 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpParams, HttpResponse } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { createRequestOption, Pagination } from 'app/shared/util/request-util'; +import { SERVER_API_URL } from 'app/app.constants'; +import { Audit } from './audit.model'; + +export interface AuditsQuery extends Pagination { + fromDate: string; + toDate: string; +} + +@Injectable({ providedIn: 'root' }) +export class AuditsService { + constructor(private http: HttpClient) {} + + query(req: AuditsQuery): Observable<HttpResponse<Audit[]>> { + const params: HttpParams = createRequestOption(req); + + const requestURL = SERVER_API_URL + 'management/audits'; + + return this.http.get<Audit[]>(requestURL, { + params, + observe: 'response' + }); + } +} diff --git a/borestop/src/main/webapp/app/admin/configuration/configuration.component.html b/borestop/src/main/webapp/app/admin/configuration/configuration.component.html new file mode 100644 index 0000000000000000000000000000000000000000..1002f7a0aabf465339496dc931af304414bc41d6 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/configuration/configuration.component.html @@ -0,0 +1,50 @@ +<div *ngIf="allBeans"> + <h2 id="configuration-page-heading" jhiTranslate="configuration.title">Configuration</h2> + + <span jhiTranslate="configuration.filter">Filter (by prefix)</span> <input type="text" [(ngModel)]="beansFilter" (ngModelChange)="filterAndSortBeans()" class="form-control"> + + <h3 id="spring-configuration">Spring configuration</h3> + + <table class="table table-striped table-bordered table-responsive d-table" aria-describedby="spring-configuration"> + <thead> + <tr jhiSort predicate="prefix" [(ascending)]="beansAscending" [callback]="filterAndSortBeans.bind(this)"> + <th jhiSortBy="prefix" scope="col" class="w-40"><span jhiTranslate="configuration.table.prefix">Prefix</span> <fa-icon icon="sort"></fa-icon></th> + <th scope="col" class="w-60"><span jhiTranslate="configuration.table.properties">Properties</span></th> + </tr> + </thead> + <tbody> + <tr *ngFor="let bean of beans"> + <td><span>{{ bean.prefix }}</span></td> + <td> + <div class="row" *ngFor="let property of bean.properties | keys"> + <div class="col-md-4">{{ property.key }}</div> + <div class="col-md-8"> + <span class="float-right badge-secondary break">{{ property.value | json }}</span> + </div> + </div> + </td> + </tr> + </tbody> + </table> + + <div *ngFor="let propertySource of propertySources; let i = index"> + <h4 [id]="'property-source-' + i"><span>{{ propertySource.name }}</span></h4> + + <table class="table table-sm table-striped table-bordered table-responsive d-table" [attr.aria-describedby]="'property-source-' + i"><!-- //NOSONAR --> + <thead> + <tr> + <th scope="col" class="w-40">Property</th> + <th scope="col" class="w-60">Value</th> + </tr> + </thead> + <tbody> + <tr *ngFor="let property of propertySource.properties | keys"> + <td class="break">{{ property.key }}</td> + <td class="break"> + <span class="float-right badge-secondary break">{{ property.value.value }}</span> + </td> + </tr> + </tbody> + </table> + </div> +</div> diff --git a/borestop/src/main/webapp/app/admin/configuration/configuration.component.ts b/borestop/src/main/webapp/app/admin/configuration/configuration.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..679e71abe7de34a20dbbd21b19a103dffd9639b4 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/configuration/configuration.component.ts @@ -0,0 +1,32 @@ +import { Component, OnInit } from '@angular/core'; + +import { ConfigurationService, Bean, PropertySource } from './configuration.service'; + +@Component({ + selector: 'jhi-configuration', + templateUrl: './configuration.component.html' +}) +export class ConfigurationComponent implements OnInit { + allBeans!: Bean[]; + beans: Bean[] = []; + beansFilter = ''; + beansAscending = true; + propertySources: PropertySource[] = []; + + constructor(private configurationService: ConfigurationService) {} + + ngOnInit(): void { + this.configurationService.getBeans().subscribe(beans => { + this.allBeans = beans; + this.filterAndSortBeans(); + }); + + this.configurationService.getPropertySources().subscribe(propertySources => (this.propertySources = propertySources)); + } + + filterAndSortBeans(): void { + this.beans = this.allBeans + .filter(bean => !this.beansFilter || bean.prefix.toLowerCase().includes(this.beansFilter.toLowerCase())) + .sort((a, b) => (a.prefix < b.prefix ? (this.beansAscending ? -1 : 1) : this.beansAscending ? 1 : -1)); + } +} diff --git a/borestop/src/main/webapp/app/admin/configuration/configuration.module.ts b/borestop/src/main/webapp/app/admin/configuration/configuration.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..ab8f02c8c9e0b56662875844cc4cb24cd163c895 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/configuration/configuration.module.ts @@ -0,0 +1,13 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { BorestopSharedModule } from 'app/shared/shared.module'; + +import { ConfigurationComponent } from './configuration.component'; + +import { configurationRoute } from './configuration.route'; + +@NgModule({ + imports: [BorestopSharedModule, RouterModule.forChild([configurationRoute])], + declarations: [ConfigurationComponent] +}) +export class ConfigurationModule {} diff --git a/borestop/src/main/webapp/app/admin/configuration/configuration.route.ts b/borestop/src/main/webapp/app/admin/configuration/configuration.route.ts new file mode 100644 index 0000000000000000000000000000000000000000..17238c9312ecf3ee46bb28a819d1acc057dd6e84 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/configuration/configuration.route.ts @@ -0,0 +1,11 @@ +import { Route } from '@angular/router'; + +import { ConfigurationComponent } from './configuration.component'; + +export const configurationRoute: Route = { + path: '', + component: ConfigurationComponent, + data: { + pageTitle: 'configuration.title' + } +}; diff --git a/borestop/src/main/webapp/app/admin/configuration/configuration.service.ts b/borestop/src/main/webapp/app/admin/configuration/configuration.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..69ea43a0408d09fb6884ec368c3310a7100ba2cb --- /dev/null +++ b/borestop/src/main/webapp/app/admin/configuration/configuration.service.ts @@ -0,0 +1,68 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + +import { SERVER_API_URL } from 'app/app.constants'; + +export interface ConfigProps { + contexts: Contexts; +} + +export interface Contexts { + [key: string]: Context; +} + +export interface Context { + beans: Beans; + parentId?: any; +} + +export interface Beans { + [key: string]: Bean; +} + +export interface Bean { + prefix: string; + properties: any; +} + +export interface Env { + activeProfiles?: string[]; + propertySources: PropertySource[]; +} + +export interface PropertySource { + name: string; + properties: Properties; +} + +export interface Properties { + [key: string]: Property; +} + +export interface Property { + value: string; + origin?: string; +} + +@Injectable({ providedIn: 'root' }) +export class ConfigurationService { + constructor(private http: HttpClient) {} + + getBeans(): Observable<Bean[]> { + return this.http.get<ConfigProps>(SERVER_API_URL + 'management/configprops').pipe( + map(configProps => + Object.values( + Object.values(configProps.contexts) + .map(context => context.beans) + .reduce((allBeans: Beans, contextBeans: Beans) => ({ ...allBeans, ...contextBeans })) + ) + ) + ); + } + + getPropertySources(): Observable<PropertySource[]> { + return this.http.get<Env>(SERVER_API_URL + 'management/env').pipe(map(env => env.propertySources)); + } +} diff --git a/borestop/src/main/webapp/app/admin/docs/docs.component.html b/borestop/src/main/webapp/app/admin/docs/docs.component.html new file mode 100644 index 0000000000000000000000000000000000000000..9d1600b88ccbadb1a5bf544fc14697b0d2a2962c --- /dev/null +++ b/borestop/src/main/webapp/app/admin/docs/docs.component.html @@ -0,0 +1,2 @@ +<iframe src="swagger-ui/index.html" width="100%" height="900" seamless + target="_top" title="Swagger UI" class="border-0"></iframe> diff --git a/borestop/src/main/webapp/app/admin/docs/docs.component.ts b/borestop/src/main/webapp/app/admin/docs/docs.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..8942f1a4594b1a60d6e56d43cbc84dfaeb90305c --- /dev/null +++ b/borestop/src/main/webapp/app/admin/docs/docs.component.ts @@ -0,0 +1,8 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'jhi-docs', + templateUrl: './docs.component.html', + styleUrls: ['docs.scss'] +}) +export class DocsComponent {} diff --git a/borestop/src/main/webapp/app/admin/docs/docs.module.ts b/borestop/src/main/webapp/app/admin/docs/docs.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..0ddab0ba0946058ee28d0b6374f45b86a0179f95 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/docs/docs.module.ts @@ -0,0 +1,13 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { BorestopSharedModule } from 'app/shared/shared.module'; + +import { DocsComponent } from './docs.component'; + +import { docsRoute } from './docs.route'; + +@NgModule({ + imports: [BorestopSharedModule, RouterModule.forChild([docsRoute])], + declarations: [DocsComponent] +}) +export class DocsModule {} diff --git a/borestop/src/main/webapp/app/admin/docs/docs.route.ts b/borestop/src/main/webapp/app/admin/docs/docs.route.ts new file mode 100644 index 0000000000000000000000000000000000000000..b2aead9d5fef3849cc0a0dc4d9aaadbcbbb769a4 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/docs/docs.route.ts @@ -0,0 +1,11 @@ +import { Route } from '@angular/router'; + +import { DocsComponent } from './docs.component'; + +export const docsRoute: Route = { + path: '', + component: DocsComponent, + data: { + pageTitle: 'global.menu.admin.apidocs' + } +}; diff --git a/borestop/src/main/webapp/app/admin/docs/docs.scss b/borestop/src/main/webapp/app/admin/docs/docs.scss new file mode 100644 index 0000000000000000000000000000000000000000..541c3d79be70938e96e7ab9d36815538f71af1cc --- /dev/null +++ b/borestop/src/main/webapp/app/admin/docs/docs.scss @@ -0,0 +1,6 @@ +@import '~bootstrap/scss/functions'; +@import '~bootstrap/scss/variables'; + +iframe { + background: white; +} diff --git a/borestop/src/main/webapp/app/admin/health/health-modal.component.html b/borestop/src/main/webapp/app/admin/health/health-modal.component.html new file mode 100644 index 0000000000000000000000000000000000000000..5556f47d3c9475db4ab64427e4c013783f8c7316 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/health/health-modal.component.html @@ -0,0 +1,36 @@ +<div class="modal-header"> + <h4 class="modal-title" id="showHealthLabel" *ngIf="health"> + {{ 'health.indicator.' + health.key | translate }} + </h4> + + <button aria-label="Close" data-dismiss="modal" class="close" type="button" (click)="dismiss()"> + <span aria-hidden="true">×</span> + </button> +</div> + +<div class="modal-body pad"> + <div *ngIf="health"> + <h5 jhiTranslate="health.details.properties">Properties</h5> + + <div class="table-responsive"> + <table class="table table-striped" aria-describedby="showHealthLabel"> + <thead> + <tr> + <th scope="col" class="text-left" jhiTranslate="health.details.name">Name</th> + <th scope="col" class="text-left" jhiTranslate="health.details.value">Value</th> + </tr> + </thead> + <tbody> + <tr *ngFor="let healthDetail of health.value.details | keys"> + <td class="text-left">{{ healthDetail.key }}</td> + <td class="text-left">{{ readableValue(healthDetail.value) }}</td> + </tr> + </tbody> + </table> + </div> + </div> +</div> + +<div class="modal-footer"> + <button data-dismiss="modal" class="btn btn-secondary float-left" type="button" (click)="dismiss()">Done</button> +</div> diff --git a/borestop/src/main/webapp/app/admin/health/health-modal.component.ts b/borestop/src/main/webapp/app/admin/health/health-modal.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..54f360f95c740b6539f5aaab637a2375c5384876 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/health/health-modal.component.ts @@ -0,0 +1,37 @@ +import { Component } from '@angular/core'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { HealthKey, HealthDetails } from './health.service'; + +@Component({ + selector: 'jhi-health-modal', + templateUrl: './health-modal.component.html' +}) +export class HealthModalComponent { + health?: { key: HealthKey; value: HealthDetails }; + + constructor(public activeModal: NgbActiveModal) {} + + readableValue(value: any): string { + if (this.health && this.health.key === 'diskSpace') { + // Should display storage space in an human readable unit + const val = value / 1073741824; + if (val > 1) { + // Value + return val.toFixed(2) + ' GB'; + } else { + return (value / 1048576).toFixed(2) + ' MB'; + } + } + + if (typeof value === 'object') { + return JSON.stringify(value); + } else { + return value.toString(); + } + } + + dismiss(): void { + this.activeModal.dismiss(); + } +} diff --git a/borestop/src/main/webapp/app/admin/health/health.component.html b/borestop/src/main/webapp/app/admin/health/health.component.html new file mode 100644 index 0000000000000000000000000000000000000000..b686fcbb2c62a80fcdb049bc512fd6c3f61d0e27 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/health/health.component.html @@ -0,0 +1,38 @@ +<div> + <h2> + <span id="health-page-heading" jhiTranslate="health.title">Health Checks</span> + + <button class="btn btn-primary float-right" (click)="refresh()"> + <fa-icon icon="sync"></fa-icon> <span jhiTranslate="health.refresh.button">Refresh</span> + </button> + </h2> + + <div class="table-responsive"> + <table id="healthCheck" class="table table-striped" aria-describedby="health-page-heading"> + <thead> + <tr> + <th scope="col" jhiTranslate="health.table.service">Service Name</th> + <th scope="col" class="text-center" jhiTranslate="health.table.status">Status</th> + <th scope="col" class="text-center" jhiTranslate="health.details.details">Details</th> + </tr> + </thead> + <tbody *ngIf="health"> + <tr *ngFor="let componentHealth of health.components | keys"> + <td> + {{ 'health.indicator.' + componentHealth.key | translate }} + </td> + <td class="text-center"> + <span class="badge" [ngClass]="getBadgeClass(componentHealth.value.status)" jhiTranslate="{{ 'health.status.' + componentHealth.value.status }}"> + {{ componentHealth.value.status }} + </span> + </td> + <td class="text-center"> + <a class="hand" (click)="showHealth(componentHealth)" *ngIf="componentHealth.value.details"> + <fa-icon icon="eye"></fa-icon> + </a> + </td> + </tr> + </tbody> + </table> + </div> +</div> diff --git a/borestop/src/main/webapp/app/admin/health/health.component.ts b/borestop/src/main/webapp/app/admin/health/health.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..d33b6322f02b27a0706690a39c7f1fe4dc12c25f --- /dev/null +++ b/borestop/src/main/webapp/app/admin/health/health.component.ts @@ -0,0 +1,44 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpErrorResponse } from '@angular/common/http'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; + +import { HealthService, HealthStatus, Health, HealthKey, HealthDetails } from './health.service'; +import { HealthModalComponent } from './health-modal.component'; + +@Component({ + selector: 'jhi-health', + templateUrl: './health.component.html' +}) +export class HealthComponent implements OnInit { + health?: Health; + + constructor(private modalService: NgbModal, private healthService: HealthService) {} + + ngOnInit(): void { + this.refresh(); + } + + getBadgeClass(statusState: HealthStatus): string { + if (statusState === 'UP') { + return 'badge-success'; + } else { + return 'badge-danger'; + } + } + + refresh(): void { + this.healthService.checkHealth().subscribe( + health => (this.health = health), + (error: HttpErrorResponse) => { + if (error.status === 503) { + this.health = error.error; + } + } + ); + } + + showHealth(health: { key: HealthKey; value: HealthDetails }): void { + const modalRef = this.modalService.open(HealthModalComponent); + modalRef.componentInstance.health = health; + } +} diff --git a/borestop/src/main/webapp/app/admin/health/health.module.ts b/borestop/src/main/webapp/app/admin/health/health.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..24fdd6b34556c77235c11f15248cffa9aeca9739 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/health/health.module.ts @@ -0,0 +1,15 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { BorestopSharedModule } from 'app/shared/shared.module'; + +import { HealthComponent } from './health.component'; +import { HealthModalComponent } from './health-modal.component'; + +import { healthRoute } from './health.route'; + +@NgModule({ + imports: [BorestopSharedModule, RouterModule.forChild([healthRoute])], + declarations: [HealthComponent, HealthModalComponent], + entryComponents: [HealthModalComponent] +}) +export class HealthModule {} diff --git a/borestop/src/main/webapp/app/admin/health/health.route.ts b/borestop/src/main/webapp/app/admin/health/health.route.ts new file mode 100644 index 0000000000000000000000000000000000000000..1055dcc0733f8a2af297ff41946c41b74613093b --- /dev/null +++ b/borestop/src/main/webapp/app/admin/health/health.route.ts @@ -0,0 +1,11 @@ +import { Route } from '@angular/router'; + +import { HealthComponent } from './health.component'; + +export const healthRoute: Route = { + path: '', + component: HealthComponent, + data: { + pageTitle: 'health.title' + } +}; diff --git a/borestop/src/main/webapp/app/admin/health/health.service.ts b/borestop/src/main/webapp/app/admin/health/health.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..25005f64aca274c49cd182226bcac1aaf18658a5 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/health/health.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { SERVER_API_URL } from 'app/app.constants'; + +export type HealthStatus = 'UP' | 'DOWN' | 'UNKNOWN' | 'OUT_OF_SERVICE'; + +export type HealthKey = 'diskSpace' | 'mail' | 'ping' | 'db'; + +export interface Health { + status: HealthStatus; + components: { + [key in HealthKey]?: HealthDetails; + }; +} + +export interface HealthDetails { + status: HealthStatus; + details: any; +} + +@Injectable({ providedIn: 'root' }) +export class HealthService { + constructor(private http: HttpClient) {} + + checkHealth(): Observable<Health> { + return this.http.get<Health>(SERVER_API_URL + 'management/health'); + } +} diff --git a/borestop/src/main/webapp/app/admin/logs/log.model.ts b/borestop/src/main/webapp/app/admin/logs/log.model.ts new file mode 100644 index 0000000000000000000000000000000000000000..83f2e154a961d4aae3799eea827dfe5ac1ee5f39 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/logs/log.model.ts @@ -0,0 +1,15 @@ +export type Level = 'TRACE' | 'DEBUG' | 'INFO' | 'WARN' | 'ERROR' | 'OFF'; + +export interface Logger { + configuredLevel: Level | null; + effectiveLevel: Level; +} + +export interface LoggersResponse { + levels: Level[]; + loggers: { [key: string]: Logger }; +} + +export class Log { + constructor(public name: string, public level: Level) {} +} diff --git a/borestop/src/main/webapp/app/admin/logs/logs.component.html b/borestop/src/main/webapp/app/admin/logs/logs.component.html new file mode 100644 index 0000000000000000000000000000000000000000..b0473e3a9df4a099cad7333aba266dccd04edabc --- /dev/null +++ b/borestop/src/main/webapp/app/admin/logs/logs.component.html @@ -0,0 +1,28 @@ +<div class="table-responsive" *ngIf="loggers"> + <h2 id="logs-page-heading" jhiTranslate="logs.title">Logs</h2> + + <p jhiTranslate="logs.nbloggers" [translateValues]="{ total: loggers.length }">There are {{ loggers.length }} loggers.</p> + + <span jhiTranslate="logs.filter">Filter</span> <input type="text" [(ngModel)]="filter" class="form-control"> + + <table class="table table-sm table-striped table-bordered" aria-describedby="logs-page-heading"> + <thead> + <tr title="click to order"> + <th scope="col" (click)="orderProp = 'name'; reverse=!reverse"><span jhiTranslate="logs.table.name">Name</span></th> + <th scope="col" (click)="orderProp = 'level'; reverse=!reverse"><span jhiTranslate="logs.table.level">Level</span></th> + </tr> + </thead> + + <tr *ngFor="let logger of (loggers | pureFilter:filter:'name' | orderBy:orderProp:reverse)"> + <td><small>{{ logger.name | slice:0:140 }}</small></td> + <td> + <button (click)="changeLevel(logger.name, 'TRACE')" [ngClass]="(logger.level=='TRACE') ? 'btn-primary' : 'btn-light'" class="btn btn-sm">TRACE</button> + <button (click)="changeLevel(logger.name, 'DEBUG')" [ngClass]="(logger.level=='DEBUG') ? 'btn-success' : 'btn-light'" class="btn btn-sm">DEBUG</button> + <button (click)="changeLevel(logger.name, 'INFO')" [ngClass]="(logger.level=='INFO') ? 'btn-info' : 'btn-light'" class="btn btn-sm">INFO</button> + <button (click)="changeLevel(logger.name, 'WARN')" [ngClass]="(logger.level=='WARN') ? 'btn-warning' : 'btn-light'" class="btn btn-sm">WARN</button> + <button (click)="changeLevel(logger.name, 'ERROR')" [ngClass]="(logger.level=='ERROR') ? 'btn-danger' : 'btn-light'" class="btn btn-sm">ERROR</button> + <button (click)="changeLevel(logger.name, 'OFF')" [ngClass]="(logger.level=='OFF') ? 'btn-secondary' : 'btn-light'" class="btn btn-sm">OFF</button> + </td> + </tr> + </table> +</div> diff --git a/borestop/src/main/webapp/app/admin/logs/logs.component.ts b/borestop/src/main/webapp/app/admin/logs/logs.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..13b7102ce771b4f428a91220028a5083a9a1f04a --- /dev/null +++ b/borestop/src/main/webapp/app/admin/logs/logs.component.ts @@ -0,0 +1,34 @@ +import { Component, OnInit } from '@angular/core'; + +import { Log, LoggersResponse, Logger, Level } from './log.model'; +import { LogsService } from './logs.service'; + +@Component({ + selector: 'jhi-logs', + templateUrl: './logs.component.html' +}) +export class LogsComponent implements OnInit { + loggers?: Log[]; + filter = ''; + orderProp = 'name'; + reverse = false; + + constructor(private logsService: LogsService) {} + + ngOnInit(): void { + this.findAndExtractLoggers(); + } + + changeLevel(name: string, level: Level): void { + this.logsService.changeLevel(name, level).subscribe(() => this.findAndExtractLoggers()); + } + + private findAndExtractLoggers(): void { + this.logsService + .findAll() + .subscribe( + (response: LoggersResponse) => + (this.loggers = Object.entries(response.loggers).map((logger: [string, Logger]) => new Log(logger[0], logger[1].effectiveLevel))) + ); + } +} diff --git a/borestop/src/main/webapp/app/admin/logs/logs.module.ts b/borestop/src/main/webapp/app/admin/logs/logs.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..ba914e1026bffd26b1a2d1e203469b291da2b59e --- /dev/null +++ b/borestop/src/main/webapp/app/admin/logs/logs.module.ts @@ -0,0 +1,13 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { BorestopSharedModule } from 'app/shared/shared.module'; + +import { LogsComponent } from './logs.component'; + +import { logsRoute } from './logs.route'; + +@NgModule({ + imports: [BorestopSharedModule, RouterModule.forChild([logsRoute])], + declarations: [LogsComponent] +}) +export class LogsModule {} diff --git a/borestop/src/main/webapp/app/admin/logs/logs.route.ts b/borestop/src/main/webapp/app/admin/logs/logs.route.ts new file mode 100644 index 0000000000000000000000000000000000000000..d1cf0241393e6fbcb0f8ac5b948b3b7274f4d2ed --- /dev/null +++ b/borestop/src/main/webapp/app/admin/logs/logs.route.ts @@ -0,0 +1,11 @@ +import { Route } from '@angular/router'; + +import { LogsComponent } from './logs.component'; + +export const logsRoute: Route = { + path: '', + component: LogsComponent, + data: { + pageTitle: 'logs.title' + } +}; diff --git a/borestop/src/main/webapp/app/admin/logs/logs.service.ts b/borestop/src/main/webapp/app/admin/logs/logs.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..dc9956deea77b9033072dc409a83546e7678e43d --- /dev/null +++ b/borestop/src/main/webapp/app/admin/logs/logs.service.ts @@ -0,0 +1,19 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { SERVER_API_URL } from 'app/app.constants'; +import { LoggersResponse, Level } from './log.model'; + +@Injectable({ providedIn: 'root' }) +export class LogsService { + constructor(private http: HttpClient) {} + + changeLevel(name: string, configuredLevel: Level): Observable<{}> { + return this.http.post(SERVER_API_URL + 'management/loggers/' + name, { configuredLevel }); + } + + findAll(): Observable<LoggersResponse> { + return this.http.get<LoggersResponse>(SERVER_API_URL + 'management/loggers'); + } +} diff --git a/borestop/src/main/webapp/app/admin/metrics/metrics.component.html b/borestop/src/main/webapp/app/admin/metrics/metrics.component.html new file mode 100644 index 0000000000000000000000000000000000000000..731a7a9ec914f5cdc66060369754d65f743d981a --- /dev/null +++ b/borestop/src/main/webapp/app/admin/metrics/metrics.component.html @@ -0,0 +1,65 @@ +<div> + <h2> + <span id="metrics-page-heading" jhiTranslate="metrics.title">Application Metrics</span> + + <button class="btn btn-primary float-right" (click)="refresh()"> + <fa-icon icon="sync"></fa-icon> <span jhiTranslate="metrics.refresh.button">Refresh</span> + </button> + </h2> + + <h3 jhiTranslate="metrics.jvm.title">JVM Metrics</h3> + + <div class="row" *ngIf="metrics && !updatingMetrics"> + <jhi-jvm-memory + class="col-md-4" + [updating]="updatingMetrics" + [jvmMemoryMetrics]="metrics.jvm"> + </jhi-jvm-memory> + + <jhi-jvm-threads + class="col-md-4" + [threadData]="threads"> + </jhi-jvm-threads> + + <jhi-metrics-system + class="col-md-4" + [updating]="updatingMetrics" + [systemMetrics]="metrics.processMetrics"> + </jhi-metrics-system> + </div> + + <div *ngIf="metrics && metricsKeyExists('garbageCollector')"> + <h3 jhiTranslate="metrics.jvm.gc.title">Garbage collector statistics</h3> + + <jhi-metrics-garbagecollector + [updating]="updatingMetrics" + [garbageCollectorMetrics]="metrics.garbageCollector"> + </jhi-metrics-garbagecollector> + </div> + + <div class="well well-lg" *ngIf="updatingMetrics" jhiTranslate="metrics.updating">Updating...</div> + + <jhi-metrics-request + *ngIf="metrics && metricsKeyExists('http.server.requests')" + [updating]="updatingMetrics" + [requestMetrics]="metrics['http.server.requests']"> + </jhi-metrics-request> + + <jhi-metrics-endpoints-requests + *ngIf="metrics && metricsKeyExists('services')" + [updating]="updatingMetrics" + [endpointsRequestsMetrics]="metrics.services"> + </jhi-metrics-endpoints-requests> + + <jhi-metrics-cache + *ngIf="metrics && metricsKeyExists('cache')" + [updating]="updatingMetrics" + [cacheMetrics]="metrics.cache"> + </jhi-metrics-cache> + + <jhi-metrics-datasource + *ngIf="metrics && metricsKeyExistsAndObjectNotEmpty('databases')" + [updating]="updatingMetrics" + [datasourceMetrics]="metrics.databases"> + </jhi-metrics-datasource> +</div> diff --git a/borestop/src/main/webapp/app/admin/metrics/metrics.component.ts b/borestop/src/main/webapp/app/admin/metrics/metrics.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..130e65d635e434581414a367024742bb5f1769e9 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/metrics/metrics.component.ts @@ -0,0 +1,47 @@ +import { Component, OnInit, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core'; +import { flatMap } from 'rxjs/operators'; + +import { MetricsService, Metrics, MetricsKey, ThreadDump, Thread } from './metrics.service'; + +@Component({ + selector: 'jhi-metrics', + templateUrl: './metrics.component.html', + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class MetricsComponent implements OnInit { + metrics?: Metrics; + threads?: Thread[]; + updatingMetrics = true; + + constructor(private metricsService: MetricsService, private changeDetector: ChangeDetectorRef) {} + + ngOnInit(): void { + this.refresh(); + } + + refresh(): void { + this.updatingMetrics = true; + this.metricsService + .getMetrics() + .pipe( + flatMap( + () => this.metricsService.threadDump(), + (metrics: Metrics, threadDump: ThreadDump) => { + this.metrics = metrics; + this.threads = threadDump.threads; + this.updatingMetrics = false; + this.changeDetector.detectChanges(); + } + ) + ) + .subscribe(); + } + + metricsKeyExists(key: MetricsKey): boolean { + return this.metrics && this.metrics[key]; + } + + metricsKeyExistsAndObjectNotEmpty(key: MetricsKey): boolean { + return this.metrics && this.metrics[key] && JSON.stringify(this.metrics[key]) !== '{}'; + } +} diff --git a/borestop/src/main/webapp/app/admin/metrics/metrics.module.ts b/borestop/src/main/webapp/app/admin/metrics/metrics.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..9cf7be4cd6c43e3992bbdcac8b063df553767260 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/metrics/metrics.module.ts @@ -0,0 +1,13 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { BorestopSharedModule } from 'app/shared/shared.module'; + +import { MetricsComponent } from './metrics.component'; + +import { metricsRoute } from './metrics.route'; + +@NgModule({ + imports: [BorestopSharedModule, RouterModule.forChild([metricsRoute])], + declarations: [MetricsComponent] +}) +export class MetricsModule {} diff --git a/borestop/src/main/webapp/app/admin/metrics/metrics.route.ts b/borestop/src/main/webapp/app/admin/metrics/metrics.route.ts new file mode 100644 index 0000000000000000000000000000000000000000..f85fd61d83b05a6353d53ce108d8eed7bc82b2d0 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/metrics/metrics.route.ts @@ -0,0 +1,11 @@ +import { Route } from '@angular/router'; + +import { MetricsComponent } from './metrics.component'; + +export const metricsRoute: Route = { + path: '', + component: MetricsComponent, + data: { + pageTitle: 'metrics.title' + } +}; diff --git a/borestop/src/main/webapp/app/admin/metrics/metrics.service.ts b/borestop/src/main/webapp/app/admin/metrics/metrics.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..a8d0c99a7729f9303c97585bf73efd20f34b48e7 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/metrics/metrics.service.ts @@ -0,0 +1,23 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { SERVER_API_URL } from 'app/app.constants'; + +export type MetricsKey = 'jvm' | 'http.server.requests' | 'cache' | 'services' | 'databases' | 'garbageCollector' | 'processMetrics'; +export type Metrics = { [key in MetricsKey]: any }; +export type Thread = any; +export type ThreadDump = { threads: Thread[] }; + +@Injectable({ providedIn: 'root' }) +export class MetricsService { + constructor(private http: HttpClient) {} + + getMetrics(): Observable<Metrics> { + return this.http.get<Metrics>(SERVER_API_URL + 'management/jhimetrics'); + } + + threadDump(): Observable<ThreadDump> { + return this.http.get<ThreadDump>(SERVER_API_URL + 'management/threaddump'); + } +} diff --git a/borestop/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.html b/borestop/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.html new file mode 100644 index 0000000000000000000000000000000000000000..ad7d3cd421344c9fe5d9375e62102c40f28d777c --- /dev/null +++ b/borestop/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.html @@ -0,0 +1,23 @@ +<form *ngIf="user" name="deleteForm" (ngSubmit)="confirmDelete(user?.login!)"> + <div class="modal-header"> + <h4 class="modal-title" jhiTranslate="entity.delete.title">Confirm delete operation</h4> + + <button type="button" class="close" data-dismiss="modal" aria-hidden="true" (click)="cancel()">×</button> + </div> + + <div class="modal-body"> + <jhi-alert-error></jhi-alert-error> + + <p jhiTranslate="userManagement.delete.question" [translateValues]="{ login: user.login }">Are you sure you want to delete this User?</p> + </div> + + <div class="modal-footer"> + <button type="button" class="btn btn-secondary" data-dismiss="modal" (click)="cancel()"> + <fa-icon icon="ban"></fa-icon> <span jhiTranslate="entity.action.cancel">Cancel</span> + </button> + + <button type="submit" class="btn btn-danger"> + <fa-icon icon="times"></fa-icon> <span jhiTranslate="entity.action.delete">Delete</span> + </button> + </div> +</form> diff --git a/borestop/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.ts b/borestop/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..fdda5fb5a24b8d1237b2555e9f6109e99d6b2c08 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.ts @@ -0,0 +1,27 @@ +import { Component } from '@angular/core'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; +import { JhiEventManager } from 'ng-jhipster'; + +import { User } from 'app/core/user/user.model'; +import { UserService } from 'app/core/user/user.service'; + +@Component({ + selector: 'jhi-user-mgmt-delete-dialog', + templateUrl: './user-management-delete-dialog.component.html' +}) +export class UserManagementDeleteDialogComponent { + user?: User; + + constructor(private userService: UserService, public activeModal: NgbActiveModal, private eventManager: JhiEventManager) {} + + cancel(): void { + this.activeModal.dismiss(); + } + + confirmDelete(login: string): void { + this.userService.delete(login).subscribe(() => { + this.eventManager.broadcast('userListModification'); + this.activeModal.close(); + }); + } +} diff --git a/borestop/src/main/webapp/app/admin/user-management/user-management-detail.component.html b/borestop/src/main/webapp/app/admin/user-management/user-management-detail.component.html new file mode 100644 index 0000000000000000000000000000000000000000..7fda1fe36e8087ff83b06959d71a76f00ce86781 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/user-management/user-management-detail.component.html @@ -0,0 +1,58 @@ +<div class="row justify-content-center"> + <div class="col-8"> + <div *ngIf="user"> + <h2> + <span jhiTranslate="userManagement.detail.title">User</span> [<b>{{ user.login }}</b>] + </h2> + + <dl class="row-md jh-entity-details"> + <dt><span jhiTranslate="userManagement.login">Login</span></dt> + <dd> + <span>{{ user.login }}</span> + <jhi-boolean + [value]="user.activated ? true : false" + [textTrue]="'userManagement.activated' | translate" + [textFalse]="'userManagement.deactivated' | translate"> + </jhi-boolean> + </dd> + + <dt><span jhiTranslate="userManagement.firstName">First Name</span></dt> + <dd>{{ user.firstName }}</dd> + + <dt><span jhiTranslate="userManagement.lastName">Last Name</span></dt> + <dd>{{ user.lastName }}</dd> + + <dt><span jhiTranslate="userManagement.email">Email</span></dt> + <dd>{{ user.email }}</dd> + + <dt><span jhiTranslate="userManagement.langKey">Lang Key</span></dt> + <dd>{{ user.langKey }}</dd> + + <dt><span jhiTranslate="userManagement.createdBy">Created By</span></dt> + <dd>{{ user.createdBy }}</dd> + + <dt><span jhiTranslate="userManagement.createdDate">Created Date</span></dt> + <dd>{{ user.createdDate | date:'dd/MM/yy HH:mm' }}</dd> + + <dt><span jhiTranslate="userManagement.lastModifiedBy">Last Modified By</span></dt> + <dd>{{ user.lastModifiedBy }}</dd> + + <dt><span jhiTranslate="userManagement.lastModifiedDate">Last Modified Date</span></dt> + <dd>{{ user.lastModifiedDate | date:'dd/MM/yy HH:mm' }}</dd> + + <dt><span jhiTranslate="userManagement.profiles">Profiles</span></dt> + <dd> + <ul class="list-unstyled"> + <li *ngFor="let authority of user.authorities"> + <span class="badge badge-info">{{ authority }}</span> + </li> + </ul> + </dd> + </dl> + + <button type="submit" routerLink="../../" class="btn btn-info"> + <fa-icon icon="arrow-left"></fa-icon> <span jhiTranslate="entity.action.back">Back</span> + </button> + </div> + </div> +</div> diff --git a/borestop/src/main/webapp/app/admin/user-management/user-management-detail.component.ts b/borestop/src/main/webapp/app/admin/user-management/user-management-detail.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..19cc78a32cb2f43f117c6af078e5ea3eac0150e7 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/user-management/user-management-detail.component.ts @@ -0,0 +1,18 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; + +import { User } from 'app/core/user/user.model'; + +@Component({ + selector: 'jhi-user-mgmt-detail', + templateUrl: './user-management-detail.component.html' +}) +export class UserManagementDetailComponent implements OnInit { + user: User | null = null; + + constructor(private route: ActivatedRoute) {} + + ngOnInit(): void { + this.route.data.subscribe(({ user }) => (this.user = user)); + } +} diff --git a/borestop/src/main/webapp/app/admin/user-management/user-management-update.component.html b/borestop/src/main/webapp/app/admin/user-management/user-management-update.component.html new file mode 100644 index 0000000000000000000000000000000000000000..41647a9a7771231186b5573c37757ed86ac64b78 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/user-management/user-management-update.component.html @@ -0,0 +1,140 @@ +<div class="row justify-content-center"> + <div class="col-8"> + <form name="editForm" role="form" novalidate (ngSubmit)="save()" [formGroup]="editForm"> + <h2 id="myUserLabel" jhiTranslate="userManagement.home.createOrEditLabel"> + Create or edit a User + </h2> + + <div *ngIf="user"> + <jhi-alert-error></jhi-alert-error> + + <div class="form-group" [hidden]="!user.id"> + <label jhiTranslate="global.field.id">ID</label> + <input type="text" class="form-control" name="id" formControlName="id" readonly> + </div> + + <div class="form-group"> + <label class="form-control-label" jhiTranslate="userManagement.login">Login</label> + <input type="text" class="form-control" name="login" + formControlName="login"> + + <div *ngIf="editForm.get('login')!.invalid && (editForm.get('login')!.dirty || editForm.get('login')!.touched)"> + <small class="form-text text-danger" + *ngIf="editForm.get('login')?.errors?.required" + jhiTranslate="entity.validation.required"> + This field is required. + </small> + + <small class="form-text text-danger" + *ngIf="editForm.get('login')?.errors?.maxlength" + jhiTranslate="entity.validation.maxlength" + [translateValues]="{ max: 50 }"> + This field cannot be longer than 50 characters. + </small> + + <small class="form-text text-danger" + *ngIf="editForm.get('login')?.errors?.pattern" + jhiTranslate="entity.validation.patternLogin"> + This field can only contain letters, digits and e-mail addresses. + </small> + </div> + </div> + + <div class="form-group"> + <label class="form-control-label" jhiTranslate="userManagement.firstName">First Name</label> + <input type="text" class="form-control" name="firstName" + formControlName="firstName"> + + <div *ngIf="editForm.get('firstName')!.invalid && (editForm.get('firstName')!.dirty || editForm.get('firstName')!.touched)"> + <small class="form-text text-danger" + *ngIf="editForm.get('firstName')?.errors?.maxlength" + jhiTranslate="entity.validation.maxlength" + [translateValues]="{ max: 50 }"> + This field cannot be longer than 50 characters. + </small> + </div> + </div> + + <div class="form-group"> + <label jhiTranslate="userManagement.lastName">Last Name</label> + <input type="text" class="form-control" name="lastName" + formControlName="lastName"> + + <div *ngIf="editForm.get('lastName')!.invalid && (editForm.get('lastName')!.dirty || editForm.get('lastName')!.touched)"> + <small class="form-text text-danger" + *ngIf="editForm.get('lastName')?.errors?.maxlength" + jhiTranslate="entity.validation.maxlength" + [translateValues]="{ max: 50 }"> + This field cannot be longer than 50 characters. + </small> + </div> + </div> + + <div class="form-group"> + <label class="form-control-label" jhiTranslate="userManagement.email">Email</label> + <input type="email" class="form-control" name="email" formControlName="email"> + + <div *ngIf="editForm.get('email')!.invalid && (editForm.get('email')!.dirty || editForm.get('email')!.touched)"> + <small class="form-text text-danger" + *ngIf="editForm.get('email')?.errors?.required" + jhiTranslate="entity.validation.required"> + This field is required. + </small> + + <small class="form-text text-danger" + *ngIf="editForm.get('email')?.errors?.maxlength" + jhiTranslate="entity.validation.maxlength" + [translateValues]="{ max: 100 }"> + This field cannot be longer than 100 characters. + </small> + + <small class="form-text text-danger" + *ngIf="editForm.get('email')?.errors?.minlength" + jhiTranslate="entity.validation.minlength" + [translateValues]="{ min: 5 }"> + This field is required to be at least 5 characters. + </small> + + <small class="form-text text-danger" + *ngIf="editForm.get('email')?.errors?.email" + jhiTranslate="global.messages.validate.email.invalid"> + Your email is invalid. + </small> + </div> + </div> + + <div class="form-check"> + <label class="form-check-label" for="activated"> + <input class="form-check-input" [attr.disabled]="user.id === undefined ? 'disabled' : null" + type="checkbox" id="activated" name="activated" formControlName="activated"> + <span jhiTranslate="userManagement.activated">Activated</span> + </label> + </div> + + <div class="form-group" *ngIf="languages && languages.length > 0"> + <label jhiTranslate="userManagement.langKey">Lang Key</label> + <select class="form-control" id="langKey" name="langKey" formControlName="langKey"> + <option *ngFor="let language of languages" [value]="language">{{ language | findLanguageFromKey }}</option> + </select> + </div> + + <div class="form-group"> + <label jhiTranslate="userManagement.profiles">Profiles</label> + <select class="form-control" multiple name="authority" formControlName="authorities"> + <option *ngFor="let authority of authorities" [value]="authority">{{ authority }}</option> + </select> + </div> + </div> + + <div *ngIf="user"> + <button type="button" class="btn btn-secondary" (click)="previousState()"> + <fa-icon icon="ban"></fa-icon> <span jhiTranslate="entity.action.cancel">Cancel</span> + </button> + + <button type="submit" [disabled]="editForm.invalid || isSaving" class="btn btn-primary"> + <fa-icon icon="save"></fa-icon> <span jhiTranslate="entity.action.save">Save</span> + </button> + </div> + </form> + </div> +</div> diff --git a/borestop/src/main/webapp/app/admin/user-management/user-management-update.component.ts b/borestop/src/main/webapp/app/admin/user-management/user-management-update.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..cefd387cb4ba64132922d4fda4bd6ef601ba829c --- /dev/null +++ b/borestop/src/main/webapp/app/admin/user-management/user-management-update.component.ts @@ -0,0 +1,106 @@ +import { Component, OnInit } from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; + +import { LANGUAGES } from 'app/core/language/language.constants'; +import { User } from 'app/core/user/user.model'; +import { UserService } from 'app/core/user/user.service'; + +@Component({ + selector: 'jhi-user-mgmt-update', + templateUrl: './user-management-update.component.html' +}) +export class UserManagementUpdateComponent implements OnInit { + user!: User; + languages = LANGUAGES; + authorities: string[] = []; + isSaving = false; + + editForm = this.fb.group({ + id: [], + login: [ + '', + [ + Validators.required, + Validators.minLength(1), + Validators.maxLength(50), + Validators.pattern('^[a-zA-Z0-9!$&*+=?^_`{|}~.-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$|^[_.@A-Za-z0-9-]+$') + ] + ], + firstName: ['', [Validators.maxLength(50)]], + lastName: ['', [Validators.maxLength(50)]], + email: ['', [Validators.minLength(5), Validators.maxLength(254), Validators.email]], + activated: [], + langKey: [], + authorities: [] + }); + + constructor(private userService: UserService, private route: ActivatedRoute, private fb: FormBuilder) {} + + ngOnInit(): void { + this.route.data.subscribe(({ user }) => { + if (user) { + this.user = user; + if (this.user.id === undefined) { + this.user.activated = true; + } + this.updateForm(user); + } + }); + this.userService.authorities().subscribe(authorities => { + this.authorities = authorities; + }); + } + + previousState(): void { + window.history.back(); + } + + save(): void { + this.isSaving = true; + this.updateUser(this.user); + if (this.user.id !== undefined) { + this.userService.update(this.user).subscribe( + () => this.onSaveSuccess(), + () => this.onSaveError() + ); + } else { + this.userService.create(this.user).subscribe( + () => this.onSaveSuccess(), + () => this.onSaveError() + ); + } + } + + private updateForm(user: User): void { + this.editForm.patchValue({ + id: user.id, + login: user.login, + firstName: user.firstName, + lastName: user.lastName, + email: user.email, + activated: user.activated, + langKey: user.langKey, + authorities: user.authorities + }); + } + + private updateUser(user: User): void { + user.login = this.editForm.get(['login'])!.value; + user.firstName = this.editForm.get(['firstName'])!.value; + user.lastName = this.editForm.get(['lastName'])!.value; + user.email = this.editForm.get(['email'])!.value; + user.activated = this.editForm.get(['activated'])!.value; + user.langKey = this.editForm.get(['langKey'])!.value; + user.authorities = this.editForm.get(['authorities'])!.value; + } + + private onSaveSuccess(): void { + this.isSaving = false; + this.previousState(); + } + + private onSaveError(): void { + this.isSaving = false; + } +} diff --git a/borestop/src/main/webapp/app/admin/user-management/user-management.component.html b/borestop/src/main/webapp/app/admin/user-management/user-management.component.html new file mode 100644 index 0000000000000000000000000000000000000000..751712b69cf04f98220362f6f5d958b81b0e4d29 --- /dev/null +++ b/borestop/src/main/webapp/app/admin/user-management/user-management.component.html @@ -0,0 +1,88 @@ +<div> + <h2> + <span id="user-management-page-heading" jhiTranslate="userManagement.home.title">Users</span> + + <button class="btn btn-primary float-right jh-create-entity" [routerLink]="['./new']"> + <fa-icon icon="plus"></fa-icon> <span jhiTranslate="userManagement.home.createLabel">Create a new User</span> + </button> + </h2> + + <jhi-alert-error></jhi-alert-error> + + <jhi-alert></jhi-alert> + + <div class="table-responsive" *ngIf="users"> + <table class="table table-striped" aria-describedby="user-management-page-heading"> + <thead> + <tr jhiSort [(predicate)]="predicate" [(ascending)]="ascending" [callback]="transition.bind(this)"> + <th scope="col" jhiSortBy="id"><span jhiTranslate="global.field.id">ID</span> <fa-icon icon="sort"></fa-icon></th> + <th scope="col" jhiSortBy="login"><span jhiTranslate="userManagement.login">Login</span> <fa-icon icon="sort"></fa-icon></th> + <th scope="col" jhiSortBy="email"><span jhiTranslate="userManagement.email">Email</span> <fa-icon icon="sort"></fa-icon></th> + <th scope="col"></th> + <th scope="col" jhiSortBy="langKey"> <span jhiTranslate="userManagement.langKey">Lang Key</span> <fa-icon icon="sort"></fa-icon></th> + <th scope="col"><span jhiTranslate="userManagement.profiles">Profiles</span></th> + <th scope="col" jhiSortBy="createdDate"><span jhiTranslate="userManagement.createdDate">Created Date</span> <fa-icon icon="sort"></fa-icon></th> + <th scope="col" jhiSortBy="lastModifiedBy"><span jhiTranslate="userManagement.lastModifiedBy">Last Modified By</span> <fa-icon icon="sort"></fa-icon></th> + <th scope="col" jhiSortBy="lastModifiedDate"><span jhiTranslate="userManagement.lastModifiedDate">Last Modified Date</span> <fa-icon icon="sort"></fa-icon></th> + <th scope="col"></th> + </tr> + </thead> + <tbody *ngIf="users"> + <tr *ngFor="let user of users; trackBy: trackIdentity"> + <td><a [routerLink]="['./', user.login, 'view']">{{ user.id }}</a></td> + <td>{{ user.login }}</td> + <td>{{ user.email }}</td> + <td> + <button class="btn btn-danger btn-sm" (click)="setActive(user, true)" *ngIf="!user.activated" + jhiTranslate="userManagement.deactivated">Deactivated</button> + <button class="btn btn-success btn-sm" (click)="setActive(user, false)" *ngIf="user.activated" + [disabled]="!currentAccount || currentAccount.login === user.login" jhiTranslate="userManagement.activated">Activated</button> + </td> + <td>{{ user.langKey }}</td> + <td> + <div *ngFor="let authority of user.authorities"> + <span class="badge badge-info">{{ authority }}</span> + </div> + </td> + <td>{{ user.createdDate | date:'dd/MM/yy HH:mm' }}</td> + <td>{{ user.lastModifiedBy }}</td> + <td>{{ user.lastModifiedDate | date:'dd/MM/yy HH:mm' }}</td> + <td class="text-right"> + <div class="btn-group"> + <button type="submit" + [routerLink]="['./', user.login, 'view']" + class="btn btn-info btn-sm"> + <fa-icon icon="eye"></fa-icon> + <span class="d-none d-md-inline" jhiTranslate="entity.action.view">View</span> + </button> + + <button type="submit" + [routerLink]="['./', user.login, 'edit']" + queryParamsHandling="merge" + class="btn btn-primary btn-sm"> + <fa-icon icon="pencil-alt"></fa-icon> + <span class="d-none d-md-inline" jhiTranslate="entity.action.edit">Edit</span> + </button> + + <button type="button" (click)="deleteUser(user)" + class="btn btn-danger btn-sm" [disabled]="!currentAccount || currentAccount.login === user.login"> + <fa-icon icon="times"></fa-icon> + <span class="d-none d-md-inline" jhiTranslate="entity.action.delete">Delete</span> + </button> + </div> + </td> + </tr> + </tbody> + </table> + </div> + + <div *ngIf="users"> + <div class="row justify-content-center"> + <jhi-item-count [page]="page" [total]="totalItems" [itemsPerPage]="itemsPerPage"></jhi-item-count> + </div> + + <div class="row justify-content-center"> + <ngb-pagination [collectionSize]="totalItems" [(page)]="page" [pageSize]="itemsPerPage" [maxSize]="5" [rotate]="true" [boundaryLinks]="true" (pageChange)="transition()"></ngb-pagination> + </div> + </div> +</div> diff --git a/borestop/src/main/webapp/app/admin/user-management/user-management.component.ts b/borestop/src/main/webapp/app/admin/user-management/user-management.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..68554e1fab11bc8441bf30aa5713aab00c0a209b --- /dev/null +++ b/borestop/src/main/webapp/app/admin/user-management/user-management.component.ts @@ -0,0 +1,106 @@ +import { Component, OnInit, OnDestroy } from '@angular/core'; +import { HttpResponse, HttpHeaders } from '@angular/common/http'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { Subscription, combineLatest } from 'rxjs'; +import { ActivatedRoute, ParamMap, Router, Data } from '@angular/router'; +import { JhiEventManager } from 'ng-jhipster'; + +import { ITEMS_PER_PAGE } from 'app/shared/constants/pagination.constants'; +import { AccountService } from 'app/core/auth/account.service'; +import { Account } from 'app/core/user/account.model'; +import { UserService } from 'app/core/user/user.service'; +import { User } from 'app/core/user/user.model'; +import { UserManagementDeleteDialogComponent } from './user-management-delete-dialog.component'; + +@Component({ + selector: 'jhi-user-mgmt', + templateUrl: './user-management.component.html' +}) +export class UserManagementComponent implements OnInit, OnDestroy { + currentAccount: Account | null = null; + users: User[] | null = null; + userListSubscription?: Subscription; + totalItems = 0; + itemsPerPage = ITEMS_PER_PAGE; + page!: number; + predicate!: string; + ascending!: boolean; + + constructor( + private userService: UserService, + private accountService: AccountService, + private activatedRoute: ActivatedRoute, + private router: Router, + private eventManager: JhiEventManager, + private modalService: NgbModal + ) {} + + ngOnInit(): void { + this.accountService.identity().subscribe(account => (this.currentAccount = account)); + this.userListSubscription = this.eventManager.subscribe('userListModification', () => this.loadAll()); + this.handleNavigation(); + } + + ngOnDestroy(): void { + if (this.userListSubscription) { + this.eventManager.destroy(this.userListSubscription); + } + } + + setActive(user: User, isActivated: boolean): void { + this.userService.update({ ...user, activated: isActivated }).subscribe(() => this.loadAll()); + } + + trackIdentity(index: number, item: User): any { + return item.id; + } + + deleteUser(user: User): void { + const modalRef = this.modalService.open(UserManagementDeleteDialogComponent, { size: 'lg', backdrop: 'static' }); + modalRef.componentInstance.user = user; + } + + transition(): void { + this.router.navigate(['./'], { + relativeTo: this.activatedRoute.parent, + queryParams: { + page: this.page, + sort: this.predicate + ',' + (this.ascending ? 'asc' : 'desc') + } + }); + } + + private handleNavigation(): void { + combineLatest(this.activatedRoute.data, this.activatedRoute.queryParamMap, (data: Data, params: ParamMap) => { + const page = params.get('page'); + this.page = page !== null ? +page : 1; + const sort = (params.get('sort') ?? data['defaultSort']).split(','); + this.predicate = sort[0]; + this.ascending = sort[1] === 'asc'; + this.loadAll(); + }).subscribe(); + } + + private loadAll(): void { + this.userService + .query({ + page: this.page - 1, + size: this.itemsPerPage, + sort: this.sort() + }) + .subscribe((res: HttpResponse<User[]>) => this.onSuccess(res.body, res.headers)); + } + + private sort(): string[] { + const result = [this.predicate + ',' + (this.ascending ? 'asc' : 'desc')]; + if (this.predicate !== 'id') { + result.push('id'); + } + return result; + } + + private onSuccess(users: User[] | null, headers: HttpHeaders): void { + this.totalItems = Number(headers.get('X-Total-Count')); + this.users = users; + } +} diff --git a/borestop/src/main/webapp/app/admin/user-management/user-management.module.ts b/borestop/src/main/webapp/app/admin/user-management/user-management.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..4967467f34c141d120957edfebfda35d3e0b8a5c --- /dev/null +++ b/borestop/src/main/webapp/app/admin/user-management/user-management.module.ts @@ -0,0 +1,21 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { BorestopSharedModule } from 'app/shared/shared.module'; +import { UserManagementComponent } from './user-management.component'; +import { UserManagementDetailComponent } from './user-management-detail.component'; +import { UserManagementUpdateComponent } from './user-management-update.component'; +import { UserManagementDeleteDialogComponent } from './user-management-delete-dialog.component'; +import { userManagementRoute } from './user-management.route'; + +@NgModule({ + imports: [BorestopSharedModule, RouterModule.forChild(userManagementRoute)], + declarations: [ + UserManagementComponent, + UserManagementDetailComponent, + UserManagementUpdateComponent, + UserManagementDeleteDialogComponent + ], + entryComponents: [UserManagementDeleteDialogComponent] +}) +export class UserManagementModule {} diff --git a/borestop/src/main/webapp/app/admin/user-management/user-management.route.ts b/borestop/src/main/webapp/app/admin/user-management/user-management.route.ts new file mode 100644 index 0000000000000000000000000000000000000000..6e3dcab9a80569ecd22513222725dc4ffcf067ca --- /dev/null +++ b/borestop/src/main/webapp/app/admin/user-management/user-management.route.ts @@ -0,0 +1,53 @@ +import { Injectable } from '@angular/core'; +import { Resolve, ActivatedRouteSnapshot, Routes } from '@angular/router'; +import { Observable, of } from 'rxjs'; + +import { User, IUser } from 'app/core/user/user.model'; +import { UserService } from 'app/core/user/user.service'; +import { UserManagementComponent } from './user-management.component'; +import { UserManagementDetailComponent } from './user-management-detail.component'; +import { UserManagementUpdateComponent } from './user-management-update.component'; + +@Injectable({ providedIn: 'root' }) +export class UserManagementResolve implements Resolve<IUser> { + constructor(private service: UserService) {} + + resolve(route: ActivatedRouteSnapshot): Observable<IUser> { + const id = route.params['login']; + if (id) { + return this.service.find(id); + } + return of(new User()); + } +} + +export const userManagementRoute: Routes = [ + { + path: '', + component: UserManagementComponent, + data: { + defaultSort: 'id,asc' + } + }, + { + path: ':login/view', + component: UserManagementDetailComponent, + resolve: { + user: UserManagementResolve + } + }, + { + path: 'new', + component: UserManagementUpdateComponent, + resolve: { + user: UserManagementResolve + } + }, + { + path: ':login/edit', + component: UserManagementUpdateComponent, + resolve: { + user: UserManagementResolve + } + } +]; diff --git a/borestop/src/main/webapp/app/app-routing.module.ts b/borestop/src/main/webapp/app/app-routing.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..7876544764144d73bc5e5267f11a9ba0ab250258 --- /dev/null +++ b/borestop/src/main/webapp/app/app-routing.module.ts @@ -0,0 +1,35 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { errorRoute } from './layouts/error/error.route'; +import { navbarRoute } from './layouts/navbar/navbar.route'; +import { DEBUG_INFO_ENABLED } from 'app/app.constants'; +import { Authority } from 'app/shared/constants/authority.constants'; + +import { UserRouteAccessService } from 'app/core/auth/user-route-access-service'; + +const LAYOUT_ROUTES = [navbarRoute, ...errorRoute]; + +@NgModule({ + imports: [ + RouterModule.forRoot( + [ + { + path: 'admin', + data: { + authorities: [Authority.ADMIN] + }, + canActivate: [UserRouteAccessService], + loadChildren: () => import('./admin/admin-routing.module').then(m => m.AdminRoutingModule) + }, + { + path: 'account', + loadChildren: () => import('./account/account.module').then(m => m.AccountModule) + }, + ...LAYOUT_ROUTES + ], + { enableTracing: DEBUG_INFO_ENABLED } + ) + ], + exports: [RouterModule] +}) +export class BorestopAppRoutingModule {} diff --git a/borestop/src/main/webapp/app/app.constants.ts b/borestop/src/main/webapp/app/app.constants.ts new file mode 100644 index 0000000000000000000000000000000000000000..4b34b657c80d92be0797d302220a460bf84767f6 --- /dev/null +++ b/borestop/src/main/webapp/app/app.constants.ts @@ -0,0 +1,8 @@ +// These constants are injected via webpack environment variables. +// You can add more variables in webpack.common.js or in profile specific webpack.<dev|prod>.js files. +// If you change the values in the webpack config files, you need to re run webpack to update the application + +export const VERSION = process.env.VERSION; +export const DEBUG_INFO_ENABLED = Boolean(process.env.DEBUG_INFO_ENABLED); +export const SERVER_API_URL = process.env.SERVER_API_URL; +export const BUILD_TIMESTAMP = process.env.BUILD_TIMESTAMP; diff --git a/borestop/src/main/webapp/app/app.main.ts b/borestop/src/main/webapp/app/app.main.ts new file mode 100644 index 0000000000000000000000000000000000000000..533cd323125a09dd65bd8f256e50a5678e67b9b6 --- /dev/null +++ b/borestop/src/main/webapp/app/app.main.ts @@ -0,0 +1,16 @@ +import './polyfills'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; +import { ProdConfig } from './blocks/config/prod.config'; +import { BorestopAppModule } from './app.module'; + +ProdConfig(); + +if (module['hot']) { + module['hot'].accept(); +} + +platformBrowserDynamic() + .bootstrapModule(BorestopAppModule, { preserveWhitespaces: true }) + // eslint-disable-next-line no-console + .then(() => console.log('Application started')) + .catch(err => console.error(err)); diff --git a/borestop/src/main/webapp/app/app.module.ts b/borestop/src/main/webapp/app/app.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..6af86dabcfba74bdb4d8203a2750e10aabc4d47e --- /dev/null +++ b/borestop/src/main/webapp/app/app.module.ts @@ -0,0 +1,31 @@ +import { NgModule } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; + +import './vendor'; +import { BorestopSharedModule } from 'app/shared/shared.module'; +import { BorestopCoreModule } from 'app/core/core.module'; +import { BorestopAppRoutingModule } from './app-routing.module'; +import { BorestopHomeModule } from './home/home.module'; +import { BorestopEntityModule } from './entities/entity.module'; +// jhipster-needle-angular-add-module-import JHipster will add new module here +import { MainComponent } from './layouts/main/main.component'; +import { NavbarComponent } from './layouts/navbar/navbar.component'; +import { FooterComponent } from './layouts/footer/footer.component'; +import { PageRibbonComponent } from './layouts/profiles/page-ribbon.component'; +import { ActiveMenuDirective } from './layouts/navbar/active-menu.directive'; +import { ErrorComponent } from './layouts/error/error.component'; + +@NgModule({ + imports: [ + BrowserModule, + BorestopSharedModule, + BorestopCoreModule, + BorestopHomeModule, + // jhipster-needle-angular-add-module JHipster will add new module here + BorestopEntityModule, + BorestopAppRoutingModule + ], + declarations: [MainComponent, NavbarComponent, ErrorComponent, PageRibbonComponent, ActiveMenuDirective, FooterComponent], + bootstrap: [MainComponent] +}) +export class BorestopAppModule {} diff --git a/borestop/src/main/webapp/app/blocks/config/prod.config.ts b/borestop/src/main/webapp/app/blocks/config/prod.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..b1ccef11da56dc23d549134c80708def4fdc2530 --- /dev/null +++ b/borestop/src/main/webapp/app/blocks/config/prod.config.ts @@ -0,0 +1,9 @@ +import { enableProdMode } from '@angular/core'; +import { DEBUG_INFO_ENABLED } from 'app/app.constants'; + +export function ProdConfig(): void { + // disable debug data on prod profile to improve performance + if (!DEBUG_INFO_ENABLED) { + enableProdMode(); + } +} diff --git a/borestop/src/main/webapp/app/blocks/config/uib-pagination.config.ts b/borestop/src/main/webapp/app/blocks/config/uib-pagination.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..002c5cf89e4f2751a6b0b42abeeaa9a4f0777ec3 --- /dev/null +++ b/borestop/src/main/webapp/app/blocks/config/uib-pagination.config.ts @@ -0,0 +1,13 @@ +import { Injectable } from '@angular/core'; +import { NgbPaginationConfig } from '@ng-bootstrap/ng-bootstrap'; +import { ITEMS_PER_PAGE } from 'app/shared/constants/pagination.constants'; + +@Injectable({ providedIn: 'root' }) +export class PaginationConfig { + constructor(config: NgbPaginationConfig) { + config.boundaryLinks = true; + config.maxSize = 5; + config.pageSize = ITEMS_PER_PAGE; + config.size = 'sm'; + } +} diff --git a/borestop/src/main/webapp/app/blocks/interceptor/auth-expired.interceptor.ts b/borestop/src/main/webapp/app/blocks/interceptor/auth-expired.interceptor.ts new file mode 100644 index 0000000000000000000000000000000000000000..a9fa62b6452510040af99f2c0f6ce91bf89b3b6f --- /dev/null +++ b/borestop/src/main/webapp/app/blocks/interceptor/auth-expired.interceptor.ts @@ -0,0 +1,32 @@ +import { Injectable } from '@angular/core'; +import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpErrorResponse } from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { tap } from 'rxjs/operators'; +import { Router } from '@angular/router'; + +import { LoginService } from 'app/core/login/login.service'; +import { LoginModalService } from 'app/core/login/login-modal.service'; +import { StateStorageService } from 'app/core/auth/state-storage.service'; + +@Injectable() +export class AuthExpiredInterceptor implements HttpInterceptor { + constructor( + private loginService: LoginService, + private loginModalService: LoginModalService, + private stateStorageService: StateStorageService, + private router: Router + ) {} + + intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { + return next.handle(request).pipe( + tap(null, (err: HttpErrorResponse) => { + if (err.status === 401 && err.url && !err.url.includes('api/account')) { + this.stateStorageService.storeUrl(this.router.routerState.snapshot.url); + this.loginService.logout(); + this.router.navigate(['']); + this.loginModalService.open(); + } + }) + ); + } +} diff --git a/borestop/src/main/webapp/app/blocks/interceptor/auth.interceptor.ts b/borestop/src/main/webapp/app/blocks/interceptor/auth.interceptor.ts new file mode 100644 index 0000000000000000000000000000000000000000..3dd7aff09d4cda5d9eea38375a99056c676d0249 --- /dev/null +++ b/borestop/src/main/webapp/app/blocks/interceptor/auth.interceptor.ts @@ -0,0 +1,27 @@ +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { LocalStorageService, SessionStorageService } from 'ngx-webstorage'; +import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http'; + +import { SERVER_API_URL } from 'app/app.constants'; + +@Injectable() +export class AuthInterceptor implements HttpInterceptor { + constructor(private localStorage: LocalStorageService, private sessionStorage: SessionStorageService) {} + + intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { + if (!request || !request.url || (request.url.startsWith('http') && !(SERVER_API_URL && request.url.startsWith(SERVER_API_URL)))) { + return next.handle(request); + } + + const token = this.localStorage.retrieve('authenticationToken') || this.sessionStorage.retrieve('authenticationToken'); + if (token) { + request = request.clone({ + setHeaders: { + Authorization: 'Bearer ' + token + } + }); + } + return next.handle(request); + } +} diff --git a/borestop/src/main/webapp/app/blocks/interceptor/errorhandler.interceptor.ts b/borestop/src/main/webapp/app/blocks/interceptor/errorhandler.interceptor.ts new file mode 100644 index 0000000000000000000000000000000000000000..d8b147d89f2b4e322eb718a55701eb65d64c7b5a --- /dev/null +++ b/borestop/src/main/webapp/app/blocks/interceptor/errorhandler.interceptor.ts @@ -0,0 +1,20 @@ +import { Injectable } from '@angular/core'; +import { JhiEventManager, JhiEventWithContent } from 'ng-jhipster'; +import { HttpInterceptor, HttpRequest, HttpErrorResponse, HttpHandler, HttpEvent } from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { tap } from 'rxjs/operators'; + +@Injectable() +export class ErrorHandlerInterceptor implements HttpInterceptor { + constructor(private eventManager: JhiEventManager) {} + + intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { + return next.handle(request).pipe( + tap(null, (err: HttpErrorResponse) => { + if (!(err.status === 401 && (err.message === '' || (err.url && err.url.includes('api/account'))))) { + this.eventManager.broadcast(new JhiEventWithContent('borestopApp.httpError', err)); + } + }) + ); + } +} diff --git a/borestop/src/main/webapp/app/blocks/interceptor/notification.interceptor.ts b/borestop/src/main/webapp/app/blocks/interceptor/notification.interceptor.ts new file mode 100644 index 0000000000000000000000000000000000000000..5eb735bd772ef9716cb0128a33fa47b748d015cf --- /dev/null +++ b/borestop/src/main/webapp/app/blocks/interceptor/notification.interceptor.ts @@ -0,0 +1,33 @@ +import { JhiAlertService } from 'ng-jhipster'; +import { HttpInterceptor, HttpRequest, HttpResponse, HttpHandler, HttpEvent } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { tap } from 'rxjs/operators'; + +@Injectable() +export class NotificationInterceptor implements HttpInterceptor { + constructor(private alertService: JhiAlertService) {} + + intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { + return next.handle(request).pipe( + tap((event: HttpEvent<any>) => { + if (event instanceof HttpResponse) { + let alert: string | null = null; + let alertParams: string | null = null; + + event.headers.keys().forEach(entry => { + if (entry.toLowerCase().endsWith('app-alert')) { + alert = event.headers.get(entry); + } else if (entry.toLowerCase().endsWith('app-params')) { + alertParams = decodeURIComponent(event.headers.get(entry)!.replace(/\+/g, ' ')); + } + }); + + if (alert) { + this.alertService.success(alert, { param: alertParams }); + } + } + }) + ); + } +} diff --git a/borestop/src/main/webapp/app/core/auth/account.service.ts b/borestop/src/main/webapp/app/core/auth/account.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..8af48d39c1334c5ae8194c35644f0ee4c2d70c98 --- /dev/null +++ b/borestop/src/main/webapp/app/core/auth/account.service.ts @@ -0,0 +1,97 @@ +import { Injectable } from '@angular/core'; +import { Router } from '@angular/router'; +import { HttpClient } from '@angular/common/http'; +import { JhiLanguageService } from 'ng-jhipster'; +import { SessionStorageService } from 'ngx-webstorage'; +import { Observable, ReplaySubject, of } from 'rxjs'; +import { shareReplay, tap, catchError } from 'rxjs/operators'; +import { StateStorageService } from 'app/core/auth/state-storage.service'; + +import { SERVER_API_URL } from 'app/app.constants'; +import { Account } from 'app/core/user/account.model'; + +@Injectable({ providedIn: 'root' }) +export class AccountService { + private userIdentity: Account | null = null; + private authenticationState = new ReplaySubject<Account | null>(1); + private accountCache$?: Observable<Account | null>; + + constructor( + private languageService: JhiLanguageService, + private sessionStorage: SessionStorageService, + private http: HttpClient, + private stateStorageService: StateStorageService, + private router: Router + ) {} + + save(account: Account): Observable<{}> { + return this.http.post(SERVER_API_URL + 'api/account', account); + } + + authenticate(identity: Account | null): void { + this.userIdentity = identity; + this.authenticationState.next(this.userIdentity); + } + + hasAnyAuthority(authorities: string[] | string): boolean { + if (!this.userIdentity || !this.userIdentity.authorities) { + return false; + } + if (!Array.isArray(authorities)) { + authorities = [authorities]; + } + return this.userIdentity.authorities.some((authority: string) => authorities.includes(authority)); + } + + identity(force?: boolean): Observable<Account | null> { + if (!this.accountCache$ || force || !this.isAuthenticated()) { + this.accountCache$ = this.fetch().pipe( + catchError(() => { + return of(null); + }), + tap((account: Account | null) => { + this.authenticate(account); + + // After retrieve the account info, the language will be changed to + // the user's preferred language configured in the account setting + if (account && account.langKey) { + const langKey = this.sessionStorage.retrieve('locale') || account.langKey; + this.languageService.changeLanguage(langKey); + } + + if (account) { + this.navigateToStoredUrl(); + } + }), + shareReplay() + ); + } + return this.accountCache$; + } + + isAuthenticated(): boolean { + return this.userIdentity !== null; + } + + getAuthenticationState(): Observable<Account | null> { + return this.authenticationState.asObservable(); + } + + getImageUrl(): string { + return this.userIdentity ? this.userIdentity.imageUrl : ''; + } + + private fetch(): Observable<Account> { + return this.http.get<Account>(SERVER_API_URL + 'api/account'); + } + + private navigateToStoredUrl(): void { + // previousState can be set in the authExpiredInterceptor and in the userRouteAccessService + // if login is successful, go to stored previousState and clear previousState + const previousUrl = this.stateStorageService.getUrl(); + if (previousUrl) { + this.stateStorageService.clearUrl(); + this.router.navigateByUrl(previousUrl); + } + } +} diff --git a/borestop/src/main/webapp/app/core/auth/auth-jwt.service.ts b/borestop/src/main/webapp/app/core/auth/auth-jwt.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..5fb3e6f8e0cd68227f1c3deff604f6580d5b57c9 --- /dev/null +++ b/borestop/src/main/webapp/app/core/auth/auth-jwt.service.ts @@ -0,0 +1,44 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { LocalStorageService, SessionStorageService } from 'ngx-webstorage'; + +import { SERVER_API_URL } from 'app/app.constants'; +import { Login } from 'app/core/login/login.model'; + +type JwtToken = { + id_token: string; +}; + +@Injectable({ providedIn: 'root' }) +export class AuthServerProvider { + constructor(private http: HttpClient, private $localStorage: LocalStorageService, private $sessionStorage: SessionStorageService) {} + + getToken(): string { + return this.$localStorage.retrieve('authenticationToken') || this.$sessionStorage.retrieve('authenticationToken') || ''; + } + + login(credentials: Login): Observable<void> { + return this.http + .post<JwtToken>(SERVER_API_URL + 'api/authenticate', credentials) + .pipe(map(response => this.authenticateSuccess(response, credentials.rememberMe))); + } + + logout(): Observable<void> { + return new Observable(observer => { + this.$localStorage.clear('authenticationToken'); + this.$sessionStorage.clear('authenticationToken'); + observer.complete(); + }); + } + + private authenticateSuccess(response: JwtToken, rememberMe: boolean): void { + const jwt = response.id_token; + if (rememberMe) { + this.$localStorage.store('authenticationToken', jwt); + } else { + this.$sessionStorage.store('authenticationToken', jwt); + } + } +} diff --git a/borestop/src/main/webapp/app/core/auth/csrf.service.ts b/borestop/src/main/webapp/app/core/auth/csrf.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..0a491627abfa6cb9a7b86bb9bf2c7291fc15e3d3 --- /dev/null +++ b/borestop/src/main/webapp/app/core/auth/csrf.service.ts @@ -0,0 +1,11 @@ +import { Injectable } from '@angular/core'; +import { CookieService } from 'ngx-cookie-service'; + +@Injectable({ providedIn: 'root' }) +export class CSRFService { + constructor(private cookieService: CookieService) {} + + getCSRF(name = 'XSRF-TOKEN'): string { + return this.cookieService.get(name); + } +} diff --git a/borestop/src/main/webapp/app/core/auth/state-storage.service.ts b/borestop/src/main/webapp/app/core/auth/state-storage.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..5d8861de804251a07e85e8fdd6d192cdda3ac2b6 --- /dev/null +++ b/borestop/src/main/webapp/app/core/auth/state-storage.service.ts @@ -0,0 +1,21 @@ +import { Injectable } from '@angular/core'; +import { SessionStorageService } from 'ngx-webstorage'; + +@Injectable({ providedIn: 'root' }) +export class StateStorageService { + private previousUrlKey = 'previousUrl'; + + constructor(private $sessionStorage: SessionStorageService) {} + + storeUrl(url: string): void { + this.$sessionStorage.store(this.previousUrlKey, url); + } + + getUrl(): string | null | undefined { + return this.$sessionStorage.retrieve(this.previousUrlKey); + } + + clearUrl(): void { + this.$sessionStorage.clear(this.previousUrlKey); + } +} diff --git a/borestop/src/main/webapp/app/core/auth/user-route-access-service.ts b/borestop/src/main/webapp/app/core/auth/user-route-access-service.ts new file mode 100644 index 0000000000000000000000000000000000000000..30d7b7ebf1ddadfc48a3bbcc675b5246e0e29211 --- /dev/null +++ b/borestop/src/main/webapp/app/core/auth/user-route-access-service.ts @@ -0,0 +1,53 @@ +import { Injectable, isDevMode } from '@angular/core'; +import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + +import { AccountService } from 'app/core/auth/account.service'; +import { LoginModalService } from 'app/core/login/login-modal.service'; +import { StateStorageService } from './state-storage.service'; + +@Injectable({ providedIn: 'root' }) +export class UserRouteAccessService implements CanActivate { + constructor( + private router: Router, + private loginModalService: LoginModalService, + private accountService: AccountService, + private stateStorageService: StateStorageService + ) {} + + canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> { + const authorities = route.data['authorities']; + // We need to call the checkLogin / and so the accountService.identity() function, to ensure, + // that the client has a principal too, if they already logged in by the server. + // This could happen on a page refresh. + return this.checkLogin(authorities, state.url); + } + + checkLogin(authorities: string[], url: string): Observable<boolean> { + return this.accountService.identity().pipe( + map(account => { + if (!authorities || authorities.length === 0) { + return true; + } + + if (account) { + const hasAnyAuthority = this.accountService.hasAnyAuthority(authorities); + if (hasAnyAuthority) { + return true; + } + if (isDevMode()) { + console.error('User has not any of required authorities: ', authorities); + } + this.router.navigate(['accessdenied']); + return false; + } + + this.stateStorageService.storeUrl(url); + this.router.navigate(['']); + this.loginModalService.open(); + return false; + }) + ); + } +} diff --git a/borestop/src/main/webapp/app/core/core.module.ts b/borestop/src/main/webapp/app/core/core.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..3798d2a88cb1b840d1d0e541e207be803372f8f3 --- /dev/null +++ b/borestop/src/main/webapp/app/core/core.module.ts @@ -0,0 +1,85 @@ +import { NgModule, LOCALE_ID } from '@angular/core'; +import { DatePipe, registerLocaleData } from '@angular/common'; +import { HttpClient, HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http'; +import { Title } from '@angular/platform-browser'; +import { FaIconLibrary } from '@fortawesome/angular-fontawesome'; +import { CookieService } from 'ngx-cookie-service'; +import { TranslateModule, TranslateLoader, MissingTranslationHandler } from '@ngx-translate/core'; +import { NgxWebstorageModule } from 'ngx-webstorage'; +import { NgJhipsterModule, translatePartialLoader, missingTranslationHandler, JhiConfigService, JhiLanguageService } from 'ng-jhipster'; +import locale from '@angular/common/locales/en'; + +import * as moment from 'moment'; +import { NgbDateAdapter, NgbDatepickerConfig } from '@ng-bootstrap/ng-bootstrap'; +import { NgbDateMomentAdapter } from 'app/shared/util/datepicker-adapter'; + +import { AuthInterceptor } from 'app/blocks/interceptor/auth.interceptor'; +import { AuthExpiredInterceptor } from 'app/blocks/interceptor/auth-expired.interceptor'; +import { ErrorHandlerInterceptor } from 'app/blocks/interceptor/errorhandler.interceptor'; +import { NotificationInterceptor } from 'app/blocks/interceptor/notification.interceptor'; + +import { fontAwesomeIcons } from './icons/font-awesome-icons'; + +@NgModule({ + imports: [ + HttpClientModule, + NgxWebstorageModule.forRoot({ prefix: 'jhi', separator: '-' }), + NgJhipsterModule.forRoot({ + // set below to true to make alerts look like toast + alertAsToast: false, + alertTimeout: 5000, + i18nEnabled: true, + defaultI18nLang: 'en' + }), + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: translatePartialLoader, + deps: [HttpClient] + }, + missingTranslationHandler: { + provide: MissingTranslationHandler, + useFactory: missingTranslationHandler, + deps: [JhiConfigService] + } + }) + ], + providers: [ + Title, + CookieService, + { + provide: LOCALE_ID, + useValue: 'en' + }, + { provide: NgbDateAdapter, useClass: NgbDateMomentAdapter }, + DatePipe, + { + provide: HTTP_INTERCEPTORS, + useClass: AuthInterceptor, + multi: true + }, + { + provide: HTTP_INTERCEPTORS, + useClass: AuthExpiredInterceptor, + multi: true + }, + { + provide: HTTP_INTERCEPTORS, + useClass: ErrorHandlerInterceptor, + multi: true + }, + { + provide: HTTP_INTERCEPTORS, + useClass: NotificationInterceptor, + multi: true + } + ] +}) +export class BorestopCoreModule { + constructor(iconLibrary: FaIconLibrary, dpConfig: NgbDatepickerConfig, languageService: JhiLanguageService) { + registerLocaleData(locale); + iconLibrary.addIcons(...fontAwesomeIcons); + dpConfig.minDate = { year: moment().year() - 100, month: 1, day: 1 }; + languageService.init(); + } +} diff --git a/borestop/src/main/webapp/app/core/icons/font-awesome-icons.ts b/borestop/src/main/webapp/app/core/icons/font-awesome-icons.ts new file mode 100644 index 0000000000000000000000000000000000000000..96d0b13ef8fd5dd6a51b61831529974a0e0e0b46 --- /dev/null +++ b/borestop/src/main/webapp/app/core/icons/font-awesome-icons.ts @@ -0,0 +1,75 @@ +import { + faUser, + faSort, + faSortUp, + faSortDown, + faSync, + faEye, + faBan, + faTimes, + faArrowLeft, + faSave, + faPlus, + faPencilAlt, + faBars, + faThList, + faUserPlus, + faRoad, + faTachometerAlt, + faHeart, + faList, + faBell, + faBook, + faHdd, + faFlag, + faWrench, + faLock, + faCloud, + faSignOutAlt, + faSignInAlt, + faCalendarAlt, + faSearch, + faTrashAlt, + faAsterisk, + faTasks, + // jhipster-needle-add-icon-import + faHome +} from '@fortawesome/free-solid-svg-icons'; + +export const fontAwesomeIcons = [ + faUser, + faSort, + faSortUp, + faSortDown, + faSync, + faEye, + faBan, + faTimes, + faArrowLeft, + faSave, + faPlus, + faPencilAlt, + faBars, + faHome, + faThList, + faUserPlus, + faRoad, + faTachometerAlt, + faHeart, + faList, + faBell, + faTasks, + faBook, + faHdd, + faFlag, + faWrench, + faLock, + faCloud, + faSignOutAlt, + faSignInAlt, + faCalendarAlt, + faSearch, + faTrashAlt, + // jhipster-needle-add-icon-import + faAsterisk +]; diff --git a/borestop/src/main/webapp/app/core/language/language.constants.ts b/borestop/src/main/webapp/app/core/language/language.constants.ts new file mode 100644 index 0000000000000000000000000000000000000000..fb355fbdfcb99fd267a28669fe27c0965b1240f7 --- /dev/null +++ b/borestop/src/main/webapp/app/core/language/language.constants.ts @@ -0,0 +1,8 @@ +/* + Languages codes are ISO_639-1 codes, see http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes + They are written in English to avoid character encoding issues (not a perfect solution) +*/ +export const LANGUAGES: string[] = [ + 'en' + // jhipster-needle-i18n-language-constant - JHipster will add/remove languages in this array +]; diff --git a/borestop/src/main/webapp/app/core/login/login-modal.service.ts b/borestop/src/main/webapp/app/core/login/login-modal.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..73af6ae492d4450070380aac758dce07b0f9bb70 --- /dev/null +++ b/borestop/src/main/webapp/app/core/login/login-modal.service.ts @@ -0,0 +1,20 @@ +import { Injectable } from '@angular/core'; +import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; + +import { LoginModalComponent } from 'app/shared/login/login.component'; + +@Injectable({ providedIn: 'root' }) +export class LoginModalService { + private isOpen = false; + + constructor(private modalService: NgbModal) {} + + open(): void { + if (this.isOpen) { + return; + } + this.isOpen = true; + const modalRef: NgbModalRef = this.modalService.open(LoginModalComponent); + modalRef.result.finally(() => (this.isOpen = false)); + } +} diff --git a/borestop/src/main/webapp/app/core/login/login.model.ts b/borestop/src/main/webapp/app/core/login/login.model.ts new file mode 100644 index 0000000000000000000000000000000000000000..422fce9a08b3e65e9ef2c6109dbcfde3b9f6afe5 --- /dev/null +++ b/borestop/src/main/webapp/app/core/login/login.model.ts @@ -0,0 +1,3 @@ +export class Login { + constructor(public username: string, public password: string, public rememberMe: boolean) {} +} diff --git a/borestop/src/main/webapp/app/core/login/login.service.ts b/borestop/src/main/webapp/app/core/login/login.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..600f4f7eec39ecc6fa968bcf181b0f5994cf593d --- /dev/null +++ b/borestop/src/main/webapp/app/core/login/login.service.ts @@ -0,0 +1,21 @@ +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { flatMap } from 'rxjs/operators'; + +import { Account } from 'app/core/user/account.model'; +import { AccountService } from 'app/core/auth/account.service'; +import { AuthServerProvider } from 'app/core/auth/auth-jwt.service'; +import { Login } from './login.model'; + +@Injectable({ providedIn: 'root' }) +export class LoginService { + constructor(private accountService: AccountService, private authServerProvider: AuthServerProvider) {} + + login(credentials: Login): Observable<Account | null> { + return this.authServerProvider.login(credentials).pipe(flatMap(() => this.accountService.identity(true))); + } + + logout(): void { + this.authServerProvider.logout().subscribe(null, null, () => this.accountService.authenticate(null)); + } +} diff --git a/borestop/src/main/webapp/app/core/user/account.model.ts b/borestop/src/main/webapp/app/core/user/account.model.ts new file mode 100644 index 0000000000000000000000000000000000000000..4d2c8333525d9c1f9c8f157032ab9fbbfe615013 --- /dev/null +++ b/borestop/src/main/webapp/app/core/user/account.model.ts @@ -0,0 +1,12 @@ +export class Account { + constructor( + public activated: boolean, + public authorities: string[], + public email: string, + public firstName: string, + public langKey: string, + public lastName: string, + public login: string, + public imageUrl: string + ) {} +} diff --git a/borestop/src/main/webapp/app/core/user/user.model.ts b/borestop/src/main/webapp/app/core/user/user.model.ts new file mode 100644 index 0000000000000000000000000000000000000000..585f7eddab427954f845492a80c4782a55097da3 --- /dev/null +++ b/borestop/src/main/webapp/app/core/user/user.model.ts @@ -0,0 +1,33 @@ +export interface IUser { + id?: any; + login?: string; + firstName?: string; + lastName?: string; + email?: string; + activated?: boolean; + langKey?: string; + authorities?: string[]; + createdBy?: string; + createdDate?: Date; + lastModifiedBy?: string; + lastModifiedDate?: Date; + password?: string; +} + +export class User implements IUser { + constructor( + public id?: any, + public login?: string, + public firstName?: string, + public lastName?: string, + public email?: string, + public activated?: boolean, + public langKey?: string, + public authorities?: string[], + public createdBy?: string, + public createdDate?: Date, + public lastModifiedBy?: string, + public lastModifiedDate?: Date, + public password?: string + ) {} +} diff --git a/borestop/src/main/webapp/app/core/user/user.service.ts b/borestop/src/main/webapp/app/core/user/user.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..b5987698ef12e98bf9d66fb08463fb2e6c4e9171 --- /dev/null +++ b/borestop/src/main/webapp/app/core/user/user.service.ts @@ -0,0 +1,39 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpResponse } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { SERVER_API_URL } from 'app/app.constants'; +import { createRequestOption, Pagination } from 'app/shared/util/request-util'; +import { IUser } from './user.model'; + +@Injectable({ providedIn: 'root' }) +export class UserService { + public resourceUrl = SERVER_API_URL + 'api/users'; + + constructor(private http: HttpClient) {} + + create(user: IUser): Observable<IUser> { + return this.http.post<IUser>(this.resourceUrl, user); + } + + update(user: IUser): Observable<IUser> { + return this.http.put<IUser>(this.resourceUrl, user); + } + + find(login: string): Observable<IUser> { + return this.http.get<IUser>(`${this.resourceUrl}/${login}`); + } + + query(req?: Pagination): Observable<HttpResponse<IUser[]>> { + const options = createRequestOption(req); + return this.http.get<IUser[]>(this.resourceUrl, { params: options, observe: 'response' }); + } + + delete(login: string): Observable<{}> { + return this.http.delete(`${this.resourceUrl}/${login}`); + } + + authorities(): Observable<string[]> { + return this.http.get<string[]>(SERVER_API_URL + 'api/users/authorities'); + } +} diff --git a/borestop/src/main/webapp/app/entities/entity.module.ts b/borestop/src/main/webapp/app/entities/entity.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..efd5534cf125fe579355d5021dea9a9cbe9bf424 --- /dev/null +++ b/borestop/src/main/webapp/app/entities/entity.module.ts @@ -0,0 +1,11 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + /* jhipster-needle-add-entity-route - JHipster will add entity modules routes here */ + ]) + ] +}) +export class BorestopEntityModule {} diff --git a/borestop/src/main/webapp/app/home/home.component.html b/borestop/src/main/webapp/app/home/home.component.html new file mode 100644 index 0000000000000000000000000000000000000000..0f54094b0afe393a6b52aac284a0e2b3b0c0f5e7 --- /dev/null +++ b/borestop/src/main/webapp/app/home/home.component.html @@ -0,0 +1,44 @@ +<div class="row"> + <div class="col-md-3"> + <span class="hipster img-fluid rounded"></span> + </div> + + <div class="col-md-9"> + <h1 class="display-4" jhiTranslate="home.title">Welcome, Java Hipster!</h1> + + <p class="lead" jhiTranslate="home.subtitle">This is your homepage</p> + + <div [ngSwitch]="isAuthenticated()"> + <div class="alert alert-success" *ngSwitchCase="true"> + <span id="home-logged-message" *ngIf="account" jhiTranslate="home.logged.message" + [translateValues]="{ username: account.login }">You are logged in as user "{{ account.login }}".</span> + </div> + + <div class="alert alert-warning" *ngSwitchCase="false"> + <span jhiTranslate="global.messages.info.authenticated.prefix">If you want to </span> + <a class="alert-link" (click)="login()" jhiTranslate="global.messages.info.authenticated.link">sign in</a><span jhiTranslate="global.messages.info.authenticated.suffix">, you can try the default accounts:<br/>- Administrator (login="admin" and password="admin") <br/>- User (login="user" and password="user").</span> + </div> + + <div class="alert alert-warning" *ngSwitchCase="false"> + <span jhiTranslate="global.messages.info.register.noaccount">You don't have an account yet?</span> + <a class="alert-link" routerLink="account/register" jhiTranslate="global.messages.info.register.link">Register a new account</a> + </div> + </div> + + <p jhiTranslate="home.question"> + If you have any question on JHipster: + </p> + + <ul> + <li><a href="https://www.jhipster.tech/" target="_blank" rel="noopener noreferrer" jhiTranslate="home.link.homepage">JHipster homepage</a></li> + <li><a href="http://stackoverflow.com/tags/jhipster/info" target="_blank" rel="noopener noreferrer" jhiTranslate="home.link.stackoverflow">JHipster on Stack Overflow</a></li> + <li><a href="https://github.com/jhipster/generator-jhipster/issues?state=open" target="_blank" rel="noopener noreferrer" jhiTranslate="home.link.bugtracker">JHipster bug tracker</a></li> + <li><a href="https://gitter.im/jhipster/generator-jhipster" target="_blank" rel="noopener noreferrer" jhiTranslate="home.link.chat">JHipster public chat room</a></li> + <li><a href="https://twitter.com/jhipster" target="_blank" rel="noopener noreferrer" jhiTranslate="home.link.follow">follow @jhipster on Twitter</a></li> + </ul> + + <p> + <span jhiTranslate="home.like">If you like JHipster, don't forget to give us a star on</span> <a href="https://github.com/jhipster/generator-jhipster" target="_blank" rel="noopener noreferrer" jhiTranslate="home.github">GitHub</a>! + </p> + </div> +</div> diff --git a/borestop/src/main/webapp/app/home/home.component.ts b/borestop/src/main/webapp/app/home/home.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..d6f4469b08b2374b4caaceb4b881a348303bde46 --- /dev/null +++ b/borestop/src/main/webapp/app/home/home.component.ts @@ -0,0 +1,36 @@ +import { Component, OnInit, OnDestroy } from '@angular/core'; +import { Subscription } from 'rxjs'; + +import { LoginModalService } from 'app/core/login/login-modal.service'; +import { AccountService } from 'app/core/auth/account.service'; +import { Account } from 'app/core/user/account.model'; + +@Component({ + selector: 'jhi-home', + templateUrl: './home.component.html', + styleUrls: ['home.scss'] +}) +export class HomeComponent implements OnInit, OnDestroy { + account: Account | null = null; + authSubscription?: Subscription; + + constructor(private accountService: AccountService, private loginModalService: LoginModalService) {} + + ngOnInit(): void { + this.authSubscription = this.accountService.getAuthenticationState().subscribe(account => (this.account = account)); + } + + isAuthenticated(): boolean { + return this.accountService.isAuthenticated(); + } + + login(): void { + this.loginModalService.open(); + } + + ngOnDestroy(): void { + if (this.authSubscription) { + this.authSubscription.unsubscribe(); + } + } +} diff --git a/borestop/src/main/webapp/app/home/home.module.ts b/borestop/src/main/webapp/app/home/home.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..3cf8ccff98f26541b053fe85aed625670e4a4408 --- /dev/null +++ b/borestop/src/main/webapp/app/home/home.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { BorestopSharedModule } from 'app/shared/shared.module'; +import { HOME_ROUTE } from './home.route'; +import { HomeComponent } from './home.component'; + +@NgModule({ + imports: [BorestopSharedModule, RouterModule.forChild([HOME_ROUTE])], + declarations: [HomeComponent] +}) +export class BorestopHomeModule {} diff --git a/borestop/src/main/webapp/app/home/home.route.ts b/borestop/src/main/webapp/app/home/home.route.ts new file mode 100644 index 0000000000000000000000000000000000000000..aefa2b7e0e947c1be14c3247332e1e4b931d9d79 --- /dev/null +++ b/borestop/src/main/webapp/app/home/home.route.ts @@ -0,0 +1,12 @@ +import { Route } from '@angular/router'; + +import { HomeComponent } from './home.component'; + +export const HOME_ROUTE: Route = { + path: '', + component: HomeComponent, + data: { + authorities: [], + pageTitle: 'home.title' + } +}; diff --git a/borestop/src/main/webapp/app/home/home.scss b/borestop/src/main/webapp/app/home/home.scss new file mode 100644 index 0000000000000000000000000000000000000000..066c9aa8f998c1f6b885321ea4cc80b569af536c --- /dev/null +++ b/borestop/src/main/webapp/app/home/home.scss @@ -0,0 +1,23 @@ +/* ========================================================================== +Main page styles +========================================================================== */ + +.hipster { + display: inline-block; + width: 347px; + height: 497px; + background: url('../../content/images/jhipster_family_member_2.svg') no-repeat center top; + background-size: contain; +} + +/* wait autoprefixer update to allow simple generation of high pixel density media query */ +@media only screen and (-webkit-min-device-pixel-ratio: 2), + only screen and (-moz-min-device-pixel-ratio: 2), + only screen and (-o-min-device-pixel-ratio: 2/1), + only screen and (min-resolution: 192dpi), + only screen and (min-resolution: 2dppx) { + .hipster { + background: url('../../content/images/jhipster_family_member_2.svg') no-repeat center top; + background-size: contain; + } +} diff --git a/borestop/src/main/webapp/app/layouts/error/error.component.html b/borestop/src/main/webapp/app/layouts/error/error.component.html new file mode 100644 index 0000000000000000000000000000000000000000..b51ae9d049ecb34163322b3401d9588b0b75db4c --- /dev/null +++ b/borestop/src/main/webapp/app/layouts/error/error.component.html @@ -0,0 +1,15 @@ +<div> + <div class="row"> + <div class="col-md-4"> + <span class="hipster img-fluid rounded"></span> + </div> + + <div class="col-md-8"> + <h1 jhiTranslate="error.title">Error Page!</h1> + + <div *ngIf="errorMessage"> + <div class="alert alert-danger">{{ errorMessage }}</div> + </div> + </div> + </div> +</div> diff --git a/borestop/src/main/webapp/app/layouts/error/error.component.ts b/borestop/src/main/webapp/app/layouts/error/error.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..cb3dfe2af500a8e1672083273d9e006fc9031ac6 --- /dev/null +++ b/borestop/src/main/webapp/app/layouts/error/error.component.ts @@ -0,0 +1,39 @@ +import { Component, OnInit, OnDestroy } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { Subscription } from 'rxjs'; +import { TranslateService } from '@ngx-translate/core'; + +@Component({ + selector: 'jhi-error', + templateUrl: './error.component.html' +}) +export class ErrorComponent implements OnInit, OnDestroy { + errorMessage?: string; + errorKey?: string; + langChangeSubscription?: Subscription; + + constructor(private translateService: TranslateService, private route: ActivatedRoute) {} + + ngOnInit(): void { + this.route.data.subscribe(routeData => { + if (routeData.errorMessage) { + this.errorKey = routeData.errorMessage; + this.getErrorMessageTranslation(); + this.langChangeSubscription = this.translateService.onLangChange.subscribe(() => this.getErrorMessageTranslation()); + } + }); + } + + ngOnDestroy(): void { + if (this.langChangeSubscription) { + this.langChangeSubscription.unsubscribe(); + } + } + + private getErrorMessageTranslation(): void { + this.errorMessage = ''; + if (this.errorKey) { + this.translateService.get(this.errorKey).subscribe(translatedErrorMessage => (this.errorMessage = translatedErrorMessage)); + } + } +} diff --git a/borestop/src/main/webapp/app/layouts/error/error.route.ts b/borestop/src/main/webapp/app/layouts/error/error.route.ts new file mode 100644 index 0000000000000000000000000000000000000000..4828cc7dcc6ee31cefa2672fc8d03efc29773991 --- /dev/null +++ b/borestop/src/main/webapp/app/layouts/error/error.route.ts @@ -0,0 +1,36 @@ +import { Routes } from '@angular/router'; + +import { ErrorComponent } from './error.component'; + +export const errorRoute: Routes = [ + { + path: 'error', + component: ErrorComponent, + data: { + authorities: [], + pageTitle: 'error.title' + } + }, + { + path: 'accessdenied', + component: ErrorComponent, + data: { + authorities: [], + pageTitle: 'error.title', + errorMessage: 'error.http.403' + } + }, + { + path: '404', + component: ErrorComponent, + data: { + authorities: [], + pageTitle: 'error.title', + errorMessage: 'error.http.404' + } + }, + { + path: '**', + redirectTo: '/404' + } +]; diff --git a/borestop/src/main/webapp/app/layouts/footer/footer.component.html b/borestop/src/main/webapp/app/layouts/footer/footer.component.html new file mode 100644 index 0000000000000000000000000000000000000000..9312ad063e7128237bbe9738232612f5b35d1cce --- /dev/null +++ b/borestop/src/main/webapp/app/layouts/footer/footer.component.html @@ -0,0 +1,3 @@ +<div class="footer"> + <p jhiTranslate="footer">This is your footer</p> +</div> diff --git a/borestop/src/main/webapp/app/layouts/footer/footer.component.ts b/borestop/src/main/webapp/app/layouts/footer/footer.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..ac9a85ec9882db87570ce5486d8a9d743abb900e --- /dev/null +++ b/borestop/src/main/webapp/app/layouts/footer/footer.component.ts @@ -0,0 +1,7 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'jhi-footer', + templateUrl: './footer.component.html' +}) +export class FooterComponent {} diff --git a/borestop/src/main/webapp/app/layouts/main/main.component.html b/borestop/src/main/webapp/app/layouts/main/main.component.html new file mode 100644 index 0000000000000000000000000000000000000000..d8bcc2219cc79f0d145395f71f2c309d7ae64153 --- /dev/null +++ b/borestop/src/main/webapp/app/layouts/main/main.component.html @@ -0,0 +1,13 @@ +<jhi-page-ribbon></jhi-page-ribbon> + +<div> + <router-outlet name="navbar"></router-outlet> +</div> + +<div class="container-fluid"> + <div class="card jh-card"> + <router-outlet></router-outlet> + </div> + + <jhi-footer></jhi-footer> +</div> diff --git a/borestop/src/main/webapp/app/layouts/main/main.component.ts b/borestop/src/main/webapp/app/layouts/main/main.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..0c1b21159f7709762b04e398a610fb7a44fc99d6 --- /dev/null +++ b/borestop/src/main/webapp/app/layouts/main/main.component.ts @@ -0,0 +1,60 @@ +import { Component, OnInit, RendererFactory2, Renderer2 } from '@angular/core'; +import { Title } from '@angular/platform-browser'; +import { Router, ActivatedRouteSnapshot, NavigationEnd, NavigationError } from '@angular/router'; +import { TranslateService, LangChangeEvent } from '@ngx-translate/core'; + +import { AccountService } from 'app/core/auth/account.service'; + +@Component({ + selector: 'jhi-main', + templateUrl: './main.component.html' +}) +export class MainComponent implements OnInit { + private renderer: Renderer2; + + constructor( + private accountService: AccountService, + private titleService: Title, + private router: Router, + private translateService: TranslateService, + rootRenderer: RendererFactory2 + ) { + this.renderer = rootRenderer.createRenderer(document.querySelector('html'), null); + } + + ngOnInit(): void { + // try to log in automatically + this.accountService.identity().subscribe(); + + this.router.events.subscribe(event => { + if (event instanceof NavigationEnd) { + this.updateTitle(); + } + if (event instanceof NavigationError && event.error.status === 404) { + this.router.navigate(['/404']); + } + }); + + this.translateService.onLangChange.subscribe((langChangeEvent: LangChangeEvent) => { + this.updateTitle(); + + this.renderer.setAttribute(document.querySelector('html'), 'lang', langChangeEvent.lang); + }); + } + + private getPageTitle(routeSnapshot: ActivatedRouteSnapshot): string { + let title: string = routeSnapshot.data && routeSnapshot.data['pageTitle'] ? routeSnapshot.data['pageTitle'] : ''; + if (routeSnapshot.firstChild) { + title = this.getPageTitle(routeSnapshot.firstChild) || title; + } + return title; + } + + private updateTitle(): void { + let pageTitle = this.getPageTitle(this.router.routerState.snapshot.root); + if (!pageTitle) { + pageTitle = 'global.title'; + } + this.translateService.get(pageTitle).subscribe(title => this.titleService.setTitle(title)); + } +} diff --git a/borestop/src/main/webapp/app/layouts/navbar/active-menu.directive.ts b/borestop/src/main/webapp/app/layouts/navbar/active-menu.directive.ts new file mode 100644 index 0000000000000000000000000000000000000000..7e2a2f9de3255ac7808acad57af594e2e418f4d0 --- /dev/null +++ b/borestop/src/main/webapp/app/layouts/navbar/active-menu.directive.ts @@ -0,0 +1,27 @@ +import { Directive, OnInit, ElementRef, Renderer2, Input } from '@angular/core'; +import { TranslateService, LangChangeEvent } from '@ngx-translate/core'; + +@Directive({ + selector: '[jhiActiveMenu]' +}) +export class ActiveMenuDirective implements OnInit { + @Input() jhiActiveMenu?: string; + + constructor(private el: ElementRef, private renderer: Renderer2, private translateService: TranslateService) {} + + ngOnInit(): void { + this.translateService.onLangChange.subscribe((event: LangChangeEvent) => { + this.updateActiveFlag(event.lang); + }); + + this.updateActiveFlag(this.translateService.currentLang); + } + + updateActiveFlag(selectedLanguage: string): void { + if (this.jhiActiveMenu === selectedLanguage) { + this.renderer.addClass(this.el.nativeElement, 'active'); + } else { + this.renderer.removeClass(this.el.nativeElement, 'active'); + } + } +} diff --git a/borestop/src/main/webapp/app/layouts/navbar/navbar.component.html b/borestop/src/main/webapp/app/layouts/navbar/navbar.component.html new file mode 100644 index 0000000000000000000000000000000000000000..9661ba9a8de3e54c3b9625f0fa805e55c43970c7 --- /dev/null +++ b/borestop/src/main/webapp/app/layouts/navbar/navbar.component.html @@ -0,0 +1,152 @@ +<nav class="navbar navbar-dark navbar-expand-md bg-dark"> + <a class="navbar-brand logo" routerLink="/" (click)="collapseNavbar()"> + <span class="logo-img"></span> + <span jhiTranslate="global.title" class="navbar-title">Borestop</span> <span class="navbar-version">{{ version }}</span> + </a> + <a class="navbar-toggler d-lg-none" href="javascript:void(0);" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation" (click)="toggleNavbar()"> + <fa-icon icon="bars"></fa-icon> + </a> + <div class="navbar-collapse collapse" id="navbarResponsive" [ngbCollapse]="isNavbarCollapsed" [ngSwitch]="isAuthenticated()"> + <ul class="navbar-nav ml-auto"> + <li class="nav-item" routerLinkActive="active" [routerLinkActiveOptions]="{ exact: true }"> + <a class="nav-link" routerLink="/" (click)="collapseNavbar()"> + <span> + <fa-icon icon="home"></fa-icon> + <span jhiTranslate="global.menu.home">Home</span> + </span> + </a> + </li> + <!-- jhipster-needle-add-element-to-menu - JHipster will add new menu items here --> + <li *ngSwitchCase="true" ngbDropdown class="nav-item dropdown pointer" display="dynamic" routerLinkActive="active" [routerLinkActiveOptions]="{ exact: true }"> + <a class="nav-link dropdown-toggle" ngbDropdownToggle href="javascript:void(0);" id="entity-menu"> + <span> + <fa-icon icon="th-list"></fa-icon> + <span jhiTranslate="global.menu.entities.main"> + Entities + </span> + </span> + </a> + <ul class="dropdown-menu" ngbDropdownMenu aria-labelledby="entity-menu"> + <!-- jhipster-needle-add-entity-to-menu - JHipster will add entities to the menu here --> + </ul> + </li> + <li *jhiHasAnyAuthority="'ROLE_ADMIN'" ngbDropdown class="nav-item dropdown pointer" display="dynamic" routerLinkActive="active" [routerLinkActiveOptions]="{ exact: true }"> + <a class="nav-link dropdown-toggle" ngbDropdownToggle href="javascript:void(0);" id="admin-menu"> + <span> + <fa-icon icon="user-plus"></fa-icon> + <span jhiTranslate="global.menu.admin.main">Administration</span> + </span> + </a> + <ul class="dropdown-menu" ngbDropdownMenu aria-labelledby="admin-menu"> + <li> + <a class="dropdown-item" routerLink="admin/user-management" routerLinkActive="active" (click)="collapseNavbar()"> + <fa-icon icon="user" [fixedWidth]="true"></fa-icon> + <span jhiTranslate="global.menu.admin.userManagement">User management</span> + </a> + </li> + <li> + <a class="dropdown-item" routerLink="admin/metrics" routerLinkActive="active" (click)="collapseNavbar()"> + <fa-icon icon="tachometer-alt" [fixedWidth]="true"></fa-icon> + <span jhiTranslate="global.menu.admin.metrics">Metrics</span> + </a> + </li> + <li> + <a class="dropdown-item" routerLink="admin/health" routerLinkActive="active" (click)="collapseNavbar()"> + <fa-icon icon="heart" [fixedWidth]="true"></fa-icon> + <span jhiTranslate="global.menu.admin.health">Health</span> + </a> + </li> + <li> + <a class="dropdown-item" routerLink="admin/configuration" routerLinkActive="active" (click)="collapseNavbar()"> + <fa-icon icon="list" [fixedWidth]="true"></fa-icon> + <span jhiTranslate="global.menu.admin.configuration">Configuration</span> + </a> + </li> + <li> + <a class="dropdown-item" routerLink="admin/audits" routerLinkActive="active" (click)="collapseNavbar()"> + <fa-icon icon="bell" [fixedWidth]="true"></fa-icon> + <span jhiTranslate="global.menu.admin.audits">Audits</span> + </a> + </li> + <li> + <a class="dropdown-item" routerLink="admin/logs" routerLinkActive="active" (click)="collapseNavbar()"> + <fa-icon icon="tasks" [fixedWidth]="true"></fa-icon> + <span jhiTranslate="global.menu.admin.logs">Logs</span> + </a> + </li> + <li *ngIf="swaggerEnabled"> + <a class="dropdown-item" routerLink="admin/docs" routerLinkActive="active" (click)="collapseNavbar()"> + <fa-icon icon="book" [fixedWidth]="true"></fa-icon> + <span jhiTranslate="global.menu.admin.apidocs">API</span> + </a> + </li> + <!-- jhipster-needle-add-element-to-admin-menu - JHipster will add entities to the admin menu here --> + <li *ngIf="!inProduction"> + <a class="dropdown-item" href='./h2-console' target="_tab" (click)="collapseNavbar()"> + <fa-icon icon="hdd" [fixedWidth]="true"></fa-icon> + <span jhiTranslate="global.menu.admin.database">Database</span> + </a> + </li> + </ul> + </li> + <li ngbDropdown class="nav-item dropdown pointer" display="dynamic" *ngIf="languages && languages.length > 1"> + <a class="nav-link dropdown-toggle" ngbDropdownToggle href="javascript:void(0);" id="languagesnavBarDropdown"> + <span> + <fa-icon icon="flag"></fa-icon> + <span jhiTranslate="global.menu.language">Language</span> + </span> + </a> + <ul class="dropdown-menu" ngbDropdownMenu aria-labelledby="languagesnavBarDropdown"> + <li *ngFor="let language of languages"> + <a class="dropdown-item" [jhiActiveMenu]="language" href="javascript:void(0);" (click)="changeLanguage(language);collapseNavbar();">{{ language | findLanguageFromKey }}</a> + </li> + </ul> + </li> + <li ngbDropdown class="nav-item dropdown pointer" display="dynamic" routerLinkActive="active" [routerLinkActiveOptions]="{ exact: true }"> + <a class="nav-link dropdown-toggle" ngbDropdownToggle href="javascript:void(0);" id="account-menu"> + <span *ngIf="!getImageUrl()"> + <fa-icon icon="user"></fa-icon> + <span jhiTranslate="global.menu.account.main"> + Account + </span> + </span> + <span *ngIf="getImageUrl()"> + <img [src]="getImageUrl()" class="profile-image rounded-circle" alt="Avatar"> + </span> + </a> + <ul class="dropdown-menu" ngbDropdownMenu aria-labelledby="account-menu"> + <li *ngSwitchCase="true"> + <a class="dropdown-item" routerLink="account/settings" routerLinkActive="active" (click)="collapseNavbar()"> + <fa-icon icon="wrench" [fixedWidth]="true"></fa-icon> + <span jhiTranslate="global.menu.account.settings">Settings</span> + </a> + </li> + <li *ngSwitchCase="true"> + <a class="dropdown-item" routerLink="account/password" routerLinkActive="active" (click)="collapseNavbar()"> + <fa-icon icon="lock" [fixedWidth]="true"></fa-icon> + <span jhiTranslate="global.menu.account.password">Password</span> + </a> + </li> + <li *ngSwitchCase="true"> + <a class="dropdown-item" (click)="logout()" id="logout"> + <fa-icon icon="sign-out-alt" [fixedWidth]="true"></fa-icon> + <span jhiTranslate="global.menu.account.logout">Sign out</span> + </a> + </li> + <li *ngSwitchCase="false"> + <a class="dropdown-item" (click)="login()" id="login"> + <fa-icon icon="sign-in-alt" [fixedWidth]="true"></fa-icon> + <span jhiTranslate="global.menu.account.login">Sign in</span> + </a> + </li> + <li *ngSwitchCase="false"> + <a class="dropdown-item" routerLink="account/register" routerLinkActive="active" (click)="collapseNavbar()"> + <fa-icon icon="user-plus" [fixedWidth]="true"></fa-icon> + <span jhiTranslate="global.menu.account.register">Register</span> + </a> + </li> + </ul> + </li> + </ul> + </div> +</nav> diff --git a/borestop/src/main/webapp/app/layouts/navbar/navbar.component.ts b/borestop/src/main/webapp/app/layouts/navbar/navbar.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..52f8bafbb0e3b88f45f2a59a97dca161a4e47455 --- /dev/null +++ b/borestop/src/main/webapp/app/layouts/navbar/navbar.component.ts @@ -0,0 +1,74 @@ +import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import { JhiLanguageService } from 'ng-jhipster'; +import { SessionStorageService } from 'ngx-webstorage'; + +import { VERSION } from 'app/app.constants'; +import { LANGUAGES } from 'app/core/language/language.constants'; +import { AccountService } from 'app/core/auth/account.service'; +import { LoginModalService } from 'app/core/login/login-modal.service'; +import { LoginService } from 'app/core/login/login.service'; +import { ProfileService } from 'app/layouts/profiles/profile.service'; + +@Component({ + selector: 'jhi-navbar', + templateUrl: './navbar.component.html', + styleUrls: ['navbar.scss'] +}) +export class NavbarComponent implements OnInit { + inProduction?: boolean; + isNavbarCollapsed = true; + languages = LANGUAGES; + swaggerEnabled?: boolean; + version: string; + + constructor( + private loginService: LoginService, + private languageService: JhiLanguageService, + private sessionStorage: SessionStorageService, + private accountService: AccountService, + private loginModalService: LoginModalService, + private profileService: ProfileService, + private router: Router + ) { + this.version = VERSION ? (VERSION.toLowerCase().startsWith('v') ? VERSION : 'v' + VERSION) : ''; + } + + ngOnInit(): void { + this.profileService.getProfileInfo().subscribe(profileInfo => { + this.inProduction = profileInfo.inProduction; + this.swaggerEnabled = profileInfo.swaggerEnabled; + }); + } + + changeLanguage(languageKey: string): void { + this.sessionStorage.store('locale', languageKey); + this.languageService.changeLanguage(languageKey); + } + + collapseNavbar(): void { + this.isNavbarCollapsed = true; + } + + isAuthenticated(): boolean { + return this.accountService.isAuthenticated(); + } + + login(): void { + this.loginModalService.open(); + } + + logout(): void { + this.collapseNavbar(); + this.loginService.logout(); + this.router.navigate(['']); + } + + toggleNavbar(): void { + this.isNavbarCollapsed = !this.isNavbarCollapsed; + } + + getImageUrl(): string { + return this.isAuthenticated() ? this.accountService.getImageUrl() : ''; + } +} diff --git a/borestop/src/main/webapp/app/layouts/navbar/navbar.route.ts b/borestop/src/main/webapp/app/layouts/navbar/navbar.route.ts new file mode 100644 index 0000000000000000000000000000000000000000..35191434e6efff268937bdb87fa4dc8c8a6f0594 --- /dev/null +++ b/borestop/src/main/webapp/app/layouts/navbar/navbar.route.ts @@ -0,0 +1,9 @@ +import { Route } from '@angular/router'; + +import { NavbarComponent } from './navbar.component'; + +export const navbarRoute: Route = { + path: '', + component: NavbarComponent, + outlet: 'navbar' +}; diff --git a/borestop/src/main/webapp/app/layouts/navbar/navbar.scss b/borestop/src/main/webapp/app/layouts/navbar/navbar.scss new file mode 100644 index 0000000000000000000000000000000000000000..1ff209b76d383ae0bf9d0ab9378f5a2188cfc9c6 --- /dev/null +++ b/borestop/src/main/webapp/app/layouts/navbar/navbar.scss @@ -0,0 +1,42 @@ +@import '~bootstrap/scss/functions'; +@import '~bootstrap/scss/variables'; + +/* ========================================================================== +Navbar +========================================================================== */ + +.navbar-version { + font-size: 0.65em; + color: $navbar-dark-color; +} + +.profile-image { + height: 1.75em; + width: 1.75em; +} + +.navbar { + padding: 0.2rem 1rem; + + ul.navbar-nav { + .nav-item { + margin-left: 0.5em; + } + } + + a.nav-link { + font-weight: 400; + } +} + +/* ========================================================================== +Logo styles +========================================================================== */ +.logo-img { + height: 45px; + width: 45px; + display: inline-block; + vertical-align: middle; + background: url('../../../content/images/logo-jhipster.png') no-repeat center center; + background-size: contain; +} diff --git a/borestop/src/main/webapp/app/layouts/profiles/page-ribbon.component.ts b/borestop/src/main/webapp/app/layouts/profiles/page-ribbon.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..040a82f3b9c7a59653e5d53dce0fd43ef7818d32 --- /dev/null +++ b/borestop/src/main/webapp/app/layouts/profiles/page-ribbon.component.ts @@ -0,0 +1,23 @@ +import { Component, OnInit } from '@angular/core'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { ProfileService } from './profile.service'; + +@Component({ + selector: 'jhi-page-ribbon', + template: ` + <div class="ribbon" *ngIf="ribbonEnv$ | async as ribbonEnv"> + <a href="" jhiTranslate="global.ribbon.{{ ribbonEnv }}">{{ ribbonEnv }}</a> + </div> + `, + styleUrls: ['page-ribbon.scss'] +}) +export class PageRibbonComponent implements OnInit { + ribbonEnv$?: Observable<string | undefined>; + + constructor(private profileService: ProfileService) {} + + ngOnInit(): void { + this.ribbonEnv$ = this.profileService.getProfileInfo().pipe(map(profileInfo => profileInfo.ribbonEnv)); + } +} diff --git a/borestop/src/main/webapp/app/layouts/profiles/page-ribbon.scss b/borestop/src/main/webapp/app/layouts/profiles/page-ribbon.scss new file mode 100644 index 0000000000000000000000000000000000000000..a78f26800b3a8ce19e0205b41470833f0e8ef46a --- /dev/null +++ b/borestop/src/main/webapp/app/layouts/profiles/page-ribbon.scss @@ -0,0 +1,31 @@ +/* ========================================================================== +Developement Ribbon +========================================================================== */ +.ribbon { + background-color: rgba(170, 0, 0, 0.5); + left: -3.5em; + -moz-transform: rotate(-45deg); + -ms-transform: rotate(-45deg); + -o-transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + overflow: hidden; + position: absolute; + top: 40px; + white-space: nowrap; + width: 15em; + z-index: 9999; + pointer-events: none; + opacity: 0.75; + a { + color: #fff; + display: block; + font-weight: 400; + margin: 1px 0; + padding: 10px 50px; + text-align: center; + text-decoration: none; + text-shadow: 0 0 5px #444; + pointer-events: none; + } +} diff --git a/borestop/src/main/webapp/app/layouts/profiles/profile-info.model.ts b/borestop/src/main/webapp/app/layouts/profiles/profile-info.model.ts new file mode 100644 index 0000000000000000000000000000000000000000..e7763eeaf3ed2a4fa88b5ada794e1fa66a97a4da --- /dev/null +++ b/borestop/src/main/webapp/app/layouts/profiles/profile-info.model.ts @@ -0,0 +1,15 @@ +export interface InfoResponse { + 'display-ribbon-on-profiles'?: string; + git?: any; + build?: any; + activeProfiles?: string[]; +} + +export class ProfileInfo { + constructor( + public activeProfiles?: string[], + public ribbonEnv?: string, + public inProduction?: boolean, + public swaggerEnabled?: boolean + ) {} +} diff --git a/borestop/src/main/webapp/app/layouts/profiles/profile.service.ts b/borestop/src/main/webapp/app/layouts/profiles/profile.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..f1512d332bb8f650ee75c380dc5f02d1ae3d8261 --- /dev/null +++ b/borestop/src/main/webapp/app/layouts/profiles/profile.service.ts @@ -0,0 +1,43 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { map, shareReplay } from 'rxjs/operators'; +import { Observable } from 'rxjs'; + +import { SERVER_API_URL } from 'app/app.constants'; +import { ProfileInfo, InfoResponse } from './profile-info.model'; + +@Injectable({ providedIn: 'root' }) +export class ProfileService { + private infoUrl = SERVER_API_URL + 'management/info'; + private profileInfo$!: Observable<ProfileInfo>; + + constructor(private http: HttpClient) {} + + getProfileInfo(): Observable<ProfileInfo> { + if (this.profileInfo$) { + return this.profileInfo$; + } + + this.profileInfo$ = this.http.get<InfoResponse>(this.infoUrl).pipe( + map((response: InfoResponse) => { + const profileInfo: ProfileInfo = { + activeProfiles: response.activeProfiles, + inProduction: response.activeProfiles && response.activeProfiles.includes('prod'), + swaggerEnabled: response.activeProfiles && response.activeProfiles.includes('swagger') + }; + if (response.activeProfiles && response['display-ribbon-on-profiles']) { + const displayRibbonOnProfiles = response['display-ribbon-on-profiles'].split(','); + const ribbonProfiles = displayRibbonOnProfiles.filter( + profile => response.activeProfiles && response.activeProfiles.includes(profile) + ); + if (ribbonProfiles.length > 0) { + profileInfo.ribbonEnv = ribbonProfiles[0]; + } + } + return profileInfo; + }), + shareReplay() + ); + return this.profileInfo$; + } +} diff --git a/borestop/src/main/webapp/app/polyfills.ts b/borestop/src/main/webapp/app/polyfills.ts new file mode 100644 index 0000000000000000000000000000000000000000..f8a8d65e60d01ad67ee5cfbc1b8b8326d92c5d43 --- /dev/null +++ b/borestop/src/main/webapp/app/polyfills.ts @@ -0,0 +1,3 @@ +import 'zone.js/dist/zone'; +import '@angular/localize/init'; +require('../manifest.webapp'); diff --git a/borestop/src/main/webapp/app/shared/alert/alert-error.component.ts b/borestop/src/main/webapp/app/shared/alert/alert-error.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..7e2fe87fb8f8347e7072b3b30481564ff0287179 --- /dev/null +++ b/borestop/src/main/webapp/app/shared/alert/alert-error.component.ts @@ -0,0 +1,123 @@ +import { Component, OnDestroy } from '@angular/core'; +import { HttpErrorResponse } from '@angular/common/http'; +import { TranslateService } from '@ngx-translate/core'; +import { JhiEventManager, JhiAlert, JhiAlertService, JhiEventWithContent } from 'ng-jhipster'; +import { Subscription } from 'rxjs'; + +import { AlertError } from './alert-error.model'; + +@Component({ + selector: 'jhi-alert-error', + template: ` + <div class="alerts" role="alert"> + <div *ngFor="let alert of alerts" [ngClass]="setClasses(alert)"> + <ngb-alert *ngIf="alert && alert.type && alert.msg" [type]="alert.type" (close)="close(alert)"> + <pre [innerHTML]="alert.msg"></pre> + </ngb-alert> + </div> + </div> + ` +}) +export class AlertErrorComponent implements OnDestroy { + alerts: JhiAlert[] = []; + errorListener: Subscription; + httpErrorListener: Subscription; + + constructor(private alertService: JhiAlertService, private eventManager: JhiEventManager, translateService: TranslateService) { + this.errorListener = eventManager.subscribe('borestopApp.error', (response: JhiEventWithContent<AlertError>) => { + const errorResponse = response.content; + this.addErrorAlert(errorResponse.message, errorResponse.key, errorResponse.params); + }); + + this.httpErrorListener = eventManager.subscribe('borestopApp.httpError', (response: JhiEventWithContent<HttpErrorResponse>) => { + const httpErrorResponse = response.content; + switch (httpErrorResponse.status) { + // connection refused, server not reachable + case 0: + this.addErrorAlert('Server not reachable', 'error.server.not.reachable'); + break; + + case 400: { + const arr = httpErrorResponse.headers.keys(); + let errorHeader = null; + let entityKey = null; + arr.forEach(entry => { + if (entry.toLowerCase().endsWith('app-error')) { + errorHeader = httpErrorResponse.headers.get(entry); + } else if (entry.toLowerCase().endsWith('app-params')) { + entityKey = httpErrorResponse.headers.get(entry); + } + }); + if (errorHeader) { + const entityName = translateService.instant('global.menu.entities.' + entityKey); + this.addErrorAlert(errorHeader, errorHeader, { entityName }); + } else if (httpErrorResponse.error !== '' && httpErrorResponse.error.fieldErrors) { + const fieldErrors = httpErrorResponse.error.fieldErrors; + for (const fieldError of fieldErrors) { + if (['Min', 'Max', 'DecimalMin', 'DecimalMax'].includes(fieldError.message)) { + fieldError.message = 'Size'; + } + // convert 'something[14].other[4].id' to 'something[].other[].id' so translations can be written to it + const convertedField = fieldError.field.replace(/\[\d*\]/g, '[]'); + const fieldName = translateService.instant('borestopApp.' + fieldError.objectName + '.' + convertedField); + this.addErrorAlert('Error on field "' + fieldName + '"', 'error.' + fieldError.message, { fieldName }); + } + } else if (httpErrorResponse.error !== '' && httpErrorResponse.error.message) { + this.addErrorAlert(httpErrorResponse.error.message, httpErrorResponse.error.message, httpErrorResponse.error.params); + } else { + this.addErrorAlert(httpErrorResponse.error); + } + break; + } + + case 404: + this.addErrorAlert('Not found', 'error.url.not.found'); + break; + + default: + if (httpErrorResponse.error !== '' && httpErrorResponse.error.message) { + this.addErrorAlert(httpErrorResponse.error.message); + } else { + this.addErrorAlert(httpErrorResponse.error); + } + } + }); + } + + setClasses(alert: JhiAlert): { [key: string]: boolean } { + const classes = { 'jhi-toast': Boolean(alert.toast) }; + if (alert.position) { + return { ...classes, [alert.position]: true }; + } + return classes; + } + + ngOnDestroy(): void { + if (this.errorListener) { + this.eventManager.destroy(this.errorListener); + } + if (this.httpErrorListener) { + this.eventManager.destroy(this.httpErrorListener); + } + } + + addErrorAlert(message: string, key?: string, data?: any): void { + message = key && key !== null ? key : message; + + const newAlert: JhiAlert = { + type: 'danger', + msg: message, + params: data, + timeout: 5000, + toast: this.alertService.isToast(), + scoped: true + }; + + this.alerts.push(this.alertService.addAlert(newAlert, this.alerts)); + } + + close(alert: JhiAlert): void { + // NOSONAR can be removed after https://github.com/SonarSource/SonarJS/issues/1930 is resolved + alert.close?.(this.alerts); // NOSONAR + } +} diff --git a/borestop/src/main/webapp/app/shared/alert/alert-error.model.ts b/borestop/src/main/webapp/app/shared/alert/alert-error.model.ts new file mode 100644 index 0000000000000000000000000000000000000000..e76241a2e4b8d49bcd7dc5319968700396f176d6 --- /dev/null +++ b/borestop/src/main/webapp/app/shared/alert/alert-error.model.ts @@ -0,0 +1,3 @@ +export class AlertError { + constructor(public message: string, public key?: string, public params?: any) {} +} diff --git a/borestop/src/main/webapp/app/shared/alert/alert.component.ts b/borestop/src/main/webapp/app/shared/alert/alert.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..3cc5bbc725f036eddd992726ac646eed257f105d --- /dev/null +++ b/borestop/src/main/webapp/app/shared/alert/alert.component.ts @@ -0,0 +1,41 @@ +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { JhiAlertService, JhiAlert } from 'ng-jhipster'; + +@Component({ + selector: 'jhi-alert', + template: ` + <div class="alerts" role="alert"> + <div *ngFor="let alert of alerts" [ngClass]="setClasses(alert)"> + <ngb-alert *ngIf="alert && alert.type && alert.msg" [type]="alert.type" (close)="close(alert)"> + <pre [innerHTML]="alert.msg"></pre> + </ngb-alert> + </div> + </div> + ` +}) +export class AlertComponent implements OnInit, OnDestroy { + alerts: JhiAlert[] = []; + + constructor(private alertService: JhiAlertService) {} + + ngOnInit(): void { + this.alerts = this.alertService.get(); + } + + setClasses(alert: JhiAlert): { [key: string]: boolean } { + const classes = { 'jhi-toast': Boolean(alert.toast) }; + if (alert.position) { + return { ...classes, [alert.position]: true }; + } + return classes; + } + + ngOnDestroy(): void { + this.alertService.clear(); + } + + close(alert: JhiAlert): void { + // NOSONAR can be removed after https://github.com/SonarSource/SonarJS/issues/1930 is resolved + alert.close?.(this.alerts); // NOSONAR + } +} diff --git a/borestop/src/main/webapp/app/shared/auth/has-any-authority.directive.ts b/borestop/src/main/webapp/app/shared/auth/has-any-authority.directive.ts new file mode 100644 index 0000000000000000000000000000000000000000..568c81c44e8aabbb2e5eca081397c8d33aa39315 --- /dev/null +++ b/borestop/src/main/webapp/app/shared/auth/has-any-authority.directive.ts @@ -0,0 +1,47 @@ +import { Directive, Input, TemplateRef, ViewContainerRef, OnDestroy } from '@angular/core'; +import { Subscription } from 'rxjs'; + +import { AccountService } from 'app/core/auth/account.service'; + +/** + * @whatItDoes Conditionally includes an HTML element if current user has any + * of the authorities passed as the `expression`. + * + * @howToUse + * ``` + * <some-element *jhiHasAnyAuthority="'ROLE_ADMIN'">...</some-element> + * + * <some-element *jhiHasAnyAuthority="['ROLE_ADMIN', 'ROLE_USER']">...</some-element> + * ``` + */ +@Directive({ + selector: '[jhiHasAnyAuthority]' +}) +export class HasAnyAuthorityDirective implements OnDestroy { + private authorities: string[] = []; + private authenticationSubscription?: Subscription; + + constructor(private accountService: AccountService, private templateRef: TemplateRef<any>, private viewContainerRef: ViewContainerRef) {} + + @Input() + set jhiHasAnyAuthority(value: string | string[]) { + this.authorities = typeof value === 'string' ? [value] : value; + this.updateView(); + // Get notified each time authentication state changes. + this.authenticationSubscription = this.accountService.getAuthenticationState().subscribe(() => this.updateView()); + } + + ngOnDestroy(): void { + if (this.authenticationSubscription) { + this.authenticationSubscription.unsubscribe(); + } + } + + private updateView(): void { + const hasAnyAuthority = this.accountService.hasAnyAuthority(this.authorities); + this.viewContainerRef.clear(); + if (hasAnyAuthority) { + this.viewContainerRef.createEmbeddedView(this.templateRef); + } + } +} diff --git a/borestop/src/main/webapp/app/shared/constants/authority.constants.ts b/borestop/src/main/webapp/app/shared/constants/authority.constants.ts new file mode 100644 index 0000000000000000000000000000000000000000..9f672ce7a7f077b96397d38d3360f543802cfee6 --- /dev/null +++ b/borestop/src/main/webapp/app/shared/constants/authority.constants.ts @@ -0,0 +1,4 @@ +export enum Authority { + ADMIN = 'ROLE_ADMIN', + USER = 'ROLE_USER' +} diff --git a/borestop/src/main/webapp/app/shared/constants/error.constants.ts b/borestop/src/main/webapp/app/shared/constants/error.constants.ts new file mode 100644 index 0000000000000000000000000000000000000000..42d91d97dbbd58bd588278085e8aab874d5656d5 --- /dev/null +++ b/borestop/src/main/webapp/app/shared/constants/error.constants.ts @@ -0,0 +1,3 @@ +export const PROBLEM_BASE_URL = 'https://www.jhipster.tech/problem'; +export const EMAIL_ALREADY_USED_TYPE = PROBLEM_BASE_URL + '/email-already-used'; +export const LOGIN_ALREADY_USED_TYPE = PROBLEM_BASE_URL + '/login-already-used'; diff --git a/borestop/src/main/webapp/app/shared/constants/input.constants.ts b/borestop/src/main/webapp/app/shared/constants/input.constants.ts new file mode 100644 index 0000000000000000000000000000000000000000..1e3978a9b3c5ff453d3ed535174a6d6bbc5668c1 --- /dev/null +++ b/borestop/src/main/webapp/app/shared/constants/input.constants.ts @@ -0,0 +1,2 @@ +export const DATE_FORMAT = 'YYYY-MM-DD'; +export const DATE_TIME_FORMAT = 'YYYY-MM-DDTHH:mm'; diff --git a/borestop/src/main/webapp/app/shared/constants/pagination.constants.ts b/borestop/src/main/webapp/app/shared/constants/pagination.constants.ts new file mode 100644 index 0000000000000000000000000000000000000000..a148d4579ba322f3a95a0af2a5d080c6b246efee --- /dev/null +++ b/borestop/src/main/webapp/app/shared/constants/pagination.constants.ts @@ -0,0 +1 @@ +export const ITEMS_PER_PAGE = 20; diff --git a/borestop/src/main/webapp/app/shared/language/find-language-from-key.pipe.ts b/borestop/src/main/webapp/app/shared/language/find-language-from-key.pipe.ts new file mode 100644 index 0000000000000000000000000000000000000000..bfefb96dfc958d20dc8379a9b54e5e7a80fc6205 --- /dev/null +++ b/borestop/src/main/webapp/app/shared/language/find-language-from-key.pipe.ts @@ -0,0 +1,13 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ name: 'findLanguageFromKey' }) +export class FindLanguageFromKeyPipe implements PipeTransform { + private languages: { [key: string]: { name: string; rtl?: boolean } } = { + en: { name: 'English' } + // jhipster-needle-i18n-language-key-pipe - JHipster will add/remove languages in this object + }; + + transform(lang: string): string { + return this.languages[lang].name; + } +} diff --git a/borestop/src/main/webapp/app/shared/login/login.component.html b/borestop/src/main/webapp/app/shared/login/login.component.html new file mode 100644 index 0000000000000000000000000000000000000000..dcd23c1327e99ae129768fe2c89b6dd5807ca53a --- /dev/null +++ b/borestop/src/main/webapp/app/shared/login/login.component.html @@ -0,0 +1,51 @@ +<div class="modal-header"> + <h4 class="modal-title" jhiTranslate="login.title">Sign in</h4> + + <button aria-label="Close" data-dismiss="modal" class="close" type="button" (click)="activeModal.dismiss('closed')"> + <span aria-hidden="true">x</span> + </button> +</div> + +<div class="modal-body"> + <div class="row justify-content-center"> + <div class="col-md-8"> + <div class="alert alert-danger" *ngIf="authenticationError" jhiTranslate="login.messages.error.authentication"> + <strong>Failed to sign in!</strong> Please check your credentials and try again. + </div> + </div> + + <div class="col-md-8"> + <form class="form" role="form" (ngSubmit)="login()" [formGroup]="loginForm"> + <div class="form-group"> + <label class="username-label" for="username" jhiTranslate="global.form.username.label">Login</label> + <input type="text" class="form-control" name="username" id="username" placeholder="{{ 'global.form.username.placeholder' | translate }}" + formControlName="username" #username> + </div> + + <div class="form-group"> + <label for="password" jhiTranslate="login.form.password">Password</label> + <input type="password" class="form-control" name="password" id="password" placeholder="{{ 'login.form.password.placeholder' | translate }}" + formControlName="password"> + </div> + + <div class="form-check"> + <label class="form-check-label" for="rememberMe"> + <input class="form-check-input" type="checkbox" name="rememberMe" id="rememberMe" formControlName="rememberMe"> + <span jhiTranslate="login.form.rememberme">Remember me</span> + </label> + </div> + + <button type="submit" class="btn btn-primary" jhiTranslate="login.form.button">Sign in</button> + </form> + + <div class="mt-3 alert alert-warning"> + <a class="alert-link" (click)="requestResetPassword()" jhiTranslate="login.password.forgot">Did you forget your password?</a> + </div> + + <div class="alert alert-warning"> + <span jhiTranslate="global.messages.info.register.noaccount">You don't have an account yet?</span> + <a class="alert-link" (click)="register()" jhiTranslate="global.messages.info.register.link">Register a new account</a> + </div> + </div> + </div> +</div> diff --git a/borestop/src/main/webapp/app/shared/login/login.component.ts b/borestop/src/main/webapp/app/shared/login/login.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..9fffdae9021a449cf10607843d7f63e5c27c8f25 --- /dev/null +++ b/borestop/src/main/webapp/app/shared/login/login.component.ts @@ -0,0 +1,73 @@ +import { Component, AfterViewInit, ElementRef, ViewChild } from '@angular/core'; +import { FormBuilder } from '@angular/forms'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; +import { Router } from '@angular/router'; + +import { LoginService } from 'app/core/login/login.service'; + +@Component({ + selector: 'jhi-login-modal', + templateUrl: './login.component.html' +}) +export class LoginModalComponent implements AfterViewInit { + @ViewChild('username', { static: false }) + username?: ElementRef; + + authenticationError = false; + + loginForm = this.fb.group({ + username: [''], + password: [''], + rememberMe: [false] + }); + + constructor(private loginService: LoginService, private router: Router, public activeModal: NgbActiveModal, private fb: FormBuilder) {} + + ngAfterViewInit(): void { + if (this.username) { + this.username.nativeElement.focus(); + } + } + + cancel(): void { + this.authenticationError = false; + this.loginForm.patchValue({ + username: '', + password: '' + }); + this.activeModal.dismiss('cancel'); + } + + login(): void { + this.loginService + .login({ + username: this.loginForm.get('username')!.value, + password: this.loginForm.get('password')!.value, + rememberMe: this.loginForm.get('rememberMe')!.value + }) + .subscribe( + () => { + this.authenticationError = false; + this.activeModal.close(); + if ( + this.router.url === '/account/register' || + this.router.url.startsWith('/account/activate') || + this.router.url.startsWith('/account/reset/') + ) { + this.router.navigate(['']); + } + }, + () => (this.authenticationError = true) + ); + } + + register(): void { + this.activeModal.dismiss('to state register'); + this.router.navigate(['/account/register']); + } + + requestResetPassword(): void { + this.activeModal.dismiss('to state requestReset'); + this.router.navigate(['/account/reset', 'request']); + } +} diff --git a/borestop/src/main/webapp/app/shared/shared-libs.module.ts b/borestop/src/main/webapp/app/shared/shared-libs.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..8c3e995588911b25b49163daf1f36ad66129aedd --- /dev/null +++ b/borestop/src/main/webapp/app/shared/shared-libs.module.ts @@ -0,0 +1,22 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; +import { NgJhipsterModule } from 'ng-jhipster'; +import { InfiniteScrollModule } from 'ngx-infinite-scroll'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { TranslateModule } from '@ngx-translate/core'; + +@NgModule({ + exports: [ + FormsModule, + CommonModule, + NgbModule, + NgJhipsterModule, + InfiniteScrollModule, + FontAwesomeModule, + ReactiveFormsModule, + TranslateModule + ] +}) +export class BorestopSharedLibsModule {} diff --git a/borestop/src/main/webapp/app/shared/shared.module.ts b/borestop/src/main/webapp/app/shared/shared.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..d9b9ac2e63eb04194df78ae0e6cdf149fd621694 --- /dev/null +++ b/borestop/src/main/webapp/app/shared/shared.module.ts @@ -0,0 +1,22 @@ +import { NgModule } from '@angular/core'; +import { BorestopSharedLibsModule } from './shared-libs.module'; +import { FindLanguageFromKeyPipe } from './language/find-language-from-key.pipe'; +import { AlertComponent } from './alert/alert.component'; +import { AlertErrorComponent } from './alert/alert-error.component'; +import { LoginModalComponent } from './login/login.component'; +import { HasAnyAuthorityDirective } from './auth/has-any-authority.directive'; + +@NgModule({ + imports: [BorestopSharedLibsModule], + declarations: [FindLanguageFromKeyPipe, AlertComponent, AlertErrorComponent, LoginModalComponent, HasAnyAuthorityDirective], + entryComponents: [LoginModalComponent], + exports: [ + BorestopSharedLibsModule, + FindLanguageFromKeyPipe, + AlertComponent, + AlertErrorComponent, + LoginModalComponent, + HasAnyAuthorityDirective + ] +}) +export class BorestopSharedModule {} diff --git a/borestop/src/main/webapp/app/shared/util/datepicker-adapter.ts b/borestop/src/main/webapp/app/shared/util/datepicker-adapter.ts new file mode 100644 index 0000000000000000000000000000000000000000..027f12317ca3356f1c56c9d9136a65ba483d5577 --- /dev/null +++ b/borestop/src/main/webapp/app/shared/util/datepicker-adapter.ts @@ -0,0 +1,23 @@ +/** + * Angular bootstrap Date adapter + */ +import { Injectable } from '@angular/core'; +import { NgbDateAdapter, NgbDateStruct } from '@ng-bootstrap/ng-bootstrap'; +import { Moment } from 'moment'; +import * as moment from 'moment'; + +@Injectable() +export class NgbDateMomentAdapter extends NgbDateAdapter<Moment> { + fromModel(date: Moment): NgbDateStruct { + if (date && moment.isMoment(date) && date.isValid()) { + return { year: date.year(), month: date.month() + 1, day: date.date() }; + } + // ! can be removed after https://github.com/ng-bootstrap/ng-bootstrap/issues/1544 is resolved + return null!; + } + + toModel(date: NgbDateStruct): Moment { + // ! after null can be removed after https://github.com/ng-bootstrap/ng-bootstrap/issues/1544 is resolved + return date ? moment(date.year + '-' + date.month + '-' + date.day, 'YYYY-MM-DD') : null!; + } +} diff --git a/borestop/src/main/webapp/app/shared/util/request-util.ts b/borestop/src/main/webapp/app/shared/util/request-util.ts new file mode 100644 index 0000000000000000000000000000000000000000..f839fd6c78cf8470c612c26caab7d5b78677a397 --- /dev/null +++ b/borestop/src/main/webapp/app/shared/util/request-util.ts @@ -0,0 +1,33 @@ +import { HttpParams } from '@angular/common/http'; + +export interface Pagination { + page: number; + size: number; + sort: string[]; +} + +export interface Search { + query: string; +} + +export interface SearchWithPagination extends Search, Pagination {} + +export const createRequestOption = (req?: any): HttpParams => { + let options: HttpParams = new HttpParams(); + + if (req) { + Object.keys(req).forEach(key => { + if (key !== 'sort') { + options = options.set(key, req[key]); + } + }); + + if (req.sort) { + req.sort.forEach((val: string) => { + options = options.append('sort', val); + }); + } + } + + return options; +}; diff --git a/borestop/src/main/webapp/app/vendor.ts b/borestop/src/main/webapp/app/vendor.ts new file mode 100644 index 0000000000000000000000000000000000000000..a89c6da31d30c08ea291cec05839625729c6ec20 --- /dev/null +++ b/borestop/src/main/webapp/app/vendor.ts @@ -0,0 +1,2 @@ +/* after changing this file run 'npm run webpack:build' */ +import '../content/scss/vendor.scss'; diff --git a/borestop/src/main/webapp/content/css/loading.css b/borestop/src/main/webapp/content/css/loading.css new file mode 100644 index 0000000000000000000000000000000000000000..b2c662687ceacce41dcc64708b2059464233dea0 --- /dev/null +++ b/borestop/src/main/webapp/content/css/loading.css @@ -0,0 +1,152 @@ +@keyframes lds-pacman-1 { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 50% { + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + } + 100% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } +} +@-webkit-keyframes lds-pacman-1 { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 50% { + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + } + 100% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } +} +@keyframes lds-pacman-2 { + 0% { + -webkit-transform: rotate(180deg); + transform: rotate(180deg); + } + 50% { + -webkit-transform: rotate(225deg); + transform: rotate(225deg); + } + 100% { + -webkit-transform: rotate(180deg); + transform: rotate(180deg); + } +} +@-webkit-keyframes lds-pacman-2 { + 0% { + -webkit-transform: rotate(180deg); + transform: rotate(180deg); + } + 50% { + -webkit-transform: rotate(225deg); + transform: rotate(225deg); + } + 100% { + -webkit-transform: rotate(180deg); + transform: rotate(180deg); + } +} +@keyframes lds-pacman-3 { + 0% { + -webkit-transform: translate(190px, 0); + transform: translate(190px, 0); + opacity: 0; + } + 20% { + opacity: 1; + } + 100% { + -webkit-transform: translate(70px, 0); + transform: translate(70px, 0); + opacity: 1; + } +} +@-webkit-keyframes lds-pacman-3 { + 0% { + -webkit-transform: translate(190px, 0); + transform: translate(190px, 0); + opacity: 0; + } + 20% { + opacity: 1; + } + 100% { + -webkit-transform: translate(70px, 0); + transform: translate(70px, 0); + opacity: 1; + } +} + +.app-loading { + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; + position: relative; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + top: 10em; +} +.app-loading p { + display: block; + font-size: 1.17em; + margin-inline-start: 0px; + margin-inline-end: 0px; + font-weight: normal; +} + +.app-loading .lds-pacman { + position: relative; + margin: auto; + width: 200px !important; + height: 200px !important; + -webkit-transform: translate(-100px, -100px) scale(1) translate(100px, 100px); + transform: translate(-100px, -100px) scale(1) translate(100px, 100px); +} +.app-loading .lds-pacman > div:nth-child(2) div { + position: absolute; + top: 40px; + left: 40px; + width: 120px; + height: 60px; + border-radius: 120px 120px 0 0; + background: #bbcedd; + -webkit-animation: lds-pacman-1 1s linear infinite; + animation: lds-pacman-1 1s linear infinite; + -webkit-transform-origin: 60px 60px; + transform-origin: 60px 60px; +} +.app-loading .lds-pacman > div:nth-child(2) div:nth-child(2) { + -webkit-animation: lds-pacman-2 1s linear infinite; + animation: lds-pacman-2 1s linear infinite; +} +.app-loading .lds-pacman > div:nth-child(1) div { + position: absolute; + top: 97px; + left: -8px; + width: 24px; + height: 10px; + background-image: url('../images/logo-jhipster.png'); + background-size: contain; + -webkit-animation: lds-pacman-3 1s linear infinite; + animation: lds-pacman-3 1.5s linear infinite; +} +.app-loading .lds-pacman > div:nth-child(1) div:nth-child(1) { + -webkit-animation-delay: -0.67s; + animation-delay: -1s; +} +.app-loading .lds-pacman > div:nth-child(1) div:nth-child(2) { + -webkit-animation-delay: -0.33s; + animation-delay: -0.5s; +} +.app-loading .lds-pacman > div:nth-child(1) div:nth-child(3) { + -webkit-animation-delay: 0s; + animation-delay: 0s; +} diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_0.svg b/borestop/src/main/webapp/content/images/jhipster_family_member_0.svg new file mode 100755 index 0000000000000000000000000000000000000000..d6df83ceb8555ad49f8eb74d4cee9228275d04ef --- /dev/null +++ b/borestop/src/main/webapp/content/images/jhipster_family_member_0.svg @@ -0,0 +1 @@ +<svg enable-background="new 0 0 792 1135.9" viewBox="0 0 792 1135.9" xmlns="http://www.w3.org/2000/svg"><path d="m647.1 432.5s51.7 519.9 75.8 573.3c3 67-55.3 19-55.3 19l-43.1-151.5s-50.5-195.2-51-208.9c-.4-13.7 73.6-231.9 73.6-231.9z" fill="#eac6ad"/><path d="m44.1 768.7s112.3-241.2 106.6-279.7c-5.8-38.5-.7-54.5 12.3-61.6 13.1-7 150.4 13.1 150.4 13.1s37.9 25.4 35.4 36.2 8.2 318.5-10 356.7-26.2 181.6-23.6 178.7l-109.2-30.5s33.6-221.7 23.5-264.1-18.5-68.1-18.5-68.1l-116.9 145.5z" fill="#fff"/><path d="m183.1 678.5c3.6-13.2-34.5-224.7-34.5-224.7s-2.8 92.6-42.5 169.3c-.1.3-51 77.3-50.7 77.4 10.1 2.1 79.2 43.9 79.2 43.9" fill="#f1f1f1"/><path d="m619.9 509.2s1.3-34.4-24.2-56.6-87.8-48.5-178.5-47.1 35.3 101.7 35.3 101.7z" fill="#fff"/><path d="m218.4 509.2s-1.3-34.4 24.2-56.6 87.8-48.6 178.6-47.2-35.3 101.8-35.3 101.8-56.7.7-104.1 1.3c-34.1.3-63.4.7-63.4.7z" fill="#fff"/><path d="m419.2 415.6c110.9 0 200.8 42.8 200.8 95.6s-89.9 95.6-200.8 95.6-200.8-42.8-200.8-95.6 89.9-95.6 200.8-95.6z" fill="#fff"/><path d="m306.7 223.1s-11.4-4.6-20.1.8-11.9 29.1-4.5 39.5 15 22.9 23 23.9 17.2-1.6 17.2-1.6l-3.3-31.7z" fill="#f2c2a0"/><path d="m525.9 223.1s11.5-4.6 20.1.8c8.7 5.4 11.9 29.1 4.5 39.4s-15 22.8-23 23.8-17.2-1.6-17.2-1.6l3.3-31.6z" fill="#f2c2a0"/><path d="m340.6 445.8 63 33h55.1l7.4-55.8 6.1-10.8s136.9 9.4 158.4 8.7c6.6 1.4 35 12.1 28.6 40-6.8 30.1-71.1 316.8-71.1 316.8l19.1 170s25.3 31.6 10.1 38.6c-15.2 7.1-174.8 32-225 30.5-50.1-1.5-205.8 1.7-211-18.9s34.5-130.4 34.5-130.4l77.4-378.7z" fill="#fff"/><path d="m576.3 700.7c0-13.7 84.4-248.2 84.4-248.2s40.7 424.2 56.8 459c.1.3-.1.6-.4.6-10.3-.7-84.9 27.5-84.9 27.5" fill="#f1f1f1"/><path d="m543.3 411.6c12.9.4 25.5 2.8 69.2 5.2 0 0-.9 77.4-13.1 161.2-11.3 78.2-8.7 155.9-8.7 196s43.7 193.2 45.3 207.5-134.1 36-159.3 37.4c-51.1-1.4-65.3-142.8-69.6-256.2-7.4-75.8-13.3-72.4-.8-115.3" fill="#3d4251"/><path d="m535 279.3c4.1 0 7.4 3.3 7.4 7.4s-3.3 7.4-7.4 7.4-7.4-3.3-7.4-7.4 3.3-7.4 7.4-7.4z" fill="#4189c6"/><path d="m471.3 367.1h-110.4v83.2l55.3 25 55.1-25z" fill="#f2c2a0"/><path d="m411 64.6c69.7-1.1 109.2 34.3 125.6 86.6 20.2 64.3-9.4 137.5-33.7 179-9.9 17-18.8 33.6-34.5 44.7-10.6 7.5-25.5 12.1-40.6 14.8-19.1 3.4-45.2-4-55.8-10.3-37.9-22.4-67.7-95.9-78.8-146.5-5-22.8-4-55.3 2.1-75.9 11.9-40.5 34.3-69 71.8-83.7 9.2-3.6 19.7-5.4 30.4-7.4 4.4-.5 9-.9 13.5-1.3z" fill="#f2c2a0"/><path d="m365.2 209.1c12.8 0 23.2 10.4 23.2 23.2s-10.4 23.2-23.2 23.2-23.2-10.4-23.2-23.2 10.4-23.2 23.2-23.2z" fill="#fff"/><path d="m374.4 232.1c0 5.4-4.4 9.9-9.9 9.9-4 0-7.5-2.4-9-5.9.6.3 1.3.5 2 .5 2.3 0 4.1-1.8 4.1-4.1s-1.8-4.1-4.1-4.1c-.9 0-1.7.3-2.4.8 1.2-4 5-7 9.4-7 5.5 0 9.9 4.4 9.9 9.9z" fill="#333"/><path d="m470.1 209.1c12.8 0 23.2 10.4 23.2 23.2s-10.4 23.2-23.2 23.2-23.2-10.4-23.2-23.2 10.3-23.2 23.2-23.2z" fill="#fff"/><path d="m479.3 232.1c0 5.4-4.4 9.9-9.9 9.9-4 0-7.5-2.4-9-5.9.6.3 1.3.5 2 .5 2.3 0 4.1-1.8 4.1-4.1s-1.8-4.1-4.1-4.1c-.9 0-1.7.3-2.4.8 1.2-4 5-7 9.4-7 5.5 0 9.9 4.4 9.9 9.9z" fill="#333"/><path d="m406 232.9h25v10.3h-25z" fill="#4189c6"/><path d="m398.7 200.9h-66.5c-4.5 0-8.2 3.7-8.2 8.2v50.9c0 4.5 3.7 8.2 8.2 8.2h66.5c4.5 0 8.2-3.7 8.2-8.2v-50.9c0-4.5-3.7-8.2-8.2-8.2zm-1.8 52c0 3.4-2.8 6.1-6.2 6.1h-50.3c-3.4 0-6.2-2.7-6.2-6.1v-37.7c0-3.4 2.8-6.1 6.2-6.1h50.3c3.4 0 6.2 2.7 6.2 6.1z" fill="#4189c6"/><path d="m502.5 200.9h-66.5c-4.5 0-8.2 3.7-8.2 8.2v50.9c0 4.5 3.7 8.2 8.2 8.2h66.5c4.5 0 8.2-3.7 8.2-8.2v-50.9c0-4.5-3.7-8.2-8.2-8.2zm-1.7 52c0 3.4-2.8 6.1-6.2 6.1h-50.3c-3.4 0-6.2-2.7-6.2-6.1v-37.7c0-3.4 2.8-6.1 6.2-6.1h50.3c3.4 0 6.2 2.7 6.2 6.1z" fill="#4189c6"/><path d="m367 170.3c-24.7.5-39 8.6-39 16.9 0 8.4 13.1 6 23 2.1 9.8-3.9 22.8-3.6 28.3.4s17.1 5.2 17.6-3.3-21.5-16.3-29.9-16.1z" fill="#a3634d"/><path d="m467.6 170.1c24.7.5 39 8.5 39 16.8s-13.1 6-23 2.1c-9.8-3.9-22.9-3.6-28.3.4s-17.2 5.1-17.7-3.3c-.4-8.4 21.6-16.2 30-16z" fill="#a3634d"/><path d="m346 377.5 74.4 97.3-45.7 12.6-50.8-62.9s.1-18.3 4.1-26.9c4.1-8.7 18-20.1 18-20.1z" fill="#fff"/><path d="m488.9 390.6-76.7 85.7 44.7 11.1 49.7-55.5s-.1-16.1-4-23.7c-4-7.6-13.7-17.6-13.7-17.6z" fill="#fff"/><path d="m529.5 272.5c-7.7 22.3-12.4 57.2-21.1 76.9-7 22.8-26 77.3-41.6 88.4-10.6 7.5-25.5 12.1-40.6 14.8-19.1 3.4-54.7-.7-65.3-6.9-27.2-16-39.1-124.5-54-165.9 0-2.8.1-5.5.7-7.8.4-.1.8-.3 1.2-.4 6.1-2.3 12.3 4.2 15.6 6.6 11.9 8.8 20.5 20 31.2 30-2.2-8.2 4.4-26.4 12.7-19.3 3.8 2.7.5 12.2 1.6 17.2 18.1 12.2 20-9.9 28.7-14.4 5.9-1.1 11.4 3.9 17.2 4.9 9.5 1.7 14-4.9 22.2-5.3 8.2 4.7 8.2 20.1 22.6 17.2 3.6-.7 5.2-.5 6.6-3.3 2.7-5.2-1.7-13.5 1.2-16.8 2.9-3.4 3.3-.5 4.9-.8 6 2.8 11.4 11.2 8.2 20.1 3.4-3.7 6.8-7.4 10.3-11.1 10.4-10.5 19.9-18.8 34.1-25.9.8.1 1.6.3 2.5.4.4.5.7.9 1.1 1.4z" fill="#a3634d"/><path d="m385.9 322.8s8.3 14.5 31.6 14 31.2-14 31.2-14-15.2-4.9-27.5-4.9c-5.3 0-10.7 2.9-17.7 4.1-6.9 1.2-17.6.8-17.6.8z" fill="#f2c2a0"/><path d="m290.7 214.8s6.1-17 6.6-23.8c.4-6.8 5.2-46.9 19.7-66.9 9.4-14.4 23-17.4 36.5-14.4s29.1 11.2 45.2 9c16-2.1 56.7-22.6 73.5-14.8 16.7 7.8 44.9 21.4 48 47.2s21.3 66.5 21.3 66.5 9.4-65.8 9.4-83.3-45.7-69.1-55-79.2-39.5-36.6-57.5-35.7-42.2 15.5-51.7 16.4-15.8-3.6-26.3-1.6c-10.5 1.9-21.6 1.4-53.4 34.5s-28.5 82.7-26.3 110.4 10 35.7 10 35.7z" fill="#a3634d"/><path d="m377.3 107.3s-7.8-11.7 2.1-33.3c9.9-21.5 10.3-31.6 10.3-31.6s-5.7 14-13.2 31.6.8 33.3.8 33.3z" fill="#b27362"/><path d="m406 110.6s22.2-25.6 36.5-36.9 32-24.2 32-24.2-13.9 3.4-34.9 21.3c-20.8 17.9-33.6 39.8-33.6 39.8z" fill="#b27362"/><path d="m390.9 106.9s-.5-23.8 11.1-50.1 34.9-30.4 34.9-30.4-17.1 7.8-29.1 31.2-16.9 49.3-16.9 49.3z" fill="#b27362"/><path d="m433.2 485.4s-92.3-40.2-96.2-8.1-9.5 56.8 14 58.5c23.6 1.8 82.2-50.4 82.2-50.4z" fill="#3373aa"/><path d="m417.4 479.6c23.4-15.7 69.9-43.4 78.2-20.7 11.2 30.5 22.4 53.3-.1 60.5-15.8 5-54.6-12-76.2-22.5-1.8-15.3-.2-2.3-1.9-17.3z" fill="#4189c6"/><path d="m278.3 431c-23-2.1-30.1-4-81.1-5.7 0 0 3.4 78.5 11.7 153.4 7 63.2 8.7 100.1 19.4 167.5 5.4 58.5-57.7 215.4-57.7 249.6 0 14.4 69.8 23.2 189.2 28.4 33.3 0 52.4-87 60.6-188.1-.5-92.5-.9-180.2-8.2-192.5" fill="#3d4251"/><path d="m55.5 700.5s160.9-149.3 188.8-200.9c51.4-43 48.7 32.4 48.7 32.4l-94.3 126.1s-77 101.6-87.6 110.3c-10.7 8.8-55.6-67.9-55.6-67.9z" fill="#eac6ad"/><path d="m152.4 578.1s-170.1 176.1-117.2 228.4 85.2-9.8 85.2-9.8l97.9-162.5s-13.9-6.8-28.1-20.5c-14.1-13.8-37.8-35.6-37.8-35.6z" fill="#f1f1f1"/><path d="m133.4 585.7-38.5 46.5s11.2 29.8 40.1 54.6 56.7 20.2 56.7 20.2l44.3-72-68-52.8c-10.8-8.4-26.1-6.9-34.6 3.5z" fill="#fff"/><path d="m401.2 818.3c0 6.1 4.9 11 11 11s11-4.9 11-11-4.9-11-11-11-11 5-11 11z" fill="#474b56"/><path d="m397.7 707.1c0 6.1 4.9 11 11 11s11-4.9 11-11-4.9-11-11-11c-6 0-11 4.9-11 11z" fill="#474b56"/><path d="m295.9 378.5c7.5 46.7 15.1 93.2 22.7 139.4 19.2 1.7 38.6 1.7 57.8 0 7.6-46.2 15.2-92.7 22.7-139.4-34.2 5.4-69 5.4-103.2 0z" fill="#fff"/><path d="m383.9 475.1c3.7-22.6 7.4-45.2 11-67.9-31.4 5-63.4 5-94.8 0 3.7 22.7 7.3 45.4 11 67.9 24.2 3 48.6 3 72.8 0z" fill="#ccc"/><path d="m407.7 374.7c0-3.7-27.1-6.7-60.4-6.7s-60.4 3-60.4 6.7v6.8c0 3.7 27.1 6.7 60.4 6.7s60.4-3 60.4-6.7c0-2 0-4.8 0-6.8z" fill="#ccc"/><ellipse cx="347.3" cy="374.7" fill="#e6e6e6" rx="60.4" ry="6.7"/><path d="m398.4 363.5c-.1-3.1-23-5.7-51.2-5.7s-51.1 2.5-51.2 5.7c0 1.7-1.2 8.7-1.2 10.4 0 3.2 23.4 5.8 52.3 5.8s52.3-2.6 52.3-5.8c.2-1.8-.9-8.7-1-10.4z" fill="#ccc"/><path d="m398.4 363.5c.1 3.1-22.8 5.7-51.2 5.7-28.3 0-51.2-2.6-51.2-5.7.1-3.1 23-5.7 51.2-5.7s51.1 2.5 51.2 5.7z" fill="#e6e6e6"/><path d="m389.7 355.1c-.5-2.1-19.5-3.8-42.4-3.8s-41.9 1.7-42.4 3.8c-.3 1.2-4.2 6.5-4.2 7.8 0 2.3 20.8 4.2 46.6 4.2 25.7 0 46.6-1.9 46.6-4.2-.1-1.3-3.9-6.7-4.2-7.8z" fill="#ccc"/><path d="m389.7 355.1c.5 2.2-18.4 4-42.4 4s-42.9-1.8-42.4-4c.5-2.1 19.5-3.8 42.4-3.8s41.8 1.6 42.4 3.8z" fill="#e6e6e6"/><ellipse cx="378.5" cy="354.8" fill="#666" rx="6.8" ry="1"/><path d="m244.5 542.1c-7.2-15.4-6-119.1 12.7-127s46.5-20.6 58.9-20c12.3.6 21.4.1 27.7 6.5 6.3 6.5 22.1 26.9 20 38.9-2.1 11.9-38.2 21.1-46.2 29.6s-12 41.8-17.3 49.2-19.4 40.1-38.1 35.4c-18.7-4.6-10.5 2.8-17.7-12.6z" fill="#f2c2a0"/><g fill="#333"><path d="m217 595c-1.1.7-2 1.3-2.7 1.7-.8.4-1.4.7-2 .9-.6.1-1.1.2-1.5 0-.4-.1-.9-.3-1.4-.7-.4-.3-.7-.7-.8-1.1s-.1-.8-.1-1.3c.1-.4.2-.9.3-1.4.2-.5.3-1 .4-1.6 0 0 0-.2.1-.6s.2-.8.3-1.4.3-1.2.5-1.9.3-1.4.5-2.1.3-1.3.5-1.9.3-1 .4-1.4c.1-.2.2-.4.3-.6.2-.2.3-.3.5-.4s.4-.1.6-.1.4 0 .6.1.4.1.5.2c.2.1.3.2.4.2.1.1.1.1.2.1.3.2.5.5.5.7 0 .3 0 .6-.1.9l-3.8 11.3 8.2-5.4c.1-.1.3-.2.6-.3.2-.1.5-.1.8-.2h.9c.3 0 .6.2.8.4.3.2.4.5.4.8s-.1.7-.4 1c-.2.3-.6.6-1 .9s-.9.6-1.4.9-1 .6-1.5.9c-.7.7-1.2 1-1.6 1.4z"/><path d="m230.4 589.5c-1-.8-1.9-1.7-2.7-2.9s-1.4-2.5-1.8-3.9-.6-2.9-.6-4.5.3-3.1.8-4.6c-1 .3-2 .4-3 .6-1 .1-1.9.2-2.8.1-.9 0-1.8-.2-2.5-.4-.8-.2-1.5-.5-2.1-1-.8-.6-1.4-1.2-2-1.9s-1-1.4-1.4-2.1-.6-1.5-.8-2.3-.3-1.5-.2-2.2c0-.7.1-1.4.3-2s.5-1.2.9-1.7c.5-.7 1.2-1.2 2-1.6s1.8-.5 2.9-.4 2.4.4 3.8 1 3 1.5 4.7 2.8c1.2.9 2.4 1.8 3.4 2.7s2 1.8 2.9 2.7c.6-.2 1.3-.5 1.9-.8s1.3-.5 1.9-.8c.1-.1.3-.1.5-.2s.4-.2.6-.2c.2-.1.4-.1.5-.1h.4c.1.1.1.1.1.3v.4.4.3c0 .2-.1.4-.3.6-.3.4-.8.9-1.4 1.3-.6.5-1.3.9-2.1 1.4 1.1 1.4 2.1 2.7 2.9 4.1.8 1.3 1.5 2.6 2 3.8s.9 2.4 1.1 3.5.3 2.2.3 3.1c0 1-.1 1.8-.4 2.6-.2.8-.6 1.5-1 2-.4.6-1 1.1-1.6 1.4s-1.3.5-2.1.5-1.6-.1-2.4-.4c-.8-.4-1.8-.9-2.7-1.6zm2.9-2.4c.8.6 1.5.9 2.1.9s1.1-.2 1.5-.7.6-1.2.6-2.2-.2-2.1-.6-3.4-1.2-2.8-2.1-4.4c-1-1.6-2.3-3.4-3.9-5.2l-.6.2c-.4.9-.7 1.8-.9 2.8-.1 1-.2 2-.1 2.9.1 1 .2 1.9.5 2.9.3.9.6 1.8.9 2.6.4.8.8 1.5 1.2 2.2.4.6.9 1.1 1.4 1.4zm-16.1-17.6c.6.5 1.3.8 2.1.9.8.2 1.7.3 2.6.2.9 0 1.9-.2 3-.4s2.2-.5 3.3-.9c-1-.9-2-1.8-3.1-2.8-1.1-.9-2.3-1.9-3.6-2.9-.9-.7-1.7-1.2-2.4-1.5s-1.3-.6-1.8-.7-1-.1-1.3.1c-.4.1-.7.3-.9.6s-.4.6-.4 1c-.1.4-.1.8-.1 1.3s.1.9.3 1.4c.1.5.3.9.5 1.4.2.4.5.9.8 1.3s.6.7 1 1z"/><path d="m245.8 545.1c.7 1 1.4 1.8 2.1 2.6s1.3 1.4 1.9 1.8c.5.4 1 .6 1.4.6.5 0 .9-.2 1.2-.7.1-.2.3-.5.3-.8.1-.3.1-.8.2-1.3 0-.5 0-1.1-.1-1.8s-.1-1.5-.3-2.4c.1 0 .2 0 .4.1.2 0 .5.1.8.2.4.1.9.3 1.5.4.2 1 .3 2 .3 2.9s0 1.7-.1 2.5-.3 1.5-.5 2.1-.5 1.1-.8 1.5c-.4.5-.8.8-1.3 1.1s-1 .4-1.6.5c-.6 0-1.2 0-1.8-.2s-1.3-.5-1.9-1c-.2-.2-.5-.4-.8-.7s-.6-.6-1-1-.7-.9-1.1-1.4-.8-1-1.3-1.6c-.6 1.1-1.3 2.1-1.9 3.1s-1.2 2-1.8 3c.5.7.9 1.4 1.4 2 .5.7.9 1.3 1.3 1.9s.7 1.1 1.1 1.6c.3.5.6.9.8 1.3.5 1 .8 1.7.9 2.3s0 1-.2 1.3c-.1.2-.3.3-.5.5-.2.1-.4.2-.6.3s-.4.1-.6 0c-.2 0-.4-.1-.6-.3-.1-.1-.2-.2-.3-.3-.9-1.2-1.8-2.4-2.6-3.5-.8-1.2-1.6-2.3-2.3-3.5-.3.4-.6.8-1 1.1-.3.3-.7.6-1.1.8s-.8.3-1.3.4c-.5 0-1 0-1.5-.2-.2-.1-.3-.1-.4-.2s-.2-.1-.3-.2c-.3-.2-.4-.5-.2-.7.1-.1.3-.2.6-.3s.7-.1 1.2-.1c.2-.4.5-.7.8-1.1s.5-.7.8-1.2l.8-1.1c-.5-.8-1-1.6-1.5-2.3s-.9-1.4-1.4-2.1c-.3-.4-.6-.8-1-1.2-.3-.4-.7-.7-1.1-1-.3-.2-.6-.4-.9-.5s-.6-.2-.8-.2c-.3 0-.5 0-.8.2-.2.1-.5.3-.7.6-.2.2-.3.5-.5.9-.1.4-.3.8-.4 1.3s-.2 1-.2 1.7v2.1c0 .3 0 .5-.1.7 0 .2-.1.3-.2.5 0 .1-.2 0-.4-.1s-.5-.3-.8-.5c-.4-.3-.7-.7-.9-1.1s-.4-.9-.4-1.5c-.1-.5-.1-1.1 0-1.7s.2-1.2.3-1.7c.1-.6.3-1.1.6-1.6.2-.5.5-.9.7-1.3.4-.5.8-1 1.3-1.4s1.1-.6 1.6-.8c.6-.1 1.2-.1 1.9.1s1.4.5 2.1 1.1c.3.3.7.6 1.2 1 .4.4.9 1 1.4 1.5.5.6 1 1.2 1.5 1.9s1 1.4 1.6 2.1c.5-.8 1.1-1.7 1.8-2.7s1.4-2 2-3c-1-1.3-2-2.7-3-4.2s-2-2.9-2.9-4.4c-.3-.5-.5-1-.5-1.5s.1-.9.4-1.3c.1-.2.3-.3.4-.4.2-.1.3-.2.5-.2h.6c.2 0 .4.1.6.3.2.1.4.3.6.5s.4.4.6.7c.3.5.7 1.1 1.1 1.7s.8 1.2 1.2 1.8.8 1.2 1.3 1.9c.4.6.9 1.3 1.3 1.9.3-.5.6-.9.8-1.3s.4-.7.5-.8.1-.2.2-.2c0-.1.1-.1.1-.2.2-.2.3-.4.5-.5.1-.1.3-.2.4-.2s.3 0 .4.1.3.1.4.2c.2.1.3.3.3.4.1.1.1.3.1.4s0 .3-.1.4-.1.3-.2.4c-.1.2-.2.4-.3.5s-.1.2-.1.2v.1s0 0-.1.1c0 0-.1.1-.2.3-.1.1-.2.3-.3.6-.2.3-.3.6-.5.9.4 0 .2.2 0 .5z"/><path d="m262.8 533.2c-.2.6-.4 1.1-.5 1.7-.2.6-.3 1.2-.5 1.7-.2.6-.3 1.1-.5 1.6s-.4.9-.6 1.2c-.3.4-.6.6-.9.7s-.6 0-.9-.2c-.2-.2-.4-.4-.6-.6-.1-.2-.3-.4-.3-.7-.1-.2-.1-.4-.1-.6s0-.4 0-.5l3-9.9-8.5 6.4c-.3.2-.6.3-.8.4-.3.1-.5 0-.8-.2 0 0-.1 0-.1-.1-.1-.1-.2-.2-.3-.3s-.2-.3-.3-.4c-.1-.2-.2-.3-.3-.5s-.1-.4-.1-.6.1-.4.3-.6c.1-.2.3-.3.4-.4.3-.2.6-.4 1-.7s.9-.6 1.4-.9 1-.6 1.5-1c.5-.3 1-.6 1.4-.9s.8-.5 1.1-.6.4-.3.4-.3c.5-.3 1-.6 1.4-.9s.9-.5 1.3-.7.8-.3 1.2-.3.8.1 1.2.5c.5.3.8.7 1.1 1.1.2.4.4.9.4 1.5s0 1.3-.2 2.1c-.1.8-.4 1.8-.8 3z"/></g><path d="m720.3 998.2s36.3 42.5 34.7 62.7c-1.5 20.1-3.5 53.9-19.3 61.4s-71.2 6.8-80.2-15.9 6.4-100.7 6.4-100.7z" fill="#f2c2a0"/><path d="m717.4 906.7-5.7-50.8s-24.4-10.6-55.9-7.4c-31.6 3.2-44.9 22.9-44.9 22.9l17.7 69.3 71-10.7c11.2-1.8 19.1-12 17.8-23.3z" fill="#fff"/></svg> \ No newline at end of file diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_0_head-192.png b/borestop/src/main/webapp/content/images/jhipster_family_member_0_head-192.png new file mode 100644 index 0000000000000000000000000000000000000000..6d90ab36d37914257d5f3d0356e7895ccc0596f2 Binary files /dev/null and b/borestop/src/main/webapp/content/images/jhipster_family_member_0_head-192.png differ diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_0_head-256.png b/borestop/src/main/webapp/content/images/jhipster_family_member_0_head-256.png new file mode 100755 index 0000000000000000000000000000000000000000..8e99bfe66d5a0e4831fcdc4031c1a57ba9b9cb1a Binary files /dev/null and b/borestop/src/main/webapp/content/images/jhipster_family_member_0_head-256.png differ diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_0_head-384.png b/borestop/src/main/webapp/content/images/jhipster_family_member_0_head-384.png new file mode 100755 index 0000000000000000000000000000000000000000..c7ca46022548477085d9c10966c94131e7290df6 Binary files /dev/null and b/borestop/src/main/webapp/content/images/jhipster_family_member_0_head-384.png differ diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_0_head-512.png b/borestop/src/main/webapp/content/images/jhipster_family_member_0_head-512.png new file mode 100755 index 0000000000000000000000000000000000000000..7e0b8436e82d0b3536909e53a0d435669e6b77cd Binary files /dev/null and b/borestop/src/main/webapp/content/images/jhipster_family_member_0_head-512.png differ diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_1.svg b/borestop/src/main/webapp/content/images/jhipster_family_member_1.svg new file mode 100755 index 0000000000000000000000000000000000000000..e3a0f3db9fac1dcf48fe52bdfe437835e38e0182 --- /dev/null +++ b/borestop/src/main/webapp/content/images/jhipster_family_member_1.svg @@ -0,0 +1 @@ +<svg enable-background="new 0 0 792 1135.9" viewBox="0 0 792 1135.9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><radialGradient id="a" cx="99.0069" cy="719.4542" gradientTransform="matrix(1.2124 0 0 1.2347 112.276 -102.0841)" gradientUnits="userSpaceOnUse" r="7.2456"><stop offset=".02238806" stop-color="#3a86ba"/><stop offset="1" stop-color="#3474a0"/></radialGradient><path d="m649 468.5s2.5 263.7 22.8 318c.4 67-55.7 25.6-55.7 25.6l-20.2-32.1s-23.1-68.7-23.1-82.5c.1-13.7 76.2-229 76.2-229z" fill="#b5694e"/><path d="m192.9 474.6s-2.5 263.7-22.8 318c-.4 67 55.7 25.6 55.7 25.6l20.1-32.1s23.1-68.7 23.1-82.5c0-13.7-76.1-229-76.1-229z" fill="#b5694e"/><path d="m188 496.6c5.4-35.3 9.8-48.6 58.8-54.3 18.5-2.2 86.1-7.3 104.9-18s15.8-64.3 15.8-64.3h51.2 51.2s-3 53.6 15.8 64.3 86.4 15.9 104.9 18c48.9 5.7 53.4 19 58.8 54.3 4.3 28.3 4.5 57.1 4.5 57.1h-235.3-235s.1-28.9 4.4-57.1z" fill="#b56441"/><path d="m236.5 778.7c-.3-4.9-7.3-5.1-8-.2-.6 4.5-1.2 9.1-1.8 13.7 3.9 2 7.6 3.8 11 5.4-.3-6.5-.8-12.8-1.2-18.9z" fill="url(#a)"/><path d="m241.7 794.3c0-.5-.1-1-.1-1.5-.1-1.5-.2-3-.3-4.4 0-.5-.1-1-.1-1.5-.1-1-.1-2-.2-3-1.1-16.1-2.1-31.1-2.9-44.5 0-.1 0-.1 0-.2-.1-1-.1-2-.2-3 0-.5-.1-.9-.3-1.3-.1-.4-.3-.7-.5-1-.7-1-1.9-1.5-3.1-1.5-.7 0-1.3.1-1.9.4-.7.4-1.3 1-1.7 1.8-.2.4-.3.8-.4 1.3 0 .3-.1.5-.1.8-.1.9-.2 1.8-.3 2.7-1.7 13.1-3.6 28.1-5.7 44.5-.1.8-.2 1.7-.3 2.5-.1.6-.2 1.2-.2 1.8-.1.6-.2 1.3-.2 1.9 1.3.7 2.6 1.3 3.9 2 .6-4.7 1.2-9.3 1.8-13.7.6-4.9 7.6-4.7 8 .2.4 6.1.9 12.4 1.3 18.9 1.5.7 2.9 1.3 4.2 2 0-.3 0-.5-.1-.8-.4-1.4-.5-2.9-.6-4.4z" fill="#4f4f4f"/><path d="m244.8 733.7v4.8.9h.9.7l-1.6-8.8v1.6z" fill="#4f4f4f"/><path d="m250.1 783.9h-4.6-.8v.8 4.7 1.6 4.7 1.6 3.4c8.2 3.7 13.4 5.8 13.4 5.8l-4-22.7h-2.6-1.4z" fill="#4f4f4f"/><path d="m244.8 740.4v4.7l2.2-2.3-.6-3.4h-.7z" fill="#c3c2c3"/><path d="m244.8 783.1 7.9-8.2-.7-4-7.2 7.5z" fill="#c3c2c3"/><path d="m244.8 776.8 6.9-7.2-.7-4-6.2 6.4z" fill="#c3c2c3"/><path d="m244.8 751.4 3.1-3.2-.7-4-2.4 2.5z" fill="#c3c2c3"/><path d="m244.8 757.8 4.1-4.3-.7-4-3.4 3.5z" fill="#c3c2c3"/><path d="m244.8 764.1 5-5.2-.7-4-4.3 4.5z" fill="#c3c2c3"/><path d="m250.1 783.9 3.5-3.6-.7-4-7.3 7.6z" fill="#c3c2c3"/><path d="m244.8 770.4 6-6.2-.7-4-5.3 5.5z" fill="#c3c2c3"/><path d="m254.3 783.9-.4-2.3-2.2 2.3z" fill="#c3c2c3"/><path d="m245.7 739.4h-.9v1z" fill="#4f4f4f"/><path d="m244.8 746.7 2.4-2.5-.2-1.4-2.2 2.3z" fill="#4f4f4f"/><path d="m244.8 753 3.4-3.5-.3-1.3-3.1 3.2z" fill="#4f4f4f"/><path d="m244.8 759.4 4.3-4.5-.2-1.4-4.1 4.3z" fill="#4f4f4f"/><path d="m244.8 765.7 5.3-5.5-.3-1.3-5 5.2z" fill="#4f4f4f"/><path d="m244.8 772 6.2-6.4-.2-1.4-6 6.2z" fill="#4f4f4f"/><path d="m244.8 778.4 7.2-7.5-.3-1.3-6.9 7.2z" fill="#4f4f4f"/><path d="m244.8 783.9h.8l7.3-7.6-.2-1.4-7.9 8.2z" fill="#4f4f4f"/><path d="m251.7 783.9 2.2-2.3-.3-1.3-3.5 3.6z" fill="#4f4f4f"/><path d="m178.6 561.5h4.5 1.5 4.6 1.5 4.6 1.5 4.6.7v-.8-4.8-1.6-4.7-1.6-4.7-1.6-4.8-1.6-4.7-1.6-2.2l-2.1-9.8h-3.3-1.6-4.5-1.5-4.2l-8 44.5h.1z" fill="#4f4f4f"/><path d="m202.1 541.7 2.6-2.7-.8-3.9-1.8 1.8z" fill="#c3c2c3"/><path d="m202.5 528.6-.4-1.8v2.2z" fill="#c3c2c3"/><path d="m202.1 535.3 1.5-1.5-.8-3.9-.7.7z" fill="#c3c2c3"/><path d="m202.1 560.7 5.9-6.1-.8-3.9-5.1 5.2z" fill="#c3c2c3"/><path d="m202.1 548 3.7-3.8-.8-3.9-2.9 3z" fill="#c3c2c3"/><path d="m207.4 561.5 1.7-1.8-.8-3.8-5.4 5.6z" fill="#c3c2c3"/><path d="m209.5 561.5-.1-.4-.4.4z" fill="#c3c2c3"/><path d="m202.1 554.3 4.8-4.9-.8-3.9-4 4.1z" fill="#c3c2c3"/><path d="m202.1 530.6.7-.7-.3-1.3-.4.4z" fill="#4f4f4f"/><path d="m202.1 536.9 1.8-1.8-.3-1.3-1.5 1.5z" fill="#4f4f4f"/><path d="m202.1 543.3 2.9-3-.3-1.3-2.6 2.7z" fill="#4f4f4f"/><path d="m202.1 549.6 4-4.1-.3-1.3-3.7 3.8z" fill="#4f4f4f"/><path d="m202.1 555.9 5.1-5.2-.3-1.3-4.8 4.9z" fill="#4f4f4f"/><path d="m202.1 561.5h.8l5.4-5.6-.3-1.3-5.9 6.1z" fill="#4f4f4f"/><path d="m209 561.5.4-.4-.3-1.4-1.7 1.8z" fill="#4f4f4f"/><path d="m198.1 507.6-.9-3.9-12.2 12.8-.1.5h4.2z" fill="#c3c2c3"/><path d="m196.1 498.6-9.8 10.2-1 5.8 11.7-12.2z" fill="#c3c2c3"/><path d="m191.8 478.2-.9 5.2 1.7-1.7z" fill="#c3c2c3"/><path d="m195.1 517 4.1-4.2-.9-3.9-7.7 8.1z" fill="#c3c2c3"/><path d="m195 493.4-7.3 7.6-1 5.8 9.2-9.6z" fill="#c3c2c3"/><path d="m192.8 483-2.3 2.4-1 5.8 4.2-4.3z" fill="#c3c2c3"/><path d="m193.9 488.2-4.8 5-1 5.8 6.7-6.9z" fill="#c3c2c3"/><path d="m200 517-.6-2.9-2.7 2.9z" fill="#c3c2c3"/><path d="m192.6 481.7-1.7 1.7-.4 2 2.3-2.4z" fill="#4f4f4f"/><path d="m193.7 486.9-4.2 4.3-.4 2 4.8-5z" fill="#4f4f4f"/><path d="m194.8 492.1-6.7 6.9-.4 2 7.3-7.6z" fill="#4f4f4f"/><path d="m195.9 497.2-9.2 9.6-.4 2 9.8-10.2z" fill="#4f4f4f"/><path d="m197 502.4-11.7 12.2-.3 1.9 12.2-12.8z" fill="#4f4f4f"/><path d="m190.6 517 7.7-8.1-.2-1.3-9 9.4z" fill="#4f4f4f"/><path d="m196.7 517 2.7-2.9-.2-1.3-4.1 4.2z" fill="#4f4f4f"/><path d="m166.4 650.5h4.6 1.5 4.5 1.6 4.5 1.5 4.6 1.5 4.6 1.5 4.6.7v-.8-4.8-1.6-4.7-1.6-4.8-1.5-4.8-1.6-4.7-1.6-4.8-1.6-4.7-.9h-.9-4.5-1.6-4.5-1.5-4.6-1.5-4.6-1.5-4.5-1.6-1.8l-8 44.5h3.9z" fill="#4f4f4f"/><path d="m207.4 561.5h-4.5-.8v.8 4.7 1.6 4.8 1.5 4.8 1.6 4.7 1.6 4.8 1.6 4.7 1.6 4.7 1h.9 4.6 1.5 4.6 1.5 3.7l-9.4-44.5h-.5z" fill="#c3c2c3"/><path d="m228.3 650.5-.2-1-.9 1z" fill="#c3c2c3"/><path d="m202.1 649.7 21.4-22.3-.9-3.8-20.5 21.3z" fill="#c3c2c3"/><path d="m207.4 650.5 17.2-17.9-.9-3.9-20.8 21.8z" fill="#c3c2c3"/><path d="m202.1 630.7 18.1-18.8-.9-3.9-17.2 17.9z" fill="#c3c2c3"/><path d="m202.1 643.3 20.3-21.1-.9-3.8-19.4 20.2z" fill="#c3c2c3"/><path d="m213.5 650.5 12.2-12.7-.9-3.9-15.8 16.6z" fill="#c3c2c3"/><path d="m219.6 650.5 7.2-7.5-.9-3.9-10.8 11.4z" fill="#c3c2c3"/><path d="m225.7 650.5 2.2-2.3-.9-3.9-5.9 6.2z" fill="#c3c2c3"/><path d="m202.1 637 19.2-19.9-.9-3.9-18.3 19z" fill="#c3c2c3"/><path d="m202.1 619.6v4.7l17-17.6-.2-.7h-3.7z" fill="#c3c2c3"/><path d="m209.1 606-7 7.2v4.8l11.6-12z" fill="#c3c2c3"/><path d="m203 606-.9.9v4.7l5.5-5.6z" fill="#c3c2c3"/><path d="m202.1 606v.9l.9-.9z" fill="#4f4f4f"/><path d="m207.6 606-5.5 5.6v1.6l7-7.2z" fill="#4f4f4f"/><path d="m213.7 606-11.6 12v1.6l13.1-13.6z" fill="#4f4f4f"/><path d="m202.1 625.9 17.2-17.9-.2-1.3-17 17.6z" fill="#4f4f4f"/><path d="m202.1 632.2 18.3-19-.2-1.3-18.1 18.8z" fill="#4f4f4f"/><path d="m202.1 638.6 19.4-20.2-.2-1.3-19.2 19.9z" fill="#4f4f4f"/><path d="m202.1 644.9 20.5-21.3-.2-1.4-20.3 21.1z" fill="#4f4f4f"/><path d="m202.1 650.5h.8l20.8-21.8-.2-1.3-21.4 22.3z" fill="#4f4f4f"/><path d="m209 650.5 15.8-16.6-.2-1.3-17.2 17.9z" fill="#4f4f4f"/><path d="m215.1 650.5 10.8-11.4-.2-1.3-12.2 12.7z" fill="#4f4f4f"/><path d="m221.1 650.5 5.9-6.2-.2-1.3-7.2 7.5z" fill="#4f4f4f"/><path d="m227.2 650.5.9-1-.2-1.3-2.2 2.3z" fill="#4f4f4f"/><path d="m190.7 561.5-16.9 17.6-1.1 5.9 22.6-23.5z" fill="#c3c2c3"/><path d="m184.6 561.5-9.4 9.9-1.1 5.8 15.1-15.7z" fill="#c3c2c3"/><path d="m176.9 561.5v.1l.1-.1z" fill="#c3c2c3"/><path d="m178.6 561.5-2 2.1-1.1 5.8 7.6-7.9z" fill="#c3c2c3"/><path d="m196.8 561.5-24.4 25.4-1.1 5.8 30.1-31.2z" fill="#c3c2c3"/><path d="m202.1 562.3-31.1 32.4-1 5.8 32.1-33.5z" fill="#c3c2c3"/><path d="m202.1 574.9-29.7 31.1h4.5l25.2-26.3z" fill="#c3c2c3"/><path d="m202.1 600.3-5.4 5.7h4.5l.9-1z" fill="#c3c2c3"/><path d="m202.1 587.6-17.6 18.4h4.6l13-13.6z" fill="#c3c2c3"/><path d="m202.1 573.4v-4.8l-32.5 33.9-.6 3.5h1.8z" fill="#c3c2c3"/><path d="m202.1 594-11.5 12h4.5l7-7.3z" fill="#c3c2c3"/><path d="m202.1 581.3-23.7 24.7h4.6l19.1-20z" fill="#c3c2c3"/><path d="m177 561.5-.1.1-.3 2 2-2.1z" fill="#4f4f4f"/><path d="m183.1 561.5-7.6 7.9-.3 2 9.4-9.9z" fill="#4f4f4f"/><path d="m189.2 561.5-15.1 15.7-.3 1.9 16.9-17.6z" fill="#4f4f4f"/><path d="m195.3 561.5-22.6 23.5-.3 1.9 24.4-25.4z" fill="#4f4f4f"/><path d="m202.1 561.5h-.7l-30.1 31.2-.3 2 31.1-32.4z" fill="#4f4f4f"/><path d="m202.1 567-32.1 33.5-.4 2 32.5-33.9z" fill="#4f4f4f"/><path d="m202.1 573.4-31.3 32.6h1.6l29.7-31.1z" fill="#4f4f4f"/><path d="m202.1 579.7-25.2 26.3h1.5l23.7-24.7z" fill="#4f4f4f"/><path d="m202.1 586-19.1 20h1.5l17.6-18.4z" fill="#4f4f4f"/><path d="m202.1 592.4-13 13.6h1.5l11.5-12z" fill="#4f4f4f"/><path d="m202.1 598.7-7 7.3h1.6l5.4-5.7z" fill="#4f4f4f"/><path d="m201.2 606h.9v-1z" fill="#4f4f4f"/><path d="m159.4 702.1v4.7 1.6 4.7 1.6 4.8 1.6 4.7 1.6 4.8 1.5 4.8.9h.9 4.6 1.5 4.6 1.5 4.5 1.6 4.5 1.5 4.6 1.5 4.6 1.5 4.6.7v-.8-4.7-1.6-4.7-1.6-4.8-1.6-4.7-1.6-4.8-1.5-4.8-1.6-4.7-1h-.9-4.5-1.6-4.5-1.5-4.6-1.5-4.6-1.5-4.5-1.6-4.5-1.6-4.5-.8v.8 4.8z" fill="#4f4f4f"/><path d="m225.7 650.5h-4.6-1.5-4.5-1.6-4.5-1.6-4.5-.8v.7 4.8 1.6 4.7 1.6 4.8 1.6 4.7 1.6 4.7 1.6 4.8 1.6 4.7.9h.9 4.6 1.5 4.6 1.5 4.5 1.6 4.5 1.5 4.6 1.5 4.4l-9.5-44.4h-1.1z" fill="#c3c2c3"/><path d="m237.9 736.2c.1 1 .1 2 .2 3l6.8-7.1v-1.6l-.5-2.7-6.8 7c.1.5.2.9.3 1.4z" fill="#c3c2c3"/><path d="m229.5 739.4c.1-.9.2-1.8.3-2.7l-2.6 2.7z" fill="#c3c2c3"/><path d="m202.1 700.6 5.5-5.7h-4.6l-.9 1z" fill="#c3c2c3"/><path d="m202.1 707 11.6-12.1h-4.6l-7 7.3z" fill="#c3c2c3"/><path d="m207.4 739.4 32.6-33.9-.8-3.9-36.3 37.8z" fill="#c3c2c3"/><path d="m213.5 739.4 27.6-28.7-.8-3.9-31.3 32.6z" fill="#c3c2c3"/><path d="m202.1 719.6 23.7-24.7h-4.5l-19.2 20z" fill="#c3c2c3"/><path d="m225.7 739.4 4.6-4.8c.4-.8 1-1.4 1.7-1.8l11.1-11.6-.7-4-21.3 22.2z" fill="#c3c2c3"/><path d="m202.1 713.3 17.6-18.4h-4.5l-13.1 13.6z" fill="#c3c2c3"/><path d="m202.1 726 29.8-31.1h-4.6l-25.2 26.3z" fill="#c3c2c3"/><path d="m202.1 727.6v4.7l35.7-37.2v-.2h-4.4z" fill="#c3c2c3"/><path d="m202.1 738.6 36.8-38.3-.8-3.9-36 37.5z" fill="#c3c2c3"/><path d="m237.1 733.9 7.1-7.4-.7-4-9.4 9.8c1 .1 2.2.6 3 1.6z" fill="#c3c2c3"/><path d="m243.9 739.4.9-.9v-4.8l-5.4 5.7z" fill="#c3c2c3"/><path d="m219.6 739.4 22.6-23.5-.8-3.9-26.3 27.4z" fill="#c3c2c3"/><g fill="#4f4f4f"><path d="m203 694.9h-.9v1z"/><path d="m202.1 702.2 7-7.3h-1.5l-5.5 5.7z"/><path d="m202.1 708.5 13.1-13.6h-1.5l-11.6 12.1z"/><path d="m202.1 714.9 19.2-20h-1.6l-17.6 18.4z"/><path d="m202.1 721.2 25.2-26.3h-1.5l-23.7 24.7z"/><path d="m202.1 727.6 31.3-32.7h-1.5l-29.8 31.1z"/><path d="m202.1 733.9 36-37.5-.3-1.3-35.7 37.2z"/><path d="m202.1 739.4h.8l36.3-37.8-.3-1.3-36.8 38.3z"/><path d="m209 739.4 31.3-32.6-.3-1.3-32.6 33.9z"/><path d="m215.1 739.4 26.3-27.4-.3-1.3-27.6 28.7z"/><path d="m221.1 739.4 21.4-22.2-.1-.6-.2-.7-22.6 23.5z"/><path d="m234 732.4 9.4-9.8-.2-1.3-11.2 11.5c.6-.3 1.3-.4 2-.4z"/><path d="m229.8 736.7c0-.3.1-.5.1-.8.1-.5.2-.9.4-1.3l-4.6 4.8h1.5z"/><path d="m237.6 734.9 6.8-7-.2-1.3-7.1 7.4c.2.2.4.6.5.9z"/><path d="m239.4 739.4 5.5-5.7v-1.6l-6.8 7.1v.2z"/><path d="m244.8 739.4v-.9l-.9.9z"/></g><path d="m172.5 650.5-13.1 13.6v4.7l17.6-18.3z" fill="#c3c2c3"/><path d="m178.6 650.5-19.2 19.9v4.7l23.7-24.6z" fill="#c3c2c3"/><path d="m190.7 650.5-31.3 32.6v4.7l35.9-37.3z" fill="#c3c2c3"/><path d="m184.6 650.5-25.2 26.2v4.8l29.8-31z" fill="#c3c2c3"/><path d="m196.8 650.5-37.4 38.9v4.7l42-43.6z" fill="#c3c2c3"/><path d="m195.1 694.9 7-7.2v-4.8l-11.5 12z" fill="#c3c2c3"/><path d="m183 694.9 19.1-19.9v-4.7l-23.7 24.6z" fill="#c3c2c3"/><path d="m171 650.5h-4.6l-6.6 6.8-.4 2.2v3z" fill="#c3c2c3"/><path d="m189.1 694.9 13-13.6v-4.7l-17.6 18.3z" fill="#c3c2c3"/><path d="m161 650.5-.8 4.9 4.7-4.9z" fill="#c3c2c3"/><path d="m176.9 694.9 25.2-26.2v-4.8l-29.7 31z" fill="#c3c2c3"/><path d="m164.7 694.9 37.4-38.9v-4.8l-41.9 43.7z" fill="#c3c2c3"/><path d="m170.8 694.9 31.3-32.6v-4.7l-35.8 37.3z" fill="#c3c2c3"/><path d="m201.2 694.9.9-.9v-4.7l-5.4 5.6z" fill="#c3c2c3"/><path d="m164.9 650.5-4.7 4.9-.4 1.9 6.6-6.8z" fill="#4f4f4f"/><path d="m171 650.5-11.6 12v1.6l13.1-13.6z" fill="#4f4f4f"/><path d="m177 650.5-17.6 18.3v1.6l19.2-19.9z" fill="#4f4f4f"/><path d="m183.1 650.5-23.7 24.6v1.6l25.2-26.2z" fill="#4f4f4f"/><path d="m189.2 650.5-29.8 31v1.6l31.3-32.6z" fill="#4f4f4f"/><path d="m195.3 650.5-35.9 37.3v1.6l37.4-38.9z" fill="#4f4f4f"/><path d="m202.1 651.2v-.7h-.7l-42 43.6v.8h.8z" fill="#4f4f4f"/><path d="m166.3 694.9 35.8-37.3v-1.6l-37.4 38.9z" fill="#4f4f4f"/><path d="m172.4 694.9 29.7-31v-1.6l-31.3 32.6z" fill="#4f4f4f"/><path d="m178.4 694.9 23.7-24.6v-1.6l-25.2 26.2z" fill="#4f4f4f"/><path d="m184.5 694.9 17.6-18.3v-1.6l-19.1 19.9z" fill="#4f4f4f"/><path d="m190.6 694.9 11.5-12v-1.6l-13 13.6z" fill="#4f4f4f"/><path d="m196.7 694.9 5.4-5.6v-1.6l-7 7.2z" fill="#4f4f4f"/><path d="m202.1 694.9v-.9l-.9.9z" fill="#4f4f4f"/><path d="m239.4 739.4h-1.3c.8 13.4 1.8 28.4 2.9 44.5h3.1.8v-.8-4.7-1.6-4.8-1.6-4.7-1.6-4.7-1.6-4.8-1.6-4.7-1.6-4.7-.9h-.9-4.6z" fill="#c3c2c3"/><path d="m215.2 783.9h4.6 1.5 2.5c2.1-16.4 4-31.4 5.7-44.5h-2.3-1.5-4.6-1.5-4.6-1.5-4.5-1.5-4.6-.8v.8 4.7 1.6 4.7 1.6 4.7 1.6 4.7 1.6 4.7 1.6 4.7 1.6.4c3.1 1.8 6.1 3.6 9.2 5.3h2.4 1.5z" fill="#c3c2c3"/><path d="m242.5 799.8c.8.4 1.5.7 2.3 1v-3.4z" fill="#c3c2c3"/><path d="m221.9 789.6c.4.2.7.4 1.1.6.1-.6.2-1.3.2-1.9z" fill="#c3c2c3"/><path d="m215.2 783.9-1.4 1.4c1 .6 2 1.1 3 1.6l2.9-3z" fill="#c3c2c3"/><path d="m223.7 783.9h-2.5l-3.4 3.6c1 .5 2 1.1 3 1.6l2.6-2.7c.1-.8.2-1.7.3-2.5z" fill="#c3c2c3"/><path d="m211.3 783.9c.5.3 1 .6 1.5.9l.8-.9z" fill="#c3c2c3"/><path d="m241.6 792.9 3.3-3.4v-4.7l-3.6 3.7c0 1.4.2 2.9.3 4.4z" fill="#c3c2c3"/><path d="m240.9 783.9c.1 1 .1 2 .2 3l2.9-3z" fill="#c3c2c3"/><path d="m242 798.7 2.8-3v-4.7l-3.2 3.3c.2 1.5.3 3 .4 4.4z" fill="#c3c2c3"/><path d="m213.7 783.9-.8.9c.3.2.7.4 1 .5l1.4-1.4z" fill="#4f4f4f"/><path d="m219.7 783.9-2.9 3c.3.2.7.4 1 .5l3.4-3.6h-1.5z" fill="#4f4f4f"/><path d="m223.4 786.4-2.6 2.7c.3.2.7.4 1 .5l1.3-1.4c.2-.6.3-1.2.3-1.8z" fill="#4f4f4f"/><path d="m241.1 787c0 .5.1 1 .1 1.5l3.6-3.7v-.8h-.8z" fill="#4f4f4f"/><path d="m241.7 794.3 3.2-3.3v-1.6l-3.3 3.4c0 .5 0 1 .1 1.5z" fill="#4f4f4f"/><path d="m244.8 795.8-2.8 3c0 .3 0 .5.1.8.2.1.3.2.5.2l2.3-2.4v-1.6z" fill="#4f4f4f"/><path d="m196.8 739.4-20.8 21.7c.9.7 1.8 1.3 2.6 2l22.7-23.7z" fill="#c3c2c3"/><path d="m202.1 746.6-19 19.8c.9.6 1.8 1.3 2.7 1.9l16.3-16.9z" fill="#c3c2c3"/><path d="m201.9 778.5c.1 0 .2.1.2.1v-.4z" fill="#c3c2c3"/><path d="m166.4 739.4-7 7.3v.2c.7.7 1.5 1.5 2.3 2.2l9.2-9.6h-4.5z" fill="#c3c2c3"/><path d="m202.1 740.2-22.6 23.5c.9.7 1.8 1.3 2.7 1.9l19.9-20.7z" fill="#c3c2c3"/><path d="m202.1 759.2-11.6 12.1c.9.6 1.9 1.2 2.8 1.8l8.8-9.2z" fill="#c3c2c3"/><path d="m202.1 765.6-7.9 8.2c.9.6 1.9 1.2 2.8 1.8l5-5.3v-4.7z" fill="#c3c2c3"/><path d="m202.1 771.9-4.1 4.3c1 .6 1.9 1.2 2.9 1.8l1.2-1.3z" fill="#c3c2c3"/><path d="m178.6 739.4-12.8 13.3c.8.7 1.6 1.4 2.5 2.1l14.9-15.5h-4.6z" fill="#c3c2c3"/><path d="m184.6 739.4-15.5 16.2c.8.7 1.7 1.4 2.5 2.1l17.6-18.3z" fill="#c3c2c3"/><path d="m160.3 739.4-.9 1v4.7l5.5-5.7z" fill="#c3c2c3"/><path d="m172.5 739.4-10 10.4c.8.7 1.6 1.5 2.4 2.2l12.1-12.6z" fill="#c3c2c3"/><path d="m202.1 752.9-15.3 16c.9.6 1.8 1.2 2.8 1.9l12.6-13.1v-4.8z" fill="#c3c2c3"/><path d="m190.7 739.4-18.2 19c.9.7 1.7 1.4 2.6 2l20.2-21z" fill="#c3c2c3"/><path d="m159.4 739.4v1l.9-1z" fill="#4f4f4f"/><path d="m159.4 745.1v1.6l7-7.3h-1.5z" fill="#4f4f4f"/><path d="m171 739.4-9.2 9.6c.3.3.5.5.8.8l10-10.4z" fill="#4f4f4f"/><path d="m177 739.4-12.1 12.6c.3.2.6.5.8.7l12.8-13.3z" fill="#4f4f4f"/><path d="m183.1 739.4-14.9 15.5c.3.2.6.5.8.7l15.5-16.2z" fill="#4f4f4f"/><path d="m189.2 739.4-17.6 18.3c.3.2.6.5.9.7l18.2-19z" fill="#4f4f4f"/><path d="m195.3 739.4-20.2 21c.3.2.6.5.9.7l20.8-21.7z" fill="#4f4f4f"/><path d="m202.1 739.4h-.8l-22.7 23.7c.3.2.6.4.9.7l22.6-23.5z" fill="#4f4f4f"/><path d="m202.1 745-19.9 20.7c.3.2.6.4.9.6l19-19.8z" fill="#4f4f4f"/><path d="m202.1 751.3-16.3 16.9.9.6 15.3-16v-1.5z" fill="#4f4f4f"/><path d="m202.1 757.6-12.6 13.1.9.6 11.6-12.1v-1.6z" fill="#4f4f4f"/><path d="m202.1 764-8.8 9.2c.3.2.6.4.9.6l7.9-8.2z" fill="#4f4f4f"/><path d="m202.1 770.3-5 5.3c.3.2.6.4 1 .6l4.1-4.3v-1.6z" fill="#4f4f4f"/><path d="m202.1 776.6-1.2 1.3c.3.2.6.4 1 .6l.2-.2z" fill="#4f4f4f"/><path d="m158.7 694.9h.7v-.8-4.7-1.6-4.7-1.6-4.8-1.6-4.7-1.6-4.7-1.6-3l-6.3 35.4h1z" fill="#c3c2c3"/><path d="m159.4 702.1-9.3 9.7-1 5.8 10.3-10.8z" fill="#c3c2c3"/><path d="m159.4 714.7-12.1 12.6-.7 4.1c.2.3.4.5.5.8l12.3-12.8z" fill="#c3c2c3"/><path d="m159.4 733.7-5.4 5.7h4.5l.9-.9z" fill="#c3c2c3"/><path d="m154.1 694.9-1.2 1.3-1.1 5.9 6.9-7.2z" fill="#c3c2c3"/><path d="m159.4 727.4-9 9.4c.7.9 1.4 1.7 2.1 2.6l6.9-7.2z" fill="#c3c2c3"/><path d="m159.4 695.7-7.9 8.3-1.1 5.8 9-9.3z" fill="#c3c2c3"/><path d="m159.4 708.4-10.7 11.2-1 5.8 11.7-12.3z" fill="#c3c2c3"/><path d="m159.4 721.1-11.7 12.2c.6.9 1.3 1.8 2 2.7l9.7-10.1z" fill="#c3c2c3"/><path d="m153.1 694.9-.2 1.3 1.2-1.3z" fill="#4f4f4f"/><path d="m159.4 695.7v-.8h-.7l-6.9 7.2-.3 1.9z" fill="#4f4f4f"/><path d="m159.4 700.5-9 9.3-.3 2 9.3-9.7z" fill="#4f4f4f"/><path d="m159.4 706.8-10.3 10.8-.4 2 10.7-11.2z" fill="#4f4f4f"/><path d="m159.4 713.1-11.7 12.3-.4 2 12.1-12.7z" fill="#4f4f4f"/><path d="m159.4 719.5-12.3 12.8.6.9 11.7-12.2z" fill="#4f4f4f"/><path d="m159.4 725.8-9.7 10.1c.2.3.5.6.7.9l9-9.4z" fill="#4f4f4f"/><path d="m159.4 733.7v-1.6l-6.9 7.2v.1h1.4z" fill="#4f4f4f"/><path d="m158.5 739.4h.9v-.9z" fill="#4f4f4f"/><path d="m159.4 745.1v-4.7-.9h-.9-4.5-1.4c2.1 2.5 4.4 5 6.9 7.4v-.2-1.6z" fill="#c3c2c3"/><path d="m633.1 741.4c0-.3-.1-.6-.1-.9 0-.2-.1-.3-.1-.4-.3-1.3-.9-2.2-1.7-2.7-.3-.2-.7-.3-1-.4-1.8-.3-3.9.9-4 3.8 0 .4 0 .8-.1 1.2 0 .6-.1 1.1-.1 1.7v.3c-.3 5.5-.6 11.3-.9 17.3 0 .3 0 .6-.1 1 0 .6-.1 1.1-.1 1.7-.1 1.7-.2 3.4-.3 5.1 0 .6-.1 1.1-.1 1.7-.1 1.7-.2 3.4-.3 5.1 0 .6-.1 1.1-.1 1.7-.1 1-.1 1.9-.2 2.9 4.1-2 8.4-4.2 12.7-6.6-1.2-10.8-2.3-20.8-3.3-29.9 0-.9-.1-1.7-.2-2.6z" fill="#4f4f4f"/><path d="m661.8 610.5v.8 4.8 1.6 4.7 1.6 4.8 1.5 4.8 1.6 4.7 1.6 4.8 1.6 4.7.9h.8 3.9 1.3 3.9l-5.4-44.5h-3.8z" fill="#4f4f4f"/><path d="m661.8 597.1 2.5-3.1-.5-4.1-2 2.4z" fill="#c3c2c3"/><path d="m661.8 590.7 1.9-2.2-.5-4.1-1.4 1.6z" fill="#c3c2c3"/><path d="m662.3 577.5-.5-4.1v4.7z" fill="#c3c2c3"/><path d="m661.8 603.4 3.2-3.8-.5-4.2-2.7 3.3z" fill="#c3c2c3"/><path d="m661.8 584.4 1.2-1.4-.5-4.1-.7.8z" fill="#c3c2c3"/><path d="m661.8 609.7 3.9-4.6-.5-4.1-3.4 4z" fill="#c3c2c3"/><path d="m666.3 610.5-.5-4-3.3 4z" fill="#c3c2c3"/><path d="m661.8 579.7.7-.8-.2-1.4-.5.6z" fill="#4f4f4f"/><path d="m661.8 586 1.4-1.6-.2-1.4-1.2 1.4z" fill="#4f4f4f"/><path d="m661.8 592.3 2-2.4-.1-1.4-1.9 2.2z" fill="#4f4f4f"/><path d="m661.8 598.7 2.7-3.3-.2-1.4-2.5 3.1z" fill="#4f4f4f"/><path d="m661.8 605 3.4-4-.2-1.4-3.2 3.8z" fill="#4f4f4f"/><path d="m661.8 610.5h.7l3.3-4-.1-1.4-3.9 4.6z" fill="#4f4f4f"/><path d="m672.9 699.5h-1.3-3.9-1.3-3.9-.7v.8 4.7 1.6 4.7 1.6 4.7 1.6 4.7 1.6 4.7 1.6 4.7 1.6 4.7.9h.8 3.9 1.3 3.9 1.3.7c2.8-3.4 5.2-7 7.4-10.7l-4.1-33.8h-.2-3.9z" fill="#4f4f4f"/><path d="m661.8 686 11.9-14.4-.5-4.1-11.4 13.8z" fill="#c3c2c3"/><path d="m661.8 673.4 10.6-12.8-.5-4.1-10.1 12.1z" fill="#c3c2c3"/><path d="m671.6 699.5 4.8-5.8-.5-4.1-8.2 9.9z" fill="#c3c2c3"/><path d="m661.8 660.7 4.7-5.7h-3.9l-.8 1z" fill="#c3c2c3"/><path d="m661.8 698.7 13.2-16-.5-4.1-12.7 15.4z" fill="#c3c2c3"/><path d="m676.8 699.5.3-.2-.6-4.2-3.6 4.4z" fill="#c3c2c3"/><path d="m661.8 662.3v4.7l9.9-11.9v-.1h-3.9z" fill="#c3c2c3"/><path d="m661.8 679.7 11.2-13.6-.5-4.1-10.7 13z" fill="#c3c2c3"/><path d="m666.4 699.5 9.3-11.3-.5-4.1-12.7 15.4z" fill="#c3c2c3"/><path d="m661.8 692.4 12.6-15.2-.5-4.2-12.1 14.6z" fill="#c3c2c3"/><path d="m662.6 655h-.8v1z" fill="#4f4f4f"/><path d="m661.8 662.3 6-7.3h-1.3l-4.7 5.7z" fill="#4f4f4f"/><path d="m661.8 668.6 10.1-12.1-.2-1.4-9.9 11.9z" fill="#4f4f4f"/><path d="m661.8 675 10.7-13-.1-1.4-10.6 12.8z" fill="#4f4f4f"/><path d="m661.8 681.3 11.4-13.8-.2-1.4-11.2 13.6z" fill="#4f4f4f"/><path d="m661.8 687.6 12.1-14.6-.2-1.4-11.9 14.4z" fill="#4f4f4f"/><path d="m661.8 694 12.7-15.4-.1-1.4-12.6 15.2z" fill="#4f4f4f"/><path d="m661.8 699.5h.7l12.7-15.4-.2-1.4-13.2 16z" fill="#4f4f4f"/><path d="m667.7 699.5 8.2-9.9-.2-1.4-9.3 11.3z" fill="#4f4f4f"/><path d="m672.9 699.5 3.6-4.4-.1-1.4-4.8 5.8z" fill="#4f4f4f"/><path d="m677.1 699.5v-.2l-.3.2z" fill="#4f4f4f"/><path d="m661.8 749.7 4.7-5.7h-3.9l-.8.9z" fill="#c3c2c3"/><path d="m666.3 752.1c2.6-2.6 5.1-5.3 7.4-8.1h-.7z" fill="#c3c2c3"/><path d="m661.8 756 9.9-12h-3.9l-6 7.3z" fill="#c3c2c3"/><path d="m662.6 744h-.8v.9z" fill="#4f4f4f"/><path d="m661.8 751.3 6-7.3h-1.3l-4.7 5.7z" fill="#4f4f4f"/><path d="m671.7 744-9.9 12v.3c1.5-1.4 3.1-2.8 4.5-4.2l6.7-8.1z" fill="#4f4f4f"/><path d="m645.5 521.6h1.3 3.9 1.3 3.6l-4.7-38.9-9.4 38.9h.1z" fill="#c3c2c3"/><path d="m655.8 523.4-20.8 25.1-1.6 6.7 22.9-27.7z" fill="#c3c2c3"/><path d="m656.4 528.9-23.6 28.6-1.6 6.7 25.7-31.2z" fill="#c3c2c3"/><path d="m650.6 566.1 9-11-.5-4.1-12.4 15.1z" fill="#c3c2c3"/><path d="m634.9 566.1 22.7-27.5-.5-4.2-26.1 31.7z" fill="#c3c2c3"/><path d="m655.8 566.1 4.5-5.4-.5-4.2-7.9 9.6z" fill="#c3c2c3"/><path d="m640.1 566.1 18.2-22-.5-4.2-21.6 26.2z" fill="#c3c2c3"/><path d="m660.9 566.1-.5-4.1-3.3 4.1z" fill="#c3c2c3"/><path d="m645.4 566.1 13.5-16.5-.5-4.1-17 20.6z" fill="#c3c2c3"/><path d="m641.6 521.6-.1.1-1.6 6.7 5.6-6.8z" fill="#c3c2c3"/><path d="m646.8 521.6-7.5 9-1.6 6.7 13-15.7z" fill="#c3c2c3"/><path d="m655.6 521.6h-3.6l-14.8 18-1.7 6.7 20.1-24.3z" fill="#c3c2c3"/><path d="m641.5 521.6v.1l.1-.1z" fill="#4f4f4f"/><path d="m645.5 521.6-5.6 6.8-.6 2.2 7.5-9z" fill="#4f4f4f"/><path d="m650.7 521.6-13 15.7-.5 2.3 14.8-18z" fill="#4f4f4f"/><path d="m655.6 522-20.1 24.3-.5 2.2 20.8-25.1z" fill="#4f4f4f"/><path d="m656.3 527.5-22.9 27.7-.6 2.3 23.6-28.6z" fill="#4f4f4f"/><path d="m657.1 534.4-.2-1.4-25.7 31.2-.4 1.9h.2z" fill="#4f4f4f"/><path d="m636.2 566.1 21.6-26.2-.2-1.3-22.7 27.5z" fill="#4f4f4f"/><path d="m641.4 566.1 17-20.6-.1-1.4-18.2 22z" fill="#4f4f4f"/><path d="m646.7 566.1 12.4-15.1-.2-1.4-13.5 16.5z" fill="#4f4f4f"/><path d="m651.9 566.1 7.9-9.6-.2-1.4-9 11z" fill="#4f4f4f"/><path d="m657.1 566.1 3.3-4.1-.1-1.3-4.5 5.4z" fill="#4f4f4f"/><path d="m614 655h1.3 3.9 1.3 3.9.7v-.8-4.7-1.6-4.7-1.6-4.8-1.6-4.7-1.6-4.7-1.6-4.8-1.6-4.7-1h-.8-3.9-.3l-10.8 44.5h.8z" fill="#4f4f4f"/><path d="m625.1 590.6v1.6 4.7 1.6 4.8 1.6 4.7.9h.8 3.9 1.3 3.9 1.3 3.9 1.4 3.9 1.3 3.9 1.3 3.9 1.3 4 .6v-.8-4.7-1.6-4.7-1.6-4.8-1.6-4.7-1.6-4.7-1.6-4.7l-.9-7.3h-3.8-1.3-3.9-1.3-3.9-1.3-4-1.3-3.9-1.3-3.9-.2l-5.7 23.5z" fill="#c3c2c3"/><path d="m646.7 655h3.9l11.2-13.6v-4.7z" fill="#c3c2c3"/><path d="m625.1 622.6 9.9-12.1h-3.9l-6 7.3z" fill="#c3c2c3"/><path d="m625.1 635.2 20.4-24.7h-3.9l-16.5 20z" fill="#c3c2c3"/><path d="m625.1 641.6 25.6-31.1h-3.9l-21.7 26.3z" fill="#c3c2c3"/><path d="m625.1 628.9 15.1-18.4h-3.9l-11.2 13.7z" fill="#c3c2c3"/><path d="m625.1 616.2 4.7-5.7h-3.9l-.8 1z" fill="#c3c2c3"/><path d="m625.1 654.2 36.1-43.7h-4l-32.1 39z" fill="#c3c2c3"/><path d="m625.8 655h3.9l32.1-38.9v-4.8z" fill="#c3c2c3"/><path d="m651.9 655h3.9l6-7.2v-4.8z" fill="#c3c2c3"/><path d="m641.4 655h4l16.4-19.9v-4.8z" fill="#c3c2c3"/><path d="m625.1 647.9 30.8-37.4h-3.9l-26.9 32.7z" fill="#c3c2c3"/><path d="m631 655h3.9l26.9-32.6v-4.7z" fill="#c3c2c3"/><path d="m636.2 655h3.9l21.7-26.2v-4.8z" fill="#c3c2c3"/><path d="m657.1 655h3.9l.8-.9v-4.7z" fill="#c3c2c3"/><path d="m625.9 610.5h-.8v1z" fill="#4f4f4f"/><path d="m625.1 617.8 6-7.3h-1.3l-4.7 5.7z" fill="#4f4f4f"/><path d="m625.1 624.2 11.2-13.7h-1.3l-9.9 12.1z" fill="#4f4f4f"/><path d="m625.1 630.5 16.5-20h-1.4l-15.1 18.4z" fill="#4f4f4f"/><path d="m625.1 636.8 21.7-26.3h-1.3l-20.4 24.7z" fill="#4f4f4f"/><path d="m625.1 643.2 26.9-32.7h-1.3l-25.6 31.1z" fill="#4f4f4f"/><path d="m625.1 649.5 32.1-39h-1.3l-30.8 37.4z" fill="#4f4f4f"/><path d="m625.1 655h.7l36-43.7v-.8h-.6l-36.1 43.7z" fill="#4f4f4f"/><path d="m629.7 655h1.3l30.8-37.3v-1.6z" fill="#4f4f4f"/><path d="m634.9 655h1.3l25.6-31v-1.6z" fill="#4f4f4f"/><path d="m640.1 655h1.3l20.4-24.7v-1.5z" fill="#4f4f4f"/><path d="m645.4 655h1.3l15.1-18.3v-1.6z" fill="#4f4f4f"/><path d="m650.6 655h1.3l9.9-12v-1.6z" fill="#4f4f4f"/><path d="m655.8 655h1.3l4.7-5.6v-1.6z" fill="#4f4f4f"/><path d="m661 655h.8v-.9z" fill="#4f4f4f"/><path d="m624.3 610.5.8-.9v-4.7l-4.7 5.6z" fill="#c3c2c3"/><path d="m625.1 598.5-3 3.7-1.6 6.7 4.6-5.6z" fill="#c3c2c3"/><path d="m625.1 589.6-.3 1.4.3-.4z" fill="#c3c2c3"/><path d="m625.1 592.2-.9 1.1-1.6 6.7 2.5-3.1z" fill="#c3c2c3"/><path d="m625.1 590.6-.3.4-.6 2.3.9-1.1z" fill="#4f4f4f"/><path d="m625.1 596.9-2.5 3.1-.5 2.2 3-3.7z" fill="#4f4f4f"/><path d="m625.1 604.9v-1.6l-4.6 5.6-.4 1.6h.3z" fill="#4f4f4f"/><path d="m625.1 610.5v-.9l-.8.9z" fill="#4f4f4f"/><path d="m588.4 744h.8 3.9 1.3 3.9 1.3 3.9 1.4 3.9 1.3 3.9 1.3 3.9 1.3 3.9.7v-.8-4.7-1.6-4.8-1.6-4.7-1.6-4.7-1.6-4.8-1.6-4.7-1.6-4.7-1h-.8-3.9-1.3-3.9-1.3-3.9-1.3-4-1.3-3.9-.9l-10.2 42.4v1.2z" fill="#4f4f4f"/><path d="m661 655h-3.9-1.3-3.9-1.3-3.9-1.3-4-1.3-3.9-1.3-3.9-1.3-3.9-.7v.8 4.8 1.6 4.7 1.6 4.7 1.6 4.8 1.6 4.7 1.6 4.7 1.6 4.8.9h.8 3.9 1.3 3.9 1.3 3.9 1.4 3.9 1.3 3.9 1.3 3.9 1.3 4 .6v-.8-4.7-1.6-4.8-1.6-4.7-1.6-4.7-1.6-4.8-1.6-4.7-1.6-4.7-1z" fill="#c3c2c3"/><path d="m657.2 699.5-32.1 38.9v4.7l1-1.2c0-.4 0-.8.1-1.2.1-2.8 2.2-4.1 4-3.8l31-37.5h-4z" fill="#c3c2c3"/><path d="m657.1 744h3.9l.8-.9v-4.8z" fill="#c3c2c3"/><path d="m652 699.5-26.9 32.6v4.8l30.8-37.4z" fill="#c3c2c3"/><path d="m631.1 699.5-6 7.3v4.7l9.9-12z" fill="#c3c2c3"/><path d="m625.9 699.5-.8 1v4.7l4.7-5.7z" fill="#c3c2c3"/><path d="m646.7 744h3.9l11.2-13.6v-4.7z" fill="#c3c2c3"/><path d="m641.4 744h4l16.4-19.9v-4.8z" fill="#c3c2c3"/><path d="m651.9 744h3.9l6-7.3v-4.7z" fill="#c3c2c3"/><path d="m641.6 699.5-16.5 20v4.7l20.4-24.7z" fill="#c3c2c3"/><path d="m636.2 744h3.9l21.7-26.3v-4.7z" fill="#c3c2c3"/><path d="m636.3 699.5-11.2 13.6v4.8l15.1-18.4z" fill="#c3c2c3"/><path d="m626 744c0-.1 0-.2 0-.3l-.3.3z" fill="#c3c2c3"/><path d="m646.8 699.5-21.7 26.3v4.7l25.6-31z" fill="#c3c2c3"/><path d="m633.1 741.4c.1.8.2 1.7.3 2.6h1.5l26.9-32.6v-4.7z" fill="#c3c2c3"/><path d="m631.2 737.4c.8.5 1.5 1.4 1.7 2.7l28.9-35v-4.7z" fill="#c3c2c3"/><path d="m625.1 699.5v1l.8-1z" fill="#4f4f4f"/><path d="m629.8 699.5-4.7 5.7v1.6l6-7.3z" fill="#4f4f4f"/><path d="m635 699.5-9.9 12v1.6l11.2-13.6z" fill="#4f4f4f"/><path d="m640.2 699.5-15.1 18.4v1.6l16.5-20z" fill="#4f4f4f"/><path d="m645.5 699.5-20.4 24.7v1.6l21.7-26.3z" fill="#4f4f4f"/><path d="m650.7 699.5-25.6 31v1.6l26.9-32.6z" fill="#4f4f4f"/><path d="m655.9 699.5-30.8 37.4v1.6l32.1-39z" fill="#4f4f4f"/><path d="m625.1 744h.7l.3-.3c0-.6.1-1.1.1-1.7l-1 1.2v.8z" fill="#4f4f4f"/><path d="m661.2 699.5-31 37.5c.3.1.7.2 1 .4l30.6-37.1v-.8z" fill="#4f4f4f"/><path d="m632.9 740.1c0 .1.1.3.1.4 0 .3.1.6.1.9l28.7-34.8v-1.6z" fill="#4f4f4f"/><path d="m634.9 744h1.3l25.6-31v-1.6z" fill="#4f4f4f"/><path d="m640.1 744h1.3l20.4-24.7v-1.6z" fill="#4f4f4f"/><path d="m645.4 744h1.3l15.1-18.3v-1.6z" fill="#4f4f4f"/><path d="m650.6 744h1.3l9.9-12v-1.6z" fill="#4f4f4f"/><path d="m655.8 744h1.3l4.7-5.7v-1.6z" fill="#4f4f4f"/><path d="m661 744h.8v-.9z" fill="#4f4f4f"/><path d="m625.1 662.2-24.7 29.9-1.6 6.7 26.3-31.9z" fill="#c3c2c3"/><path d="m625.1 674.8-20.4 24.7h4l16.4-19.9z" fill="#c3c2c3"/><path d="m620.5 655-15.8 19.2-1.6 6.7 21.3-25.9z" fill="#c3c2c3"/><path d="m625.1 687.5-9.9 12h3.9l6-7.3z" fill="#c3c2c3"/><path d="m625.1 693.8-4.7 5.7h3.9l.8-.9z" fill="#c3c2c3"/><path d="m625.1 655.8-22.5 27.3-1.6 6.7 24.1-29.2z" fill="#c3c2c3"/><path d="m625.1 681.2-15.1 18.3h3.9l11.2-13.6z" fill="#c3c2c3"/><path d="m615.3 655-8.4 10.3-1.6 6.6 13.9-16.9z" fill="#c3c2c3"/><path d="m610.1 655-1.1 1.3-1.6 6.7 6.6-8z" fill="#c3c2c3"/><path d="m625.1 668.5-25.6 31h3.9l21.7-26.3z" fill="#c3c2c3"/><path d="m609.3 655-.3 1.3 1.1-1.3z" fill="#4f4f4f"/><path d="m614 655-6.6 8-.5 2.3 8.4-10.3z" fill="#4f4f4f"/><path d="m619.2 655-13.9 16.9-.6 2.3 15.8-19.2z" fill="#4f4f4f"/><path d="m625.1 655h-.7l-21.3 25.9-.5 2.2 22.5-27.3z" fill="#4f4f4f"/><path d="m625.1 660.6-24.1 29.2-.6 2.3 24.7-29.9z" fill="#4f4f4f"/><path d="m625.1 668.5v-1.6l-26.3 31.9-.2.7h.9z" fill="#4f4f4f"/><path d="m625.1 673.2-21.7 26.3h1.3l20.4-24.7z" fill="#4f4f4f"/><path d="m625.1 679.6-16.4 19.9h1.3l15.1-18.3z" fill="#4f4f4f"/><path d="m625.1 685.9-11.2 13.6h1.3l9.9-12z" fill="#4f4f4f"/><path d="m625.1 692.2-6 7.3h1.3l4.7-5.7z" fill="#4f4f4f"/><path d="m624.3 699.5h.8v-.9z" fill="#4f4f4f"/><path d="m603.4 788.5h-3.9-1.3-3.9-1.3-3.9-.7v.8 4.6l2-.4s5.9-1.6 14.9-5h-.5z" fill="#4f4f4f"/><path d="m625.1 744v.8 4.7 1.6 4.7 1.6 3.8c.3-6 .6-11.8.9-17.3h-.3-.6z" fill="#c3c2c3"/><path d="m661.8 751.3v-1.6-4.7-1h-.8-3.9-1.3-3.9-1.3-3.9-1.3-3.9-1.3-3.9-1.3-1.5c1 9.1 2.1 19.1 3.3 29.9 8.6-4.9 17.3-10.7 25.1-17.6v-.3-4.7z" fill="#c3c2c3"/><path d="m604.9 744-16.5 19.9v4.8l20.4-24.7z" fill="#c3c2c3"/><path d="m599.6 744-11.2 13.6v4.8l15.1-18.4z" fill="#c3c2c3"/><path d="m620.5 744-32.1 39v4.7l36-43.7z" fill="#c3c2c3"/><path d="m610.1 744-21.7 26.3v4.7l25.6-31z" fill="#c3c2c3"/><path d="m615.3 744-26.9 32.6v4.8l30.8-37.4z" fill="#c3c2c3"/><path d="m599.5 788.5h3.9l21.6-26.2c0-.3 0-.6.1-1v-3.8z" fill="#c3c2c3"/><path d="m625.1 751.1-30.8 37.4h3.9l26.9-32.6z" fill="#c3c2c3"/><path d="m620.4 782.2c1.2-.5 2.4-1.1 3.6-1.7.1-1 .1-1.9.2-2.9z" fill="#c3c2c3"/><path d="m625.1 744.8-36 43.7h3.9l32.1-39z" fill="#c3c2c3"/><path d="m624.6 770.8-12.3 15c1.9-.8 4-1.7 6.1-2.6l6-7.3c0-1.7.1-3.4.2-5.1z" fill="#c3c2c3"/><path d="m625 764-20.2 24.5h.5c1.6-.6 3.2-1.2 5-1.9l14.4-17.5c.1-1.7.2-3.4.3-5.1z" fill="#c3c2c3"/><path d="m594.4 744-6 7.3v4.7l9.9-12z" fill="#c3c2c3"/><path d="m589.2 744-.8.9v4.8l4.7-5.7z" fill="#c3c2c3"/><path d="m588.4 744v.9l.8-.9z" fill="#4f4f4f"/><path d="m593.1 744-4.7 5.7v1.6l6-7.3z" fill="#4f4f4f"/><path d="m598.3 744-9.9 12v1.6l11.2-13.6z" fill="#4f4f4f"/><path d="m603.5 744-15.1 18.4v1.5l16.5-19.9z" fill="#4f4f4f"/><path d="m608.8 744-20.4 24.7v1.6l21.7-26.3z" fill="#4f4f4f"/><path d="m614 744-25.6 31v1.6l26.9-32.6z" fill="#4f4f4f"/><path d="m619.2 744-30.8 37.4v1.6l32.1-39z" fill="#4f4f4f"/><path d="m625.1 744h-.7l-36 43.7v.8h.7l36-43.7z" fill="#4f4f4f"/><path d="m625.1 749.5-32.1 39h1.3l30.8-37.4z" fill="#4f4f4f"/><path d="m625.1 755.9-26.9 32.6h1.3l25.6-31z" fill="#4f4f4f"/><path d="m604.7 788.5 20.3-24.5c0-.6.1-1.1.1-1.7l-21.6 26.2z" fill="#4f4f4f"/><path d="m624.7 769.1-14.4 17.5c.6-.3 1.3-.5 2-.8l12.3-15c0-.6 0-1.2.1-1.7z" fill="#4f4f4f"/><path d="m624.3 775.9-6 7.3c.7-.3 1.4-.6 2.1-.9l3.8-4.6c0-.7.1-1.3.1-1.8z" fill="#4f4f4f"/><path d="m588.4 741.9-.4 1.6.4-.4z" fill="#c3c2c3"/><path d="m588.4 743.1-.4.4-.1.5h.5z" fill="#4f4f4f"/><path d="m578.6 788.5h3.9 1.3 3.9.7v-.8-4.7-1.6-4.8-1.6-4.7-1.6-4.8-1.5-4.8-1.6-4.7-1.6-4.8-.9h-.5l-10.7 44.5h.1z" fill="#c3c2c3"/><path d="m583.8 794.9 4.6-1v-4.6z" fill="#c3c2c3"/><path d="m578.6 788.5-2 2.4-1.4 5.8.7-.2 6.6-8z" fill="#c3c2c3"/><path d="m577.2 788.5-.1.2.2-.2z" fill="#c3c2c3"/><path d="m583.8 788.5-6.3 7.7 4.7-1 5.5-6.7z" fill="#c3c2c3"/><path d="m577.3 788.5-.2.2-.5 2.2 2-2.4z" fill="#4f4f4f"/><path d="m582.5 788.5-6.6 8 1.6-.3 6.3-7.7z" fill="#4f4f4f"/><path d="m588.4 788.5h-.7l-5.5 6.7 1.6-.3 4.6-5.6z" fill="#4f4f4f"/><path d="m336.3 426.5c-2.9.8-6.2 1.6-9.8 2.3 25.1 11.3 61.6 18.3 100.8 18.3 36.9 0 71.4-6.2 96.3-16.4-7.9-1.2-15.1-2.6-20.7-4.2s-19.6 12.5-83.1 12.5c-63.4 0-83.5-12.5-83.5-12.5z" fill="none"/><path d="m509 990.8h-16.2c5.3 0 10.7.1 16.2 0z" fill="#808080"/><path d="m427.3 447.1c-39.2 0-75.7-7-100.8-18.3-1.8.4-3.7.7-5.7 1.1.3.1.6.3.9.4s.6.3.8.4c.8.4 1.7.8 2.6 1.2.3.1.6.3.9.4.9.4 1.8.8 2.6 1.1.3.1.6.3.9.4.9.4 1.8.7 2.7 1.1.3.1.6.2.9.4.9.3 1.8.7 2.8 1 .1 0 .1 0 .2.1 1.8.7 3.7 1.3 5.6 1.9.7.2 1.3.4 2 .6.3.1.6.2 1 .3 1 .3 1.9.6 2.9.9.3.1.7.2 1 .3 1 .3 2 .6 2.9.8.3.1.7.2 1 .3 1 .3 2 .5 3 .8.3.1.7.2 1 .2 1 .2 2 .5 3 .7.3.1.7.2 1 .2 1 .2 2 .5 3.1.7.3.1.7.1 1 .2 1 .2 2.1.4 3.1.6.4.1.7.1 1.1.2 1.1.2 2.1.4 3.2.6.4.1.7.1 1.1.2 1.1.2 2.1.4 3.2.5.2 0 .4.1.5.1 11.1 1.8 22.9 3 35.2 3.6h1c.4 0 .8 0 1.2.1 1.2 0 2.4.1 3.6.1h1.2c1.2 0 2.5.1 3.7.1h1.2 3.3.5 1.3 3.8 1.3c1.3 0 2.6-.1 3.8-.1h1.3c1.3 0 2.6-.1 3.9-.2.4 0 .9 0 1.3-.1.9 0 1.9-.1 2.8-.2 12.3-.7 24.2-2.1 35.2-4.1.1 0 .2 0 .3-.1.5-.1 1-.2 1.5-.3 1.6-.3 3.1-.6 4.7-.9.5-.1 1.1-.2 1.6-.3 1.6-.3 3.2-.7 4.8-1.1.6-.1 1.1-.3 1.7-.4 1.7-.4 3.3-.8 5-1.3.6-.2 1.1-.3 1.7-.5 1.8-.5 3.5-1 5.2-1.5l1.8-.6c1.9-.6 3.7-1.2 5.5-1.8.5-.2.9-.3 1.4-.5.3-.1.6-.2.8-.3 1.9-.7 3.8-1.4 5.7-2.2.7-.3 1.4-.6 2.1-.9 1.2-.5 2.4-1.1 3.6-1.6-2.2-.3-4.3-.6-6.4-1-24.7 10.5-59.2 16.7-96.1 16.7z" fill="#808080"/><path d="m587.4 760.6h-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6-35.2-.7-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6-35.2-.8-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-.7-35.2-.7-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6-35.2-.7-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6-23.2 2.5 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7.7 35.2.7 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6 35.2.8 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7.6 35.3.7 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.7.7 35.2.7 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8.6 35.2.8 3.7.3-4.8z" fill="#808080"/><path d="m588.1 442.1v3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.6v-.6-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-1.3c-8.2-2.9-18.6-5-31.9-6.5-.9-.1-2.1-.2-3.3-.4v2.9 1.3z" fill="#808080"/><path d="m632.8 472.4 11.7-12c-.5-.8-1-1.6-1.5-2.3l-14 14.3z" fill="#e8e7e8"/><path d="m637.8 472.4 8.5-8.7c-.4-.9-.8-1.7-1.3-2.6l-11 11.2h3.8z" fill="#e8e7e8"/><path d="m623.4 461.5 11.1-11.4c-.8-.5-1.5-1-2.4-1.4l-8.7 8.9z" fill="#e8e7e8"/><path d="m623.4 456.3 7.9-8.1c-.8-.4-1.7-.9-2.5-1.3l-5.4 5.5z" fill="#e8e7e8"/><path d="m624.3 445.1c-.3-.1-.6-.2-.9-.3v1.3z" fill="#e8e7e8"/><path d="m642.8 472.4 4.9-5c-.3-1-.7-1.9-1-2.8l-7.6 7.8z" fill="#e8e7e8"/><path d="m647.8 472.4.9-1c-.2-1-.5-2.1-.8-3l-3.9 4z" fill="#e8e7e8"/><path d="m623.4 466.6 14-14.4c-.7-.6-1.4-1.1-2.2-1.6l-11.9 12.1v3.9z" fill="#e8e7e8"/><path d="m623.4 451.2 4.5-4.6c-.9-.4-1.8-.8-2.7-1.1l-1.8 1.9z" fill="#e8e7e8"/><path d="m627.7 472.4 14.7-15c-.5-.7-1.1-1.4-1.8-2l-16.6 17z" fill="#e8e7e8"/><path d="m623.4 471.7 16.7-17.1c-.6-.6-1.3-1.2-2-1.8l-14.7 15.1z" fill="#e8e7e8"/><path d="m623.4 447.4 1.8-1.9c-.3-.1-.6-.2-.9-.4l-.9 1z" fill="#808080"/><path d="m623.4 452.5 5.4-5.5c-.3-.1-.6-.3-.9-.4l-4.5 4.6z" fill="#808080"/><path d="m623.4 457.6 8.7-8.9c-.3-.2-.5-.3-.8-.4l-7.9 8.1z" fill="#808080"/><path d="m623.4 462.8 11.9-12.1c-.3-.2-.5-.3-.8-.5l-11.1 11.4z" fill="#808080"/><path d="m623.4 467.9 14.7-15.1c-.2-.2-.5-.4-.7-.6l-14 14.4z" fill="#808080"/><path d="m623.4 472.4h.6l16.7-17.1c-.2-.2-.4-.4-.6-.7l-16.7 17.1z" fill="#808080"/><path d="m629 472.4 14-14.3c-.2-.2-.4-.5-.5-.7l-14.7 15z" fill="#808080"/><path d="m634 472.4 11-11.2c-.2-.3-.3-.5-.5-.8l-11.7 12z" fill="#808080"/><path d="m639 472.4 7.6-7.8c-.1-.3-.3-.6-.4-.9l-8.5 8.7z" fill="#808080"/><path d="m644 472.4 3.9-4c-.1-.3-.2-.7-.3-1l-4.9 5z" fill="#808080"/><path d="m648.9 472.4c-.1-.3-.1-.6-.2-1l-.9 1z" fill="#808080"/><path d="m618.9 508.4h-1.3-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-.7v.7 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.8 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7.7v-.6-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-.8z" fill="#808080"/><path d="m644 472.4h-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.7-.6v.6 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3c1.8-7.9 2.9-13.4 3-15.9.2-7.7-.1-14.4-1.2-20.2h-1.1-4.2z" fill="#e8e7e8"/><path d="m623.4 513 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m623.4 543.8 20.3-20.8c.4-1.8.9-3.5 1.3-5.1l-21.6 22.1z" fill="#e8e7e8"/><path d="m623.4 538.7 22-22.5c.4-1.8.8-3.5 1.2-5.1l-23.2 23.8z" fill="#e8e7e8"/><path d="m623.4 529.7v3.8l23.6-24.2c.1-.3.1-.6.2-1h-3z" fill="#e8e7e8"/><path d="m627.7 544.4 14.2-14.5c.4-1.8.9-3.5 1.3-5.2l-19.2 19.7z" fill="#e8e7e8"/><path d="m637.8 544.4.7-.7c.4-1.8.9-3.5 1.3-5.2l-5.7 5.9z" fill="#e8e7e8"/><path d="m623.4 523.3 14.5-14.9h-3.8l-10.7 11z" fill="#e8e7e8"/><path d="m623.4 528.4 19.5-20h-3.8l-15.7 16.2z" fill="#e8e7e8"/><path d="m632.8 544.4 7.4-7.6c.4-1.8.9-3.5 1.3-5.2l-12.5 12.8z" fill="#e8e7e8"/><path d="m623.4 518.1 9.5-9.7h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m624.1 508.4h-.7v.8z" fill="#808080"/><path d="m623.4 514.3 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m623.4 519.4 10.7-11h-1.2l-9.5 9.7z" fill="#808080"/><path d="m623.4 524.6 15.7-16.2h-1.2l-14.5 14.9z" fill="#808080"/><path d="m623.4 529.7 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m623.4 534.8 23.2-23.8c.1-.6.3-1.1.4-1.7l-23.6 24.2z" fill="#808080"/><path d="m623.4 539.9 21.6-22.1c.1-.6.3-1.2.4-1.7l-22 22.5z" fill="#808080"/><path d="m623.4 544.4h.6l19.2-19.7c.1-.6.3-1.2.4-1.7l-20.3 20.8v.6z" fill="#808080"/><path d="m629 544.4 12.5-12.8c.1-.6.3-1.2.4-1.7l-14.2 14.5z" fill="#808080"/><path d="m634 544.4 5.7-5.9c.1-.6.3-1.2.4-1.7l-7.4 7.6z" fill="#808080"/><path d="m638.3 544.4c.1-.2.1-.5.2-.7l-.7.7z" fill="#808080"/><path d="m588.1 497.5 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m588.1 502.6 29.6-30.2h-3.7l-25.9 26.4z" fill="#e8e7e8"/><path d="m588.1 477 4.5-4.6h-3.7l-.8.7z" fill="#e8e7e8"/><path d="m588.1 482.1 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m588.1 492.4 19.6-20h-3.8l-15.8 16.1z" fill="#e8e7e8"/><path d="m588.1 487.2 14.6-14.8h-3.8l-10.8 11z" fill="#e8e7e8"/><path d="m612.6 508.4 10.8-11v-3.9l-14.6 14.9z" fill="#e8e7e8"/><path d="m617.6 508.4 5.8-5.9v-3.8l-9.6 9.7z" fill="#e8e7e8"/><path d="m607.6 508.4 15.8-16.1v-3.9l-19.6 20z" fill="#e8e7e8"/><path d="m592.5 508.4 30.9-31.5v-3.9l-34.6 35.4z" fill="#e8e7e8"/><path d="m588.1 507.8 34.6-35.4h-3.7l-30.9 31.5z" fill="#e8e7e8"/><path d="m602.6 508.4 20.8-21.3v-3.8l-24.6 25.1z" fill="#e8e7e8"/><path d="m597.5 508.4 25.9-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m622.6 508.4.8-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m588.9 472.4h-.8v.7z" fill="#808080"/><path d="m588.1 478.3 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m588.1 483.4 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m588.1 488.5 15.8-16.1h-1.2l-14.6 14.8z" fill="#808080"/><path d="m588.1 493.7 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m588.1 498.8 25.9-26.4h-1.3l-24.6 25.1z" fill="#808080"/><path d="m588.1 503.9 30.9-31.5h-1.3l-29.6 30.2z" fill="#808080"/><path d="m588.1 508.4h.7l34.6-35.4v-.6h-.7l-34.6 35.4z" fill="#808080"/><path d="m593.8 508.4 29.6-30.2v-1.3l-30.9 31.5z" fill="#808080"/><path d="m598.8 508.4 24.6-25.1v-1.3l-25.9 26.4z" fill="#808080"/><path d="m603.8 508.4 19.6-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m608.8 508.4 14.6-14.9v-1.2l-15.8 16.1z" fill="#808080"/><path d="m613.8 508.4 9.6-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m618.9 508.4 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m623.4 508.4v-.8l-.8.8z" fill="#808080"/><path d="m623.4 600.5v-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.6v.6 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 1.3c1-4.3 2-8.5 3.1-12.6v-2.1z" fill="#808080"/><path d="m634 544.4h-1.3-3.7-1.3-3.7-.6v.6 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3c3.2-13 6.3-25.1 9.1-36h-.5-3.8z" fill="#e8e7e8"/><path d="m623.4 585.1 4.5-4.6h-3.8l-.7.7z" fill="#e8e7e8"/><path d="m623.4 603.9c.2-.9.5-1.9.7-2.8l-.7.7z" fill="#e8e7e8"/><path d="m623.4 586.4v3.8l4.5-4.6c.4-1.7.9-3.4 1.3-5.1z" fill="#e8e7e8"/><path d="m623.4 595.3 2.8-2.9c.4-1.7.9-3.4 1.3-5.1l-4.1 4.2z" fill="#e8e7e8"/><path d="m623.4 600.5 1.1-1.1c.4-1.7.8-3.4 1.3-5.1l-2.4 2.4z" fill="#e8e7e8"/><path d="m624.1 580.5h-.7v.7z" fill="#808080"/><path d="m623.4 586.4 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m623.4 591.5 4.1-4.2c.1-.6.3-1.2.4-1.7l-4.5 4.6z" fill="#808080"/><path d="m623.4 596.6 2.4-2.4c.1-.6.3-1.2.4-1.7l-2.8 2.9z" fill="#808080"/><path d="m623.4 601.7.7-.7c.1-.6.3-1.1.4-1.7l-1.1 1.1z" fill="#808080"/><path d="m602.6 580.5 20.8-21.3v-3.9l-24.6 25.2z" fill="#e8e7e8"/><path d="m607.6 580.5 15.8-16.2v-3.8l-19.6 20z" fill="#e8e7e8"/><path d="m612.6 580.5 10.8-11.1v-3.8l-14.6 14.9z" fill="#e8e7e8"/><path d="m588.1 569.6 24.6-25.2h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m588.1 574.7 29.6-30.3h-3.7l-25.9 26.4z" fill="#e8e7e8"/><path d="m622.6 580.5.8-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m588.1 564.4 19.6-20h-3.8l-15.8 16.2z" fill="#e8e7e8"/><path d="m588.1 579.8 34.6-35.4h-3.7l-30.9 31.6z" fill="#e8e7e8"/><path d="m588.1 559.3 14.6-14.9h-3.8l-10.8 11.1z" fill="#e8e7e8"/><path d="m617.6 580.5 5.8-5.9v-3.9l-9.6 9.8z" fill="#e8e7e8"/><path d="m597.5 580.5 25.9-26.4v-3.9l-29.6 30.3z" fill="#e8e7e8"/><path d="m588.1 554.2 9.5-9.8h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m592.5 580.5 30.9-31.6v-3.8l-34.6 35.4z" fill="#e8e7e8"/><path d="m588.1 549 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m588.9 544.4h-.8v.8z" fill="#808080"/><path d="m588.1 550.3 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m588.1 555.5 10.8-11.1h-1.3l-9.5 9.8z" fill="#808080"/><path d="m588.1 560.6 15.8-16.2h-1.2l-14.6 14.9z" fill="#808080"/><path d="m588.1 565.7 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m588.1 570.8 25.9-26.4h-1.3l-24.6 25.2z" fill="#808080"/><path d="m588.1 576 30.9-31.6h-1.3l-29.6 30.3z" fill="#808080"/><path d="m588.1 579.8v.7h.7l34.6-35.4v-.7h-.7z" fill="#808080"/><path d="m593.8 580.5 29.6-30.3v-1.3l-30.9 31.6z" fill="#808080"/><path d="m598.8 580.5 24.6-25.2v-1.2l-25.9 26.4z" fill="#808080"/><path d="m603.8 580.5 19.6-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m608.8 580.5 14.6-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m613.8 580.5 9.6-9.8v-1.3l-10.8 11.1z" fill="#808080"/><path d="m618.9 580.5 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m623.4 580.5v-.8l-.8.8z" fill="#808080"/><path d="m607.6 652.5h-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.6v.6 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.8 1.3 3.8 1.3.4c2.4-11.9 4.9-24 7.6-36h-3.1-1.2z" fill="#808080"/><path d="m612 652.5c.3-1.4.6-2.8.9-4.2l-4.1 4.2z" fill="#e8e7e8"/><path d="m607.6 652.5 5.7-5.8c.4-1.7.8-3.3 1.1-5l-10.6 10.8z" fill="#e8e7e8"/><path d="m588.1 621.1 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m592.5 652.5 25.4-26c.4-1.7.8-3.4 1.2-5.1l-30.3 31h3.7z" fill="#e8e7e8"/><path d="m588.1 646.7 29.6-30.2h-3.7l-25.9 26.4z" fill="#e8e7e8"/><path d="m588.1 641.6 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m588.1 648v3.8l31.4-32.1c.3-1.1.5-2.2.8-3.3h-1.3z" fill="#e8e7e8"/><path d="m588.1 626.2 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m597.5 652.5 18.8-19.2c.4-1.7.8-3.4 1.2-5l-23.7 24.3h3.7z" fill="#e8e7e8"/><path d="m588.1 631.4 14.6-14.9h-3.8l-10.8 11z" fill="#e8e7e8"/><path d="m588.1 636.5 19.6-20h-3.8l-15.8 16.1z" fill="#e8e7e8"/><path d="m602.6 652.5 12.2-12.5c.4-1.7.8-3.4 1.2-5l-17.2 17.5z" fill="#e8e7e8"/><path d="m588.9 616.5h-.8v.8z" fill="#808080"/><path d="m588.1 622.4 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m588.1 627.5 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m588.1 632.6 15.8-16.1h-1.2l-14.6 14.9z" fill="#808080"/><path d="m588.1 637.8 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m588.1 642.9 25.9-26.4h-1.3l-24.6 25.1z" fill="#808080"/><path d="m588.1 648 30.9-31.5h-1.3l-29.6 30.2z" fill="#808080"/><path d="m588.1 652.5h.6l30.3-31c.1-.6.3-1.1.4-1.7l-31.4 32.1v.6z" fill="#808080"/><path d="m593.8 652.5 23.7-24.3c.1-.6.3-1.1.4-1.7l-25.4 26z" fill="#808080"/><path d="m598.8 652.5 17.2-17.5c.1-.6.3-1.1.4-1.7l-18.8 19.2z" fill="#808080"/><path d="m603.8 652.5 10.6-10.8c.1-.6.3-1.1.4-1.7l-12.2 12.5z" fill="#808080"/><path d="m608.8 652.5 4.1-4.2c.1-.6.2-1.1.4-1.7l-5.7 5.8h1.2z" fill="#808080"/><path d="m593.8 724.6h-1.3-3.8-.6v.6 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h4.7c.3-3 .7-6 1.1-9.1 1.1-8.6 2.4-17.7 3.9-27h-.3-3.7z" fill="#808080"/><path d="m588.1 693.2 4.5-4.6h-3.7l-.8.7z" fill="#e8e7e8"/><path d="m588.1 713.7 14.2-14.5c.3-1.6.6-3.2.9-4.8l-15.1 15.4z" fill="#e8e7e8"/><path d="m588.1 718.8 13-13.3c.3-1.6.6-3.2.9-4.7l-13.9 14.2z" fill="#e8e7e8"/><path d="m588.1 704.7v3.8l15.4-15.7c.3-1.4.6-2.8.8-4.2h-.4z" fill="#e8e7e8"/><path d="m588.1 698.3 9.5-9.7h-3.7l-5.8 5.8z" fill="#e8e7e8"/><path d="m588.1 723.9 11.8-12.1c.3-1.6.6-3.1.8-4.7l-12.7 13v3.8z" fill="#e8e7e8"/><path d="m588.1 703.4 14.6-14.8h-3.8l-10.8 11z" fill="#e8e7e8"/><path d="m592.5 724.6 6.4-6.5c.3-1.6.5-3.1.8-4.7l-10.9 11.2z" fill="#e8e7e8"/><path d="m597.5 724.6.3-.3c.3-1.5.5-3.1.8-4.6l-4.9 5h3.8z" fill="#e8e7e8"/><path d="m588.9 688.6h-.8v.7z" fill="#808080"/><path d="m588.1 694.4 5.8-5.8h-1.3l-4.5 4.6z" fill="#808080"/><path d="m588.1 699.6 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m588.1 704.7 15.8-16.1h-1.2l-14.6 14.8z" fill="#808080"/><path d="m588.1 709.8 15.1-15.4c.1-.5.2-1.1.3-1.6l-15.4 15.7z" fill="#808080"/><path d="m588.1 715 13.9-14.2c.1-.5.2-1.1.3-1.6l-14.2 14.5z" fill="#808080"/><path d="m588.1 720.1 12.7-13c.1-.5.2-1.1.3-1.6l-13 13.3z" fill="#808080"/><path d="m588.1 724.6h.6l10.9-11.2c.1-.5.2-1.1.3-1.6l-11.8 12.1z" fill="#808080"/><path d="m593.8 724.6 4.9-5c.1-.5.2-1 .3-1.6l-6.4 6.5h1.2z" fill="#808080"/><path d="m597.8 724.6c0-.1 0-.2.1-.3l-.3.3z" fill="#808080"/><path d="m588.1 796.6v.6 3.8 1.3 3.8 1.3 3.8 1.3 2.7c.4-6.1.8-12.4 1.3-18.8h-.7-.6z" fill="#808080"/><path d="m588.1 770.3 4.1-4.2c.2-1.4.3-2.9.5-4.3l-4.6 4.7z" fill="#e8e7e8"/><path d="m588.1 780.6 2.9-3c.1-1.4.3-2.8.4-4.3l-3.4 3.4v3.9z" fill="#e8e7e8"/><path d="m588.1 790.9 1.9-2c.1-1.4.2-2.8.4-4.2l-2.3 2.3z" fill="#e8e7e8"/><path d="m588.1 785.7 2.4-2.5c.1-1.4.3-2.8.4-4.2l-2.8 2.9z" fill="#e8e7e8"/><path d="m588.1 796 1.5-1.5c.1-1.4.2-2.8.3-4.2l-1.8 1.8z" fill="#e8e7e8"/><path d="m589.4 796.6c0-.2 0-.5.1-.7l-.7.7z" fill="#e8e7e8"/><path d="m588.1 775.5 3.5-3.6c.1-1.4.3-2.9.4-4.3l-4 4v3.9z" fill="#e8e7e8"/><path d="m588.1 765.2 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m588.9 760.6h-.8v.8z" fill="#808080"/><path d="m588.1 765.2v1.3l4.6-4.7c0-.4.1-.8.1-1.2h-.2z" fill="#808080"/><path d="m588.1 771.6 4-4c.1-.5.1-1 .2-1.5l-4.1 4.2v1.3z" fill="#808080"/><path d="m588.1 776.8 3.4-3.4c0-.5.1-1 .1-1.4l-3.5 3.6z" fill="#808080"/><path d="m588.1 781.9 2.8-2.9c0-.5.1-1 .1-1.4l-2.9 3z" fill="#808080"/><path d="m588.1 787 2.3-2.3c0-.5.1-.9.1-1.4l-2.4 2.5z" fill="#808080"/><path d="m588.1 792.2 1.8-1.8c0-.5.1-.9.1-1.4l-1.9 2z" fill="#808080"/><path d="m588.1 796.6h.6l.7-.7c0-.5.1-.9.1-1.4l-1.5 1.5v.6z" fill="#808080"/><path d="m517.7 440.8v1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.6v-.6-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.5c-.3.1-.6.2-.8.3v.3 3.8z" fill="#808080"/><path d="m552.9 436.3h.7 3.8 1.3 3.8 1.3 3.8 1.3 2.9c-5.7-.5-12.1-1.2-18.7-1.9v1.1.8z" fill="#e8e7e8"/><path d="m577.4 472.4 10.7-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m552.9 451.2 14.5-14.9h-3.7l-10.8 11.1z" fill="#e8e7e8"/><path d="m552.9 446.1 9.5-9.8h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m562.3 472.4 25.8-26.4v-3.9l-29.5 30.3z" fill="#e8e7e8"/><path d="m587.4 472.4.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m582.4 472.4 5.7-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m552.9 440.9 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m572.3 472.4 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m567.3 472.4 20.8-21.3v-3.8l-24.5 25.1z" fill="#e8e7e8"/><path d="m552.9 471.7 33.3-34c-1.1-.1-2.2-.2-3.4-.3l-29.8 30.5v3.8z" fill="#e8e7e8"/><path d="m552.9 466.6 28.7-29.3c-1.1-.1-2.2-.2-3.4-.3l-25.2 25.8v3.8z" fill="#e8e7e8"/><path d="m552.9 452.5v3.8l19.5-19.9c-.3 0-.5-.1-.8-.1h-2.9z" fill="#e8e7e8"/><path d="m557.3 472.4 30.8-31.5v-2.9c-.3 0-.5-.1-.8-.1l-33.8 34.5z" fill="#e8e7e8"/><path d="m552.9 461.5 24.1-24.6c-1.1-.1-2.3-.2-3.4-.3l-20.6 21.1v3.8z" fill="#e8e7e8"/><path d="m553.7 436.3h-.8v.8z" fill="#808080"/><path d="m552.9 442.2 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m552.9 447.4 10.8-11.1h-1.3l-9.5 9.8z" fill="#808080"/><path d="m552.9 452.5 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m552.9 457.6 20.6-21.1c-.4 0-.8-.1-1.2-.1l-19.5 19.9v1.3z" fill="#808080"/><path d="m552.9 462.8 25.2-25.8c-.4 0-.8-.1-1.2-.1l-24.1 24.6v1.3z" fill="#808080"/><path d="m552.9 467.9 29.8-30.5c-.4 0-.8-.1-1.2-.1l-28.7 29.3v1.3z" fill="#808080"/><path d="m552.9 472.4h.6l33.8-34.5c-.4 0-.8-.1-1.2-.1l-33.3 34v.6z" fill="#808080"/><path d="m588.1 442.1v-1.3l-30.8 31.6h1.3z" fill="#808080"/><path d="m563.6 472.4 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m568.6 472.4 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m573.6 472.4 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m578.6 472.4 9.5-9.8v-1.2l-10.7 11z" fill="#808080"/><path d="m583.6 472.4 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m588.1 472.4v-.8l-.7.8z" fill="#808080"/><path d="m552.2 436.3.7-.8v-1.1c-.8-.1-1.6-.2-2.4-.3l-2.1 2.1h3.8z" fill="#e8e7e8"/><path d="m542.1 436.3 2.7-2.8c-1.1-.1-2.2-.3-3.4-.4l-3.1 3.2z" fill="#e8e7e8"/><path d="m532.1 436.3 3.8-3.9c-1.1-.1-2.2-.3-3.3-.4l-4.2 4.3z" fill="#e8e7e8"/><path d="m547.2 436.3 2.2-2.2c-1.1-.1-2.3-.3-3.4-.4l-2.6 2.6z" fill="#e8e7e8"/><path d="m537.1 436.3 3.2-3.3c-1.1-.1-2.2-.3-3.3-.4l-3.6 3.7z" fill="#e8e7e8"/><path d="m524.2 434.2c-1.8.7-3.7 1.5-5.7 2.2h3.5z" fill="#e8e7e8"/><path d="m523.3 436.3h3.8l4.4-4.5c-.5-.1-1-.1-1.5-.2-1.2.5-2.4 1.1-3.6 1.6z" fill="#e8e7e8"/><path d="m523.3 436.3 3-3.1c-.7.3-1.4.6-2.1.9l-2.1 2.2z" fill="#808080"/><path d="m528.4 436.3 4.2-4.3c-.4-.1-.7-.1-1.1-.2l-4.4 4.5z" fill="#808080"/><path d="m533.4 436.3 3.6-3.7c-.4 0-.7-.1-1.1-.1l-3.8 3.9h1.3z" fill="#808080"/><path d="m538.4 436.3 3.1-3.2c-.4 0-.8-.1-1.1-.1l-3.2 3.3z" fill="#808080"/><path d="m543.4 436.3 2.6-2.6c-.4 0-.8-.1-1.1-.1l-2.7 2.8h1.2z" fill="#808080"/><path d="m548.4 436.3 2.1-2.1c-.4 0-.8-.1-1.1-.1l-2.2 2.2z" fill="#808080"/><path d="m552.9 435.6-.7.7h.7z" fill="#808080"/><path d="m517.7 512.9v1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.7 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8.6v-.6-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.7z" fill="#808080"/><path d="m552.9 476.9v1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8.8h.8 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6v.6z" fill="#e8e7e8"/><path d="m552.9 533.5 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m552.9 538.7 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m552.9 528.4 19.6-20h-3.8l-15.8 16.2z" fill="#e8e7e8"/><path d="m552.9 543.8 34.6-35.4h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m552.9 518.1 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m562.3 544.4 25.8-26.4v-3.8l-29.5 30.2z" fill="#e8e7e8"/><path d="m567.3 544.4 20.8-21.2v-3.9l-24.5 25.1z" fill="#e8e7e8"/><path d="m552.9 523.3 14.5-14.9h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m587.4 544.4.7-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m582.4 544.4 5.7-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m572.3 544.4 15.8-16.1v-3.9l-19.5 20z" fill="#e8e7e8"/><path d="m557.3 544.4 30.8-31.5v-3.8l-34.6 35.3z" fill="#e8e7e8"/><path d="m552.9 513 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m577.4 544.4 10.7-11v-3.8l-14.5 14.8z" fill="#e8e7e8"/><path d="m553.7 508.4h-.8v.8z" fill="#808080"/><path d="m552.9 514.3 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m552.9 519.4 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m552.9 524.6 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m552.9 529.7 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m552.9 534.8 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m552.9 539.9 30.8-31.5h-1.2l-29.6 30.3z" fill="#808080"/><path d="m552.9 544.4h.6l34.6-35.3v-.7h-.6l-34.6 35.4z" fill="#808080"/><path d="m558.6 544.4 29.5-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m563.6 544.4 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m568.6 544.4 19.5-20v-1.2l-20.8 21.2z" fill="#808080"/><path d="m573.6 544.4 14.5-14.8v-1.3l-15.8 16.1z" fill="#808080"/><path d="m578.6 544.4 9.5-9.7v-1.3l-10.7 11z" fill="#808080"/><path d="m583.6 544.4 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m588.1 544.4v-.7l-.7.7z" fill="#808080"/><path d="m537.1 508.4 15.8-16.1v-3.9l-19.5 20z" fill="#e8e7e8"/><path d="m552.2 508.4.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m542.1 508.4 10.8-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m527.1 508.4 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m547.2 508.4 5.7-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m517.7 477 4.5-4.6h-3.8l-.7.7z" fill="#e8e7e8"/><path d="m517.7 482.1 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m517.7 487.2 14.5-14.8h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m552.9 476.9v-3.9l-34.6 35.4h3.8z" fill="#e8e7e8"/><path d="m517.7 492.4 19.5-20h-3.7l-15.8 16.1z" fill="#e8e7e8"/><path d="m517.7 502.6 29.6-30.2h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m517.7 507.8 34.6-35.4h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m532.1 508.4 20.8-21.3v-3.8l-24.5 25.1z" fill="#e8e7e8"/><path d="m517.7 497.5 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m518.4 472.4h-.7v.7z" fill="#808080"/><path d="m517.7 478.3 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m517.7 483.4 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m517.7 488.5 15.8-16.1h-1.3l-14.5 14.8z" fill="#808080"/><path d="m517.7 493.7 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m517.7 498.8 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m517.7 503.9 30.8-31.5h-1.2l-29.6 30.2z" fill="#808080"/><path d="m517.7 507.8v.6h.6l34.6-35.4v-.6h-.6z" fill="#808080"/><path d="m523.3 508.4 29.6-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m528.4 508.4 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m533.4 508.4 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m538.4 508.4 14.5-14.9v-1.2l-15.8 16.1z" fill="#808080"/><path d="m543.4 508.4 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m548.4 508.4 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m552.9 508.4v-.8l-.7.8z" fill="#808080"/><path d="m548.4 580.5h-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.6 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8.6v-.6-3.9-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7z" fill="#808080"/><path d="m588.1 576v-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6v.7 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.8 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.7z" fill="#e8e7e8"/><path d="m577.4 616.5 10.7-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m552.9 610.7 29.6-30.2h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m587.4 616.5.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m562.3 616.5 25.8-26.4v-3.9l-29.5 30.3z" fill="#e8e7e8"/><path d="m552.9 605.6 24.6-25.1h-3.8l-20.8 21.2z" fill="#e8e7e8"/><path d="m582.4 616.5 5.7-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m567.3 616.5 20.8-21.3v-3.8l-24.5 25.1z" fill="#e8e7e8"/><path d="m552.9 585.1 4.5-4.6h-3.7l-.8.7z" fill="#e8e7e8"/><path d="m572.3 616.5 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m552.9 595.3 14.5-14.8h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m552.9 600.5 19.6-20h-3.8l-15.8 16.1z" fill="#e8e7e8"/><path d="m557.3 616.5 30.8-31.5v-3.9l-34.6 35.4z" fill="#e8e7e8"/><path d="m552.9 590.2 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m552.9 615.9 34.6-35.4h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m553.7 580.5h-.8v.7z" fill="#808080"/><path d="m552.9 586.4 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m552.9 591.5 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m552.9 596.6 15.8-16.1h-1.3l-14.5 14.8z" fill="#808080"/><path d="m552.9 601.7 20.8-21.2h-1.2l-19.6 20z" fill="#808080"/><path d="m552.9 606.9 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m552.9 612 30.8-31.5h-1.2l-29.6 30.2z" fill="#808080"/><path d="m552.9 615.9v.6h.6l34.6-35.4v-.6h-.6z" fill="#808080"/><path d="m558.6 616.5 29.5-30.3v-1.2l-30.8 31.5z" fill="#808080"/><path d="m563.6 616.5 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m568.6 616.5 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m573.6 616.5 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m578.6 616.5 9.5-9.7v-1.3l-10.7 11z" fill="#808080"/><path d="m583.6 616.5 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m588.1 616.5v-.8l-.7.8z" fill="#808080"/><path d="m517.7 554.2 9.5-9.8h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m517.7 559.3 14.5-14.9h-3.7l-10.8 11.1z" fill="#e8e7e8"/><path d="m547.2 580.5 5.7-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m517.7 564.4 19.5-20h-3.7l-15.8 16.2z" fill="#e8e7e8"/><path d="m527.1 580.5 25.8-26.4v-3.9l-29.6 30.3z" fill="#e8e7e8"/><path d="m537.1 580.5 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m532.1 580.5 20.8-21.3v-3.9l-24.5 25.2z" fill="#e8e7e8"/><path d="m542.1 580.5 10.8-11.1v-3.8l-14.5 14.9z" fill="#e8e7e8"/><path d="m517.7 579.8 34.6-35.4h-3.8l-30.8 31.6z" fill="#e8e7e8"/><path d="m517.7 569.6 24.6-25.2h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m517.7 574.7 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m552.2 580.5.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m517.7 549 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m522.1 580.5 30.8-31.6v-3.8l-34.6 35.4z" fill="#e8e7e8"/><path d="m518.4 544.4h-.7v.8z" fill="#808080"/><path d="m517.7 550.3 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m517.7 555.5 10.8-11.1h-1.3l-9.5 9.8z" fill="#808080"/><path d="m517.7 560.6 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m517.7 565.7 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m517.7 570.8 25.8-26.4h-1.2l-24.6 25.2z" fill="#808080"/><path d="m517.7 576 30.8-31.6h-1.2l-29.6 30.3z" fill="#808080"/><path d="m517.7 579.8v.7h.6l34.6-35.4v-.7h-.6z" fill="#808080"/><path d="m523.3 580.5 29.6-30.3v-1.3l-30.8 31.6z" fill="#808080"/><path d="m528.4 580.5 24.5-25.2v-1.2l-25.8 26.4z" fill="#808080"/><path d="m533.4 580.5 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m538.4 580.5 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m543.4 580.5 9.5-9.8v-1.3l-10.8 11.1z" fill="#808080"/><path d="m548.4 580.5 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m552.9 580.5v-.8l-.7.8z" fill="#808080"/><path d="m548.4 652.5h-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.7 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.7 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8.6v-.7-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-.8h-.7z" fill="#808080"/><path d="m583.6 616.5h-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.8 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-.8h-.7z" fill="#e8e7e8"/><path d="m552.9 672.5 19.6-20h-3.8l-15.8 16.2z" fill="#e8e7e8"/><path d="m552.9 677.6 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m552.9 687.9 34.6-35.4h-3.8l-30.8 31.6z" fill="#e8e7e8"/><path d="m557.3 688.6 30.8-31.6v-3.8l-34.6 35.4z" fill="#e8e7e8"/><path d="m587.4 688.6.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m552.9 682.8 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m552.9 657.1 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m552.9 667.4 14.5-14.9h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m572.3 688.6 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m552.9 662.3 9.5-9.8h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m567.3 688.6 20.8-21.3v-3.9l-24.5 25.2z" fill="#e8e7e8"/><path d="m562.3 688.6 25.8-26.5v-3.8l-29.5 30.3z" fill="#e8e7e8"/><path d="m577.4 688.6 10.7-11.1v-3.8l-14.5 14.9z" fill="#e8e7e8"/><path d="m582.4 688.6 5.7-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m553.7 652.5h-.8v.8z" fill="#808080"/><path d="m552.9 658.4 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m552.9 663.5 10.8-11h-1.3l-9.5 9.8z" fill="#808080"/><path d="m552.9 668.7 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m552.9 673.8 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m552.9 678.9 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m552.9 684.1 30.8-31.6h-1.2l-29.6 30.3z" fill="#808080"/><path d="m552.9 687.9v.7h.6l34.6-35.4v-.7h-.6z" fill="#808080"/><path d="m558.6 688.6 29.5-30.3v-1.3l-30.8 31.6z" fill="#808080"/><path d="m563.6 688.6 24.5-25.2v-1.3l-25.8 26.5z" fill="#808080"/><path d="m568.6 688.6 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m573.6 688.6 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m578.6 688.6 9.5-9.8v-1.3l-10.7 11.1z" fill="#808080"/><path d="m583.6 688.6 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m588.1 688.6v-.8l-.7.8z" fill="#808080"/><path d="m517.7 636.5 19.5-20h-3.7l-15.8 16.1z" fill="#e8e7e8"/><path d="m517.7 651.9 34.6-35.4h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m552.2 652.5.7-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m517.7 641.6 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m517.7 621.1 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m517.7 626.2 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m517.7 631.4 14.5-14.9h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m517.7 646.7 29.6-30.2h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m527.1 652.5 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m522.1 652.5 30.8-31.5v-3.9l-34.6 35.4z" fill="#e8e7e8"/><path d="m547.2 652.5 5.7-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m542.1 652.5 10.8-11v-3.8l-14.5 14.8z" fill="#e8e7e8"/><path d="m532.1 652.5 20.8-21.3v-3.8l-24.5 25.1z" fill="#e8e7e8"/><path d="m537.1 652.5 15.8-16.1v-3.9l-19.5 20z" fill="#e8e7e8"/><path d="m518.4 616.5h-.7v.8z" fill="#808080"/><path d="m517.7 622.4 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m517.7 627.5 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m517.7 632.6 15.8-16.1h-1.3l-14.5 14.9z" fill="#808080"/><path d="m517.7 637.8 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m517.7 642.9 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m517.7 648 30.8-31.5h-1.2l-29.6 30.2z" fill="#808080"/><path d="m517.7 651.9v.6h.6l34.6-35.4v-.6h-.6z" fill="#808080"/><path d="m523.3 652.5 29.6-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m528.4 652.5 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m533.4 652.5 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m538.4 652.5 14.5-14.8v-1.3l-15.8 16.1z" fill="#808080"/><path d="m543.4 652.5 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m548.4 652.5 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m552.9 652.5v-.7l-.7.7z" fill="#808080"/><path d="m552.9 756.1v-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h35.2v-.6z" fill="#808080"/><path d="m583.6 688.6h-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6v.6 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.8 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.7-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-.7h-.7z" fill="#e8e7e8"/><path d="m567.3 760.6 20.8-21.3v-3.8l-24.5 25.1z" fill="#e8e7e8"/><path d="m552.9 739.4 14.5-14.8h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m552.9 749.7 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m552.9 744.6 19.6-20h-3.8l-15.8 16.1z" fill="#e8e7e8"/><path d="m557.3 760.6 30.8-31.5v-3.9l-34.6 35.4z" fill="#e8e7e8"/><path d="m562.3 760.6 25.8-26.4v-3.8l-29.5 30.2z" fill="#e8e7e8"/><path d="m552.9 754.8 29.6-30.2h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m572.3 760.6 15.8-16.1v-3.9l-19.5 20z" fill="#e8e7e8"/><path d="m552.9 760 34.6-35.4h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m587.4 760.6.7-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m552.9 729.2 4.5-4.6h-3.7l-.8.7z" fill="#e8e7e8"/><path d="m582.4 760.6 5.7-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m552.9 734.3 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m577.4 760.6 10.7-11v-3.8l-14.5 14.8z" fill="#e8e7e8"/><path d="m553.7 724.6h-.8v.7z" fill="#808080"/><path d="m552.9 730.5 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m552.9 735.6 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m552.9 740.7 15.8-16.1h-1.3l-14.5 14.8z" fill="#808080"/><path d="m552.9 745.9 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m552.9 751 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m552.9 756.1 30.8-31.5h-1.2l-29.6 30.2z" fill="#808080"/><path d="m552.9 760v.6h.6l34.6-35.4v-.6h-.6z" fill="#808080"/><path d="m558.6 760.6 29.5-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m563.6 760.6 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m568.6 760.6 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m573.6 760.6 14.5-14.8v-1.3l-15.8 16.1z" fill="#808080"/><path d="m578.6 760.6 9.5-9.7v-1.3l-10.7 11z" fill="#808080"/><path d="m583.6 760.6 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m588.1 760.6v-.7l-.7.7z" fill="#808080"/><path d="m517.7 693.2 4.5-4.6h-3.8l-.7.7z" fill="#e8e7e8"/><path d="m542.1 724.6 10.8-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m537.1 724.6 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m517.7 703.4 14.5-14.8h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m517.7 708.5 19.5-19.9h-3.7l-15.8 16.1z" fill="#e8e7e8"/><path d="m517.7 713.7 24.6-25.1h-3.8l-20.8 21.2z" fill="#e8e7e8"/><path d="m517.7 718.8 29.6-30.2h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m547.2 724.6 5.7-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m552.2 724.6.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m517.7 698.3 9.5-9.7h-3.7l-5.8 5.8z" fill="#e8e7e8"/><path d="m522.1 724.6 30.8-31.6v-3.8l-34.6 35.4z" fill="#e8e7e8"/><path d="m517.7 723.9 34.6-35.3h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m532.1 724.6 20.8-21.3v-3.8l-24.5 25.1z" fill="#e8e7e8"/><path d="m527.1 724.6 25.8-26.4v-3.9l-29.6 30.3z" fill="#e8e7e8"/><path d="m518.4 688.6h-.7v.7z" fill="#808080"/><path d="m517.7 694.4 5.8-5.8h-1.3l-4.5 4.6z" fill="#808080"/><path d="m517.7 699.6 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m517.7 704.7 15.8-16.1h-1.3l-14.5 14.8z" fill="#808080"/><path d="m517.7 709.8 20.8-21.2h-1.3l-19.5 19.9z" fill="#808080"/><path d="m517.7 715 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m517.7 720.1 30.8-31.5h-1.2l-29.6 30.2z" fill="#808080"/><path d="m517.7 723.9v.7h.6l34.6-35.4v-.6h-.6z" fill="#808080"/><path d="m523.3 724.6 29.6-30.3v-1.3l-30.8 31.6z" fill="#808080"/><path d="m528.4 724.6 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m533.4 724.6 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m538.4 724.6 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m543.4 724.6 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m548.4 724.6 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m552.9 724.6v-.8l-.7.8z" fill="#808080"/><path d="m552.9 828.2v-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.7 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8.8h.7 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8.6v-.7z" fill="#808080"/><path d="m552.9 765.1v1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9.7h.8 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.6-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-35.2v.7z" fill="#e8e7e8"/><path d="m552.9 801.2 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m552.9 816.6 19.6-20h-3.8l-15.8 16.2z" fill="#e8e7e8"/><path d="m552.9 821.8 24.6-25.2h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m552.9 832 34.6-35.4h-3.8l-30.8 31.6z" fill="#e8e7e8"/><path d="m552.9 826.9 29.6-30.3h-3.8l-25.8 26.5z" fill="#e8e7e8"/><path d="m557.3 832.7 30.8-31.6v-3.8l-34.6 35.4z" fill="#e8e7e8"/><path d="m568.6 832.7h3.8l15.7-16.1c0-.4 0-.8.1-1.2v-2.7z" fill="#e8e7e8"/><path d="m552.9 811.5 14.5-14.9h-3.7l-10.8 11.1z" fill="#e8e7e8"/><path d="m582.4 832.7 5.1-5.2c.1-1.3.1-2.7.2-4.1l-9.1 9.3z" fill="#e8e7e8"/><path d="m587.2 832.7c.1-1.3.1-2.6.2-3.9l-3.8 3.9z" fill="#e8e7e8"/><path d="m552.9 806.4 9.5-9.8h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m577.4 832.7 10.4-10.6c.1-1.3.2-2.7.2-4.1l-14.4 14.7z" fill="#e8e7e8"/><path d="m562.3 832.7 25.8-26.4v-3.9l-29.5 30.3z" fill="#e8e7e8"/><path d="m567.3 832.7 20.8-21.3v-3.8l-24.5 25.1z" fill="#e8e7e8"/><path d="m553.7 796.6h-.8v.8z" fill="#808080"/><path d="m552.9 802.5 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m552.9 807.7 10.8-11.1h-1.3l-9.5 9.8z" fill="#808080"/><path d="m552.9 812.8 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m552.9 817.9 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m552.9 823.1 25.8-26.5h-1.2l-24.6 25.2z" fill="#808080"/><path d="m552.9 828.2 30.8-31.6h-1.2l-29.6 30.3z" fill="#808080"/><path d="m552.9 832v.7h.6l34.6-35.4v-.7h-.6z" fill="#808080"/><path d="m558.6 832.7 29.5-30.3v-1.3l-30.8 31.6z" fill="#808080"/><path d="m563.6 832.7 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m568.6 832.7 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m573.6 832.7 14.4-14.7c0-.5.1-.9.1-1.4l-15.7 16.1z" fill="#808080"/><path d="m578.6 832.7 9.1-9.3c0-.5 0-.9.1-1.4l-10.4 10.6h1.2z" fill="#808080"/><path d="m583.6 832.7 3.8-3.9c0-.5 0-.9.1-1.4l-5.1 5.2h1.2z" fill="#808080"/><path d="m542.1 796.6 10.8-11v-3.8l-14.5 14.8z" fill="#e8e7e8"/><path d="m517.7 780.6 19.5-20h-3.7l-15.8 16.2z" fill="#e8e7e8"/><path d="m547.2 796.6 5.7-5.8v-3.9l-9.5 9.7z" fill="#e8e7e8"/><path d="m552.2 796.6.7-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m517.7 785.7 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m517.7 796 34.6-35.4h-3.8l-30.8 31.6z" fill="#e8e7e8"/><path d="m517.7 790.9 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m537.1 796.6 15.8-16.1v-3.8l-19.5 19.9z" fill="#e8e7e8"/><path d="m517.7 775.5 14.5-14.9h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m517.7 765.2 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m552.9 765.1v-3.8l-34.6 35.3h3.8z" fill="#e8e7e8"/><path d="m527.1 796.6 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m532.1 796.6 20.8-21.2v-3.9l-24.5 25.1z" fill="#e8e7e8"/><path d="m517.7 770.3 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m518.4 760.6h-.7v.8z" fill="#808080"/><path d="m517.7 766.5 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m517.7 771.6 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m517.7 776.8 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m517.7 781.9 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m517.7 787 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m517.7 792.2 30.8-31.6h-1.2l-29.6 30.3z" fill="#808080"/><path d="m517.7 796.6h.6l34.6-35.3v-.7h-.6l-34.6 35.4z" fill="#808080"/><path d="m523.3 796.6 29.6-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m528.4 796.6 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m533.4 796.6 19.5-19.9v-1.3l-20.8 21.2z" fill="#808080"/><path d="m538.4 796.6 14.5-14.8v-1.3l-15.8 16.1z" fill="#808080"/><path d="m543.4 796.6 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m548.4 796.6 4.5-4.6v-1.2l-5.7 5.8z" fill="#808080"/><path d="m552.9 796.6v-.7l-.7.7z" fill="#808080"/><path d="m548.4 868.7h-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.7 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.7 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8.6v-.6-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-.7z" fill="#808080"/><path d="m582.4 832.7h-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.6v.6 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 2.3c.2-11.3.6-23.3 1.2-36h-3.6-1.3z" fill="#e8e7e8"/><path d="m557.3 904.7 28.6-29.3c0-1.3 0-2.6.1-3.9l-32.5 33.2z" fill="#e8e7e8"/><path d="m552.9 900.2v3.8l33.1-33.9c0-.5 0-1 0-1.5h-2.3z" fill="#e8e7e8"/><path d="m552.9 888.7 19.6-20h-3.8l-15.8 16.2z" fill="#e8e7e8"/><path d="m562.3 904.7 23.5-24.1c0-1.3 0-2.6.1-3.9l-27.4 28z" fill="#e8e7e8"/><path d="m552.9 883.6 14.5-14.9h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m552.9 873.3 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m552.9 878.4 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m585.5 904.7c0-.7 0-1.3 0-2l-1.9 2z" fill="#e8e7e8"/><path d="m552.9 893.8 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m577.4 904.7 8.3-8.5c0-1.3 0-2.6 0-3.9l-12.1 12.4z" fill="#e8e7e8"/><path d="m582.4 904.7 3.2-3.3c0-1.3 0-2.6 0-3.9l-7 7.2z" fill="#e8e7e8"/><path d="m552.9 899 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m567.3 904.7 18.4-18.9c0-1.3 0-2.6.1-3.9l-22.3 22.8z" fill="#e8e7e8"/><path d="m572.3 904.7 13.4-13.7c0-1.3 0-2.6.1-3.9l-17.2 17.6z" fill="#e8e7e8"/><path d="m553.7 868.7h-.8v.8z" fill="#808080"/><path d="m552.9 874.6 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m552.9 879.7 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m552.9 884.9 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m552.9 890 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m552.9 895.1 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m552.9 900.2 30.8-31.5h-1.2l-29.6 30.3z" fill="#808080"/><path d="m552.9 904.7h.6l32.5-33.2c0-.4 0-.9 0-1.3l-33.1 33.9z" fill="#808080"/><path d="m558.6 904.7 27.4-28c0-.4 0-.9 0-1.3l-28.6 29.3z" fill="#808080"/><path d="m563.6 904.7 22.3-22.8c0-.4 0-.9 0-1.3l-23.5 24.1z" fill="#808080"/><path d="m568.6 904.7 17.2-17.6c0-.4 0-.9 0-1.3l-18.4 18.9z" fill="#808080"/><path d="m573.6 904.7 12.1-12.4c0-.4 0-.9 0-1.3l-13.4 13.7z" fill="#808080"/><path d="m578.6 904.7 7-7.2c0-.4 0-.9 0-1.3l-8.3 8.5z" fill="#808080"/><path d="m583.6 904.7 1.9-2c0-.4 0-.9 0-1.3l-3.2 3.3z" fill="#808080"/><path d="m517.7 862.9 29.6-30.2h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m527.1 868.7 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m542.1 868.7 10.8-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m547.2 868.7 5.7-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m532.1 868.7 20.8-21.3v-3.8l-24.5 25.1z" fill="#e8e7e8"/><path d="m517.7 857.8 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m517.7 868.1 34.6-35.4h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m552.2 868.7.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m517.7 842.4 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m517.7 837.3 4.5-4.6h-3.8l-.7.7z" fill="#e8e7e8"/><path d="m517.7 847.5 14.5-14.8h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m537.1 868.7 15.8-16.1v-3.9l-19.5 20z" fill="#e8e7e8"/><path d="m517.7 852.7 19.5-20h-3.7l-15.8 16.1z" fill="#e8e7e8"/><path d="m522.1 868.7 30.8-31.5v-3.9l-34.6 35.4z" fill="#e8e7e8"/><path d="m518.4 832.7h-.7v.7z" fill="#808080"/><path d="m517.7 838.6 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m517.7 843.7 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m517.7 848.8 15.8-16.1h-1.3l-14.5 14.8z" fill="#808080"/><path d="m517.7 854 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m517.7 859.1 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m517.7 864.2 30.8-31.5h-1.2l-29.6 30.2z" fill="#808080"/><path d="m517.7 868.1v.6h.6l34.6-35.4v-.6h-.6z" fill="#808080"/><path d="m523.3 868.7 29.6-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m528.4 868.7 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m533.4 868.7 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m538.4 868.7 14.5-14.9v-1.2l-15.8 16.1z" fill="#808080"/><path d="m543.4 868.7 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m548.4 868.7 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m552.9 868.7v-.8l-.7.8z" fill="#808080"/><path d="m548.4 940.8h-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.6 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8.6v-.7-3.8-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7z" fill="#808080"/><path d="m582.4 904.7h-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.6v.6 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3.8c.6-10.2.8-22.2 1-36h-1.9-1.3z" fill="#e8e7e8"/><path d="m552.9 972.3v3.8l31.4-32.1c.1-1.1.2-2.2.2-3.3h-.8z" fill="#e8e7e8"/><path d="m562.3 976.8 20.8-21.3c.2-1.4.4-2.9.6-4.4l-25.1 25.7z" fill="#e8e7e8"/><path d="m572.3 976.8 7.5-7.7c.7-1.7 1.2-3.6 1.8-5.6l-13 13.3z" fill="#e8e7e8"/><path d="m557.3 976.8 26.5-27.1c.1-1.4.3-2.8.4-4.2l-30.7 31.4h3.8z" fill="#e8e7e8"/><path d="m567.3 976.8 14.7-15c.3-1.5.6-3.1.9-4.8l-19.3 19.7h3.7z" fill="#e8e7e8"/><path d="m574.8 976.8.9-.9c1.1-1.2 2.2-2.7 3-4.4l-5.2 5.3z" fill="#e8e7e8"/><path d="m552.9 971 29.6-30.2h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m552.9 945.4 4.5-4.6h-3.7l-.8.7z" fill="#e8e7e8"/><path d="m552.9 955.6 14.5-14.8h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m552.9 950.5 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m552.9 965.9 24.6-25.1h-3.8l-20.8 21.2z" fill="#e8e7e8"/><path d="m552.9 960.8 19.6-20h-3.8l-15.8 16.1z" fill="#e8e7e8"/><path d="m553.7 940.8h-.8v.7z" fill="#808080"/><path d="m552.9 946.7 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m552.9 951.8 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m552.9 956.9 15.8-16.1h-1.3l-14.5 14.8z" fill="#808080"/><path d="m552.9 962 20.8-21.2h-1.2l-19.6 20z" fill="#808080"/><path d="m552.9 967.2 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m552.9 972.3 30.8-31.5h-1.2l-29.6 30.2z" fill="#808080"/><path d="m552.9 976.8h.6l30.7-31.4c0-.5.1-.9.1-1.4l-31.4 32.1z" fill="#808080"/><path d="m558.6 976.8 25.1-25.7c.1-.5.1-1 .2-1.4l-26.5 27.1z" fill="#808080"/><path d="m563.6 976.8 19.3-19.7c.1-.5.2-1 .2-1.5l-20.8 21.3h1.3z" fill="#808080"/><path d="m568.6 976.8 13-13.3c.1-.5.3-1.1.4-1.7l-14.7 15z" fill="#808080"/><path d="m573.6 976.8 5.2-5.3c.4-.7.7-1.5 1.1-2.4l-7.5 7.7z" fill="#808080"/><path d="m517.7 920.9v3.8l19.5-20h-3.7z" fill="#e8e7e8"/><path d="m517.7 915.8v3.8l14.5-14.9h-3.7z" fill="#e8e7e8"/><path d="m517.7 926v3.9l24.6-25.2h-3.8z" fill="#e8e7e8"/><path d="m517.7 931.1v3.9l29.6-30.3h-3.8z" fill="#e8e7e8"/><path d="m517.7 905.5v3.8l4.5-4.6h-3.8z" fill="#e8e7e8"/><path d="m517.7 936.3v3.8l34.6-35.4h-3.8z" fill="#e8e7e8"/><path d="m517.7 910.6v3.9l9.5-9.8h-3.7z" fill="#e8e7e8"/><path d="m527.1 940.8 25.8-26.5v-3.8l-29.6 30.3z" fill="#e8e7e8"/><path d="m532.1 940.8 20.8-21.3v-3.9l-24.5 25.2z" fill="#e8e7e8"/><path d="m537.1 940.8 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m552.2 940.8.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m542.1 940.8 10.8-11.1v-3.8l-14.5 14.9z" fill="#e8e7e8"/><path d="m547.2 940.8 5.7-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m522.1 940.8 30.8-31.6v-3.8l-34.6 35.4z" fill="#e8e7e8"/><path d="m517.7 905.5.7-.8h-.7z" fill="#808080"/><path d="m517.7 909.3v1.3l5.8-5.9h-1.3z" fill="#808080"/><path d="m517.7 914.5v1.3l10.8-11.1h-1.3z" fill="#808080"/><path d="m517.7 919.6v1.3l15.8-16.2h-1.3z" fill="#808080"/><path d="m517.7 924.7v1.3l20.8-21.3h-1.3z" fill="#808080"/><path d="m517.7 929.9v1.2l25.8-26.4h-1.2z" fill="#808080"/><path d="m517.7 935v1.3l30.8-31.6h-1.2z" fill="#808080"/><path d="m517.7 940.1v.7h.6l34.6-35.4v-.7h-.6z" fill="#808080"/><path d="m523.3 940.8 29.6-30.3v-1.3l-30.8 31.6z" fill="#808080"/><path d="m528.4 940.8 24.5-25.2v-1.3l-25.8 26.5z" fill="#808080"/><path d="m533.4 940.8 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m538.4 940.8 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m543.4 940.8 9.5-9.8v-1.3l-10.8 11.1z" fill="#808080"/><path d="m548.4 940.8 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m552.9 940.8v-.8l-.7.8z" fill="#808080"/><path d="m572.3 976.8h-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.6v.6 3.8 1.3 3.8c9.4-2.1 17.2-5.2 21.9-9.6h-1.2-1z" fill="#e8e7e8"/><path d="m523.5 976.8-5.8 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m548.3 987.3c1.6-.3 3.1-.6 4.7-1v-3.8z" fill="#e8e7e8"/><path d="m543.5 976.8-12.5 12.8c1.4-.1 2.8-.3 4.2-.4l12.2-12.4z" fill="#e8e7e8"/><path d="m552.9 977.4-10.6 10.9c1.5-.2 3-.5 4.5-.7l6.2-6.3v-3.9z" fill="#e8e7e8"/><path d="m548.5 976.8-12 12.3c1.4-.2 2.9-.3 4.3-.5l11.5-11.7h-3.8z" fill="#e8e7e8"/><path d="m538.5 976.8-13 13.3c1.4-.1 2.7-.2 4.1-.3l12.7-13z" fill="#e8e7e8"/><path d="m518.4 976.8-.7.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m528.5 976.8-10.8 11v2.7c.4 0 .8 0 1.2-.1l13.3-13.6z" fill="#e8e7e8"/><path d="m533.5 976.8-13.3 13.6c1.3-.1 2.7-.1 4-.2l13.1-13.4z" fill="#e8e7e8"/><path d="m517.7 976.8v.8l.7-.8z" fill="#808080"/><path d="m522.2 976.8-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m517.7 986.5v1.3l10.8-11h-1.3z" fill="#808080"/><path d="m532.2 976.8-13.3 13.6c.4 0 .9 0 1.3-.1l13.3-13.6h-1.3z" fill="#808080"/><path d="m537.2 976.8-13.1 13.4c.4 0 .9-.1 1.3-.1l13-13.3z" fill="#808080"/><path d="m542.3 976.8-12.7 13c.5 0 .9-.1 1.4-.1l12.6-12.8h-1.3z" fill="#808080"/><path d="m547.3 976.8-12.2 12.4c.5-.1.9-.1 1.4-.2l12-12.3h-1.2z" fill="#808080"/><path d="m552.9 976.8h-.6l-11.5 11.7c.5-.1 1-.1 1.5-.2l10.6-10.9z" fill="#808080"/><path d="m552.9 981.3-6.2 6.3 1.5-.3 4.7-4.8z" fill="#808080"/><path d="m447.3 452.4v3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.6v-.6-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-.3c-11.1 2-22.9 3.4-35.2 4.1v1.2 1.2z" fill="#808080"/><path d="m506.9 472.4 10.8-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m501.9 472.4 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m496.9 472.4 20.8-21.3v-3.8l-24.6 25.1z" fill="#e8e7e8"/><path d="m517.7 440.8v-3.8l-34.6 35.4h3.8z" fill="#e8e7e8"/><path d="m511.9 472.4 5.8-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m491.9 472.4 25.8-26.4v-3.9l-29.6 30.3z" fill="#e8e7e8"/><path d="m482.5 466.6 26.4-27.1c-1.7.5-3.5 1-5.2 1.5l-21.2 21.7z" fill="#e8e7e8"/><path d="m482.5 456.3 12.9-13.2c-1.6.4-3.2.7-4.8 1.1l-8.1 8.3z" fill="#e8e7e8"/><path d="m482.5 451.2 6.5-6.7c-1.5.3-3.1.6-4.7.9l-1.9 1.9v3.9z" fill="#e8e7e8"/><path d="m482.8 445.8c-.1 0-.2 0-.3.1v.3z" fill="#e8e7e8"/><path d="m517 472.4.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m482.5 461.5 19.5-20c-1.6.4-3.3.9-5 1.3l-14.5 14.9z" fill="#e8e7e8"/><path d="m482.5 471.7 33.8-34.6c-1.8.6-3.7 1.2-5.5 1.8l-28.3 28.9z" fill="#e8e7e8"/><path d="m482.5 447.4 1.9-1.9c-.5.1-1 .2-1.5.3l-.3.3v1.3z" fill="#808080"/><path d="m482.5 452.5 8.1-8.3c-.5.1-1 .2-1.6.3l-6.5 6.7z" fill="#808080"/><path d="m482.5 457.6 14.5-14.9c-.6.1-1.1.3-1.7.4l-12.9 13.2v1.3z" fill="#808080"/><path d="m482.5 462.8 21.2-21.7c-.6.2-1.1.3-1.7.5l-19.5 20z" fill="#808080"/><path d="m482.5 467.9 28.3-28.9c-.6.2-1.2.4-1.8.6l-26.4 27.1v1.2z" fill="#808080"/><path d="m482.5 472.4h.6l34.6-35.4v-.3c-.5.2-.9.3-1.4.5l-33.8 34.6z" fill="#808080"/><path d="m488.1 472.4 29.6-30.3v-1.3l-30.8 31.6z" fill="#808080"/><path d="m493.1 472.4 24.6-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m498.2 472.4 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m503.2 472.4 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m508.2 472.4 9.5-9.8v-1.2l-10.8 11z" fill="#808080"/><path d="m513.2 472.4 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m517.7 472.4v-.8l-.7.8z" fill="#808080"/><path d="m447.3 512.9v1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.7 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.7.7v-.6-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-.8-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-.6v.7z" fill="#808080"/><path d="m482.5 476.9v1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8.8h.7 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.6z" fill="#e8e7e8"/><path d="m482.5 543.8 34.6-35.4h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m501.9 544.4 15.8-16.1v-3.9l-19.5 20z" fill="#e8e7e8"/><path d="m511.9 544.4 5.8-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m517.7 512.9v-3.8l-34.6 35.3h3.8z" fill="#e8e7e8"/><path d="m496.9 544.4 20.8-21.2v-3.9l-24.6 25.1z" fill="#e8e7e8"/><path d="m482.5 538.7 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m482.5 518.1 9.5-9.7h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m506.9 544.4 10.8-11v-3.8l-14.5 14.8z" fill="#e8e7e8"/><path d="m482.5 523.3 14.5-14.9h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m491.9 544.4 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m482.5 528.4 19.5-20h-3.7l-15.8 16.2z" fill="#e8e7e8"/><path d="m482.5 533.5 24.5-25.1h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m482.5 513 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m517 544.4.7-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m483.2 508.4h-.7v.8z" fill="#808080"/><path d="m482.5 514.3 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m482.5 519.4 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m482.5 524.6 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m482.5 529.7 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m482.5 534.8 25.8-26.4h-1.3l-24.5 25.1z" fill="#808080"/><path d="m482.5 539.9 30.8-31.5h-1.2l-29.6 30.3z" fill="#808080"/><path d="m482.5 543.8v.6h.6l34.6-35.3v-.7h-.6z" fill="#808080"/><path d="m488.1 544.4 29.6-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m493.1 544.4 24.6-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m498.2 544.4 19.5-20v-1.2l-20.8 21.2z" fill="#808080"/><path d="m503.2 544.4 14.5-14.8v-1.3l-15.8 16.1z" fill="#808080"/><path d="m508.2 544.4 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m513.2 544.4 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m517.7 544.4v-.7l-.7.7z" fill="#808080"/><path d="m471.7 508.4 10.8-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m447.3 507.8 34.5-35.4h-3.7l-30.8 31.5z" fill="#e8e7e8"/><path d="m466.7 508.4 15.8-16.1v-3.9l-19.6 20z" fill="#e8e7e8"/><path d="m476.7 508.4 5.8-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m447.3 482.1 9.5-9.7h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m461.7 508.4 20.8-21.3v-3.8l-24.6 25.1z" fill="#e8e7e8"/><path d="m447.3 492.4 19.5-20h-3.7l-15.8 16.1z" fill="#e8e7e8"/><path d="m447.3 477 4.5-4.6h-3.8l-.7.7z" fill="#e8e7e8"/><path d="m447.3 487.2 14.5-14.8h-3.8l-10.7 11z" fill="#e8e7e8"/><path d="m447.3 497.5 24.5-25.1h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m447.3 502.6 29.5-30.2h-3.7l-25.8 26.4z" fill="#e8e7e8"/><path d="m456.7 508.4 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m481.7 508.4.8-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m482.5 476.9v-3.9l-34.6 35.4h3.7z" fill="#e8e7e8"/><path d="m448 472.4h-.7v.7z" fill="#808080"/><path d="m447.3 478.3 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m447.3 483.4 10.7-11h-1.2l-9.5 9.7z" fill="#808080"/><path d="m447.3 488.5 15.8-16.1h-1.3l-14.5 14.8z" fill="#808080"/><path d="m447.3 493.7 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m447.3 498.8 25.8-26.4h-1.3l-24.5 25.1z" fill="#808080"/><path d="m447.3 503.9 30.8-31.5h-1.3l-29.5 30.2z" fill="#808080"/><path d="m447.3 508.4h.6l34.6-35.4v-.6h-.7l-34.5 35.4z" fill="#808080"/><path d="m452.9 508.4 29.6-30.2v-1.3l-30.9 31.5z" fill="#808080"/><path d="m457.9 508.4 24.6-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m462.9 508.4 19.6-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m468 508.4 14.5-14.9v-1.2l-15.8 16.1z" fill="#808080"/><path d="m473 508.4 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m478 508.4 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m482.5 508.4v-.8l-.8.8z" fill="#808080"/><path d="m447.3 585v1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.7 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.7.7v-.6-3.9-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.8-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-.6v.6z" fill="#808080"/><path d="m482.5 548.9v1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.7 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.7-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.7-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.7z" fill="#e8e7e8"/><path d="m501.9 616.5 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m482.5 600.5 19.5-20h-3.7l-15.8 16.1z" fill="#e8e7e8"/><path d="m511.9 616.5 5.8-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m482.5 590.2 9.5-9.7h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m482.5 605.6 24.5-25.1h-3.7l-20.8 21.2z" fill="#e8e7e8"/><path d="m482.5 595.3 14.5-14.8h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m506.9 616.5 10.8-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m482.5 615.9 34.6-35.4h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m482.5 585.1 4.5-4.6h-3.8l-.7.7z" fill="#e8e7e8"/><path d="m517 616.5.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m496.9 616.5 20.8-21.3v-3.8l-24.6 25.1z" fill="#e8e7e8"/><path d="m486.9 616.5 30.8-31.5v-3.9l-34.6 35.4z" fill="#e8e7e8"/><path d="m491.9 616.5 25.8-26.4v-3.9l-29.6 30.3z" fill="#e8e7e8"/><path d="m482.5 610.7 29.6-30.2h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m483.2 580.5h-.7v.7z" fill="#808080"/><path d="m482.5 586.4 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m482.5 591.5 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m482.5 596.6 15.8-16.1h-1.3l-14.5 14.8z" fill="#808080"/><path d="m482.5 601.7 20.8-21.2h-1.3l-19.5 20z" fill="#808080"/><path d="m482.5 606.9 25.8-26.4h-1.3l-24.5 25.1z" fill="#808080"/><path d="m482.5 612 30.8-31.5h-1.2l-29.6 30.2z" fill="#808080"/><path d="m482.5 615.9v.6h.6l34.6-35.4v-.6h-.6z" fill="#808080"/><path d="m488.1 616.5 29.6-30.3v-1.2l-30.8 31.5z" fill="#808080"/><path d="m493.1 616.5 24.6-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m498.2 616.5 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m503.2 616.5 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m508.2 616.5 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m513.2 616.5 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m517.7 616.5v-.8l-.7.8z" fill="#808080"/><path d="m482.5 548.9v-3.8l-34.6 35.4h3.7z" fill="#e8e7e8"/><path d="m447.3 579.8 34.5-35.4h-3.7l-30.8 31.6z" fill="#e8e7e8"/><path d="m456.7 580.5 25.8-26.4v-3.9l-29.6 30.3z" fill="#e8e7e8"/><path d="m447.3 559.3 14.5-14.9h-3.8l-10.7 11.1z" fill="#e8e7e8"/><path d="m466.7 580.5 15.8-16.2v-3.8l-19.6 20z" fill="#e8e7e8"/><path d="m447.3 574.7 29.5-30.3h-3.7l-25.8 26.4z" fill="#e8e7e8"/><path d="m447.3 569.6 24.5-25.2h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m447.3 549 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m481.7 580.5.8-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m471.7 580.5 10.8-11.1v-3.8l-14.5 14.9z" fill="#e8e7e8"/><path d="m461.7 580.5 20.8-21.3v-3.9l-24.6 25.2z" fill="#e8e7e8"/><path d="m447.3 564.4 19.5-20h-3.7l-15.8 16.2z" fill="#e8e7e8"/><path d="m447.3 554.2 9.5-9.8h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m476.7 580.5 5.8-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m448 544.4h-.7v.8z" fill="#808080"/><path d="m447.3 550.3 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m447.3 555.5 10.7-11.1h-1.2l-9.5 9.8z" fill="#808080"/><path d="m447.3 560.6 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m447.3 565.7 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m447.3 570.8 25.8-26.4h-1.3l-24.5 25.2z" fill="#808080"/><path d="m447.3 576 30.8-31.6h-1.3l-29.5 30.3z" fill="#808080"/><path d="m447.3 579.8v.7h.6l34.6-35.4v-.7h-.7z" fill="#808080"/><path d="m452.9 580.5 29.6-30.3v-1.3l-30.9 31.6z" fill="#808080"/><path d="m457.9 580.5 24.6-25.2v-1.2l-25.8 26.4z" fill="#808080"/><path d="m462.9 580.5 19.6-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m468 580.5 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m473 580.5 9.5-9.8v-1.3l-10.8 11.1z" fill="#808080"/><path d="m478 580.5 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m482.5 580.5v-.8l-.8.8z" fill="#808080"/><path d="m482.5 684.1v-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-.8h-.8-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-.6v.7 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.7 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.7.7v-.7z" fill="#808080"/><path d="m513.2 616.5h-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.7 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-.8h-.7z" fill="#e8e7e8"/><path d="m511.9 688.6 5.8-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m482.5 657.1 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m482.5 662.3 9.5-9.8h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m517 688.6.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m506.9 688.6 10.8-11.1v-3.8l-14.5 14.9z" fill="#e8e7e8"/><path d="m482.5 682.8 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m482.5 687.9 34.6-35.4h-3.8l-30.8 31.6z" fill="#e8e7e8"/><path d="m501.9 688.6 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m482.5 672.5 19.5-20h-3.7l-15.8 16.2z" fill="#e8e7e8"/><path d="m482.5 667.4 14.5-14.9h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m482.5 677.6 24.5-25.1h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m486.9 688.6 30.8-31.6v-3.8l-34.6 35.4z" fill="#e8e7e8"/><path d="m491.9 688.6 25.8-26.5v-3.8l-29.6 30.3z" fill="#e8e7e8"/><path d="m496.9 688.6 20.8-21.3v-3.9l-24.6 25.2z" fill="#e8e7e8"/><path d="m483.2 652.5h-.7v.8z" fill="#808080"/><path d="m482.5 658.4 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m482.5 663.5 10.8-11h-1.3l-9.5 9.8z" fill="#808080"/><path d="m482.5 668.7 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m482.5 673.8 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m482.5 678.9 25.8-26.4h-1.3l-24.5 25.1z" fill="#808080"/><path d="m482.5 684.1 30.8-31.6h-1.2l-29.6 30.3z" fill="#808080"/><path d="m482.5 687.9v.7h.6l34.6-35.4v-.7h-.6z" fill="#808080"/><path d="m488.1 688.6 29.6-30.3v-1.3l-30.8 31.6z" fill="#808080"/><path d="m493.1 688.6 24.6-25.2v-1.3l-25.8 26.5z" fill="#808080"/><path d="m498.2 688.6 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m503.2 688.6 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m508.2 688.6 9.5-9.8v-1.3l-10.8 11.1z" fill="#808080"/><path d="m513.2 688.6 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m517.7 688.6v-.8l-.7.8z" fill="#808080"/><path d="m451.6 652.5 30.9-31.5v-3.9l-34.6 35.4z" fill="#e8e7e8"/><path d="m447.3 651.9 34.5-35.4h-3.7l-30.8 31.5z" fill="#e8e7e8"/><path d="m466.7 652.5 15.8-16.1v-3.9l-19.6 20z" fill="#e8e7e8"/><path d="m471.7 652.5 10.8-11v-3.8l-14.5 14.8z" fill="#e8e7e8"/><path d="m481.7 652.5.8-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m476.7 652.5 5.8-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m456.7 652.5 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m461.7 652.5 20.8-21.3v-3.8l-24.6 25.1z" fill="#e8e7e8"/><path d="m447.3 646.7 29.5-30.2h-3.7l-25.8 26.4z" fill="#e8e7e8"/><path d="m447.3 641.6 24.5-25.1h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m447.3 631.4 14.5-14.9h-3.8l-10.7 11z" fill="#e8e7e8"/><path d="m447.3 621.1 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m447.3 626.2 9.5-9.7h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m447.3 636.5 19.5-20h-3.7l-15.8 16.1z" fill="#e8e7e8"/><path d="m448 616.5h-.7v.8z" fill="#808080"/><path d="m447.3 622.4 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m447.3 627.5 10.7-11h-1.2l-9.5 9.7z" fill="#808080"/><path d="m447.3 632.6 15.8-16.1h-1.3l-14.5 14.9z" fill="#808080"/><path d="m447.3 637.8 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m447.3 642.9 25.8-26.4h-1.3l-24.5 25.1z" fill="#808080"/><path d="m447.3 648 30.8-31.5h-1.3l-29.5 30.2z" fill="#808080"/><path d="m447.3 651.9v.6h.6l34.6-35.4v-.6h-.7z" fill="#808080"/><path d="m452.9 652.5 29.6-30.2v-1.3l-30.9 31.5z" fill="#808080"/><path d="m457.9 652.5 24.6-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m462.9 652.5 19.6-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m468 652.5 14.5-14.8v-1.3l-15.8 16.1z" fill="#808080"/><path d="m473 652.5 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m478 652.5 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m482.5 652.5v-.7l-.8.7z" fill="#808080"/><path d="m482.5 756.1v-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.8-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-.6v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h35.2v-.6z" fill="#808080"/><path d="m517.7 720.1v-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-.7h-.7-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.6 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.7 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.7z" fill="#e8e7e8"/><path d="m517.7 740.6-19.5 20h3.7l15.8-16.1z" fill="#e8e7e8"/><path d="m517.7 730.4-29.6 30.2h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m517.7 735.5-24.6 25.1h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m517.7 725.2-34.6 35.4h3.8l30.8-31.5z" fill="#e8e7e8"/><path d="m493.3 724.6-10.8 11v3.8l14.5-14.8z" fill="#e8e7e8"/><path d="m488.2 724.6-5.7 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m483.2 724.6-.7.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m482.5 756.1v3.9l34.6-35.4h-3.8z" fill="#e8e7e8"/><path d="m503.3 724.6-20.8 21.3v3.8l24.5-25.1z" fill="#e8e7e8"/><path d="m508.3 724.6-25.8 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m498.3 724.6-15.8 16.1v3.9l19.5-20z" fill="#e8e7e8"/><path d="m517.7 750.9-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m517.7 756-4.5 4.6h3.8l.7-.7z" fill="#e8e7e8"/><path d="m517.7 745.8-14.5 14.8h3.7l10.8-11z" fill="#e8e7e8"/><path d="m482.5 724.6v.7l.7-.7z" fill="#808080"/><path d="m487 724.6-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m492 724.6-9.5 9.7v1.3l10.8-11z" fill="#808080"/><path d="m497 724.6-14.5 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m502 724.6-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m507 724.6-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m512.1 724.6-29.6 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m517.7 724.6h-.6l-34.6 35.4v.6h.6l34.6-35.4z" fill="#808080"/><path d="m517.7 729.1-30.8 31.5h1.2l29.6-30.2z" fill="#808080"/><path d="m517.7 734.2-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m517.7 739.3-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m517.7 744.5-15.8 16.1h1.3l14.5-14.8z" fill="#808080"/><path d="m517.7 749.6-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m517.7 754.7-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m517 760.6h.7v-.7z" fill="#808080"/><path d="m482.5 689.2-34.6 35.4h3.7l30.9-31.6z" fill="#e8e7e8"/><path d="m473.1 688.6-25.8 26.4v3.8l29.5-30.2z" fill="#e8e7e8"/><path d="m447.3 720.1v3.8l34.5-35.3h-3.7z" fill="#e8e7e8"/><path d="m482.5 704.6-19.6 20h3.8l15.8-16.2z" fill="#e8e7e8"/><path d="m453 688.6-5.7 5.8v3.9l9.5-9.7z" fill="#e8e7e8"/><path d="m482.5 720-4.5 4.6h3.7l.8-.8z" fill="#e8e7e8"/><path d="m448 688.6-.7.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m482.5 699.5-24.6 25.1h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m482.5 714.9-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m463.1 688.6-15.8 16.1v3.8l19.5-19.9z" fill="#e8e7e8"/><path d="m468.1 688.6-20.8 21.2v3.9l24.5-25.1z" fill="#e8e7e8"/><path d="m458 688.6-10.7 11v3.8l14.5-14.8z" fill="#e8e7e8"/><path d="m482.5 709.7-14.5 14.9h3.7l10.8-11z" fill="#e8e7e8"/><path d="m482.5 694.3-29.6 30.3h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m447.3 688.6v.7l.7-.7z" fill="#808080"/><path d="m451.8 688.6-4.5 4.6v1.2l5.7-5.8z" fill="#808080"/><path d="m456.8 688.6-9.5 9.7v1.3l10.7-11z" fill="#808080"/><path d="m461.8 688.6-14.5 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m466.8 688.6-19.5 19.9v1.3l20.8-21.2z" fill="#808080"/><path d="m471.8 688.6-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m476.8 688.6-29.5 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m482.5 688.6h-.7l-34.5 35.3v.7h.6l34.6-35.4z" fill="#808080"/><path d="m482.5 693-30.9 31.6h1.3l29.6-30.3z" fill="#808080"/><path d="m482.5 698.2-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m482.5 703.3-20.8 21.3h1.2l19.6-20z" fill="#808080"/><path d="m482.5 708.4-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m482.5 713.6-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m482.5 718.7-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m481.7 724.6h.8v-.8z" fill="#808080"/><path d="m447.3 801.1v1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8.8h.7 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.7.7v-.7-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.8-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-.6v.7z" fill="#808080"/><path d="m482.5 765.1v1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9.7h.7 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.6-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-35.2v.7z" fill="#e8e7e8"/><path d="m482.5 826.9 29.6-30.3h-3.8l-25.8 26.5z" fill="#e8e7e8"/><path d="m482.5 832 34.6-35.4h-3.8l-30.8 31.6z" fill="#e8e7e8"/><path d="m486.9 832.7 30.8-31.6v-3.8l-34.6 35.4z" fill="#e8e7e8"/><path d="m482.5 821.8 24.5-25.2h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m496.9 832.7 20.8-21.3v-3.8l-24.6 25.1z" fill="#e8e7e8"/><path d="m482.5 806.4 9.5-9.8h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m482.5 811.5 14.5-14.9h-3.7l-10.8 11.1z" fill="#e8e7e8"/><path d="m482.5 816.6 19.5-20h-3.7l-15.8 16.2z" fill="#e8e7e8"/><path d="m491.9 832.7 25.8-26.4v-3.9l-29.6 30.3z" fill="#e8e7e8"/><path d="m511.9 832.7 5.8-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m517 832.7.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m482.5 801.2 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m506.9 832.7 10.8-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m501.9 832.7 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m483.2 796.6h-.7v.8z" fill="#808080"/><path d="m482.5 802.5 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m482.5 807.7 10.8-11.1h-1.3l-9.5 9.8z" fill="#808080"/><path d="m482.5 812.8 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m482.5 817.9 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m482.5 823.1 25.8-26.5h-1.3l-24.5 25.2z" fill="#808080"/><path d="m482.5 828.2 30.8-31.6h-1.2l-29.6 30.3z" fill="#808080"/><path d="m482.5 832.7h.6l34.6-35.4v-.7h-.6l-34.6 35.4z" fill="#808080"/><path d="m488.1 832.7 29.6-30.3v-1.3l-30.8 31.6z" fill="#808080"/><path d="m493.1 832.7 24.6-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m498.2 832.7 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m503.2 832.7 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m508.2 832.7 9.5-9.8v-1.2l-10.8 11z" fill="#808080"/><path d="m513.2 832.7 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m517.7 832.7v-.8l-.7.8z" fill="#808080"/><path d="m476.7 796.6 5.8-5.8v-3.9l-9.5 9.7z" fill="#e8e7e8"/><path d="m481.7 796.6.8-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m471.7 796.6 10.8-11v-3.8l-14.5 14.8z" fill="#e8e7e8"/><path d="m447.3 780.6 19.5-20h-3.7l-15.8 16.2z" fill="#e8e7e8"/><path d="m447.3 785.7 24.5-25.1h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m447.3 790.9 29.5-30.3h-3.7l-25.8 26.4z" fill="#e8e7e8"/><path d="m447.3 765.2 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m447.3 775.5 14.5-14.9h-3.8l-10.7 11z" fill="#e8e7e8"/><path d="m447.3 796 34.5-35.4h-3.7l-30.8 31.6z" fill="#e8e7e8"/><path d="m461.7 796.6 20.8-21.2v-3.9l-24.6 25.1z" fill="#e8e7e8"/><path d="m456.7 796.6 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m466.7 796.6 15.8-16.1v-3.8l-19.6 19.9z" fill="#e8e7e8"/><path d="m482.5 765.1v-3.8l-34.6 35.3h3.7z" fill="#e8e7e8"/><path d="m447.3 770.3 9.5-9.7h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m448 760.6h-.7v.8z" fill="#808080"/><path d="m447.3 766.5 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m447.3 771.6 10.7-11h-1.2l-9.5 9.7z" fill="#808080"/><path d="m447.3 776.8 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m447.3 781.9 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m447.3 787 25.8-26.4h-1.3l-24.5 25.1z" fill="#808080"/><path d="m447.3 792.2 30.8-31.6h-1.3l-29.5 30.3z" fill="#808080"/><path d="m447.3 796.6h.6l34.6-35.3v-.7h-.7l-34.5 35.4z" fill="#808080"/><path d="m452.9 796.6 29.6-30.2v-1.3l-30.9 31.5z" fill="#808080"/><path d="m457.9 796.6 24.6-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m462.9 796.6 19.6-19.9v-1.3l-20.8 21.2z" fill="#808080"/><path d="m468 796.6 14.5-14.8v-1.3l-15.8 16.1z" fill="#808080"/><path d="m473 796.6 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m478 796.6 4.5-4.6v-1.2l-5.8 5.8z" fill="#808080"/><path d="m482.5 796.6v-.7l-.8.7z" fill="#808080"/><path d="m478 868.7h-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-.6v.7 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.7 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.7.7v-.6-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-.8z" fill="#808080"/><path d="m513.2 832.7h-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8.8h.7 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7z" fill="#e8e7e8"/><path d="m511.9 904.7 5.8-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m486.9 904.7 30.8-31.5v-3.8l-34.6 35.3z" fill="#e8e7e8"/><path d="m517 904.7.7-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m491.9 904.7 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m506.9 904.7 10.8-11v-3.8l-14.5 14.8z" fill="#e8e7e8"/><path d="m496.9 904.7 20.8-21.2v-3.9l-24.6 25.1z" fill="#e8e7e8"/><path d="m501.9 904.7 15.8-16.1v-3.9l-19.5 20z" fill="#e8e7e8"/><path d="m482.5 878.4 9.5-9.7h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m482.5 883.6 14.5-14.9h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m482.5 904.1 34.6-35.4h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m482.5 873.3 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m482.5 899 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m482.5 893.8 24.5-25.1h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m482.5 888.7 19.5-20h-3.7l-15.8 16.2z" fill="#e8e7e8"/><path d="m483.2 868.7h-.7v.8z" fill="#808080"/><path d="m482.5 874.6 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m482.5 879.7 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m482.5 884.9 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m482.5 890 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m482.5 895.1 25.8-26.4h-1.3l-24.5 25.1z" fill="#808080"/><path d="m482.5 900.2 30.8-31.5h-1.2l-29.6 30.3z" fill="#808080"/><path d="m482.5 904.1v.6h.6l34.6-35.3v-.7h-.6z" fill="#808080"/><path d="m488.1 904.7 29.6-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m493.1 904.7 24.6-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m498.2 904.7 19.5-20v-1.2l-20.8 21.2z" fill="#808080"/><path d="m503.2 904.7 14.5-14.8v-1.3l-15.8 16.1z" fill="#808080"/><path d="m508.2 904.7 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m513.2 904.7 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m517.7 904.7v-.7l-.7.7z" fill="#808080"/><path d="m447.3 837.3 4.5-4.6h-3.8l-.7.7z" fill="#e8e7e8"/><path d="m447.3 842.4 9.5-9.7h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m451.6 868.7 30.9-31.5v-3.9l-34.6 35.4z" fill="#e8e7e8"/><path d="m476.7 868.7 5.8-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m466.7 868.7 15.8-16.1v-3.9l-19.6 20z" fill="#e8e7e8"/><path d="m471.7 868.7 10.8-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m447.3 847.5 14.5-14.8h-3.8l-10.7 11z" fill="#e8e7e8"/><path d="m456.7 868.7 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m447.3 868.1 34.5-35.4h-3.7l-30.8 31.5z" fill="#e8e7e8"/><path d="m447.3 852.7 19.5-20h-3.7l-15.8 16.1z" fill="#e8e7e8"/><path d="m447.3 857.8 24.5-25.1h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m447.3 862.9 29.5-30.2h-3.7l-25.8 26.4z" fill="#e8e7e8"/><path d="m481.7 868.7.8-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m461.7 868.7 20.8-21.3v-3.8l-24.6 25.1z" fill="#e8e7e8"/><path d="m448 832.7h-.7v.7z" fill="#808080"/><path d="m447.3 838.6 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m447.3 843.7 10.7-11h-1.2l-9.5 9.7z" fill="#808080"/><path d="m447.3 848.8 15.8-16.1h-1.3l-14.5 14.8z" fill="#808080"/><path d="m447.3 854 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m447.3 859.1 25.8-26.4h-1.3l-24.5 25.1z" fill="#808080"/><path d="m447.3 864.2 30.8-31.5h-1.3l-29.5 30.2z" fill="#808080"/><path d="m447.3 868.7h.6l34.6-35.4v-.6h-.7l-34.5 35.4z" fill="#808080"/><path d="m452.9 868.7 29.6-30.2v-1.3l-30.9 31.5z" fill="#808080"/><path d="m457.9 868.7 24.6-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m462.9 868.7 19.6-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m468 868.7 14.5-14.9v-1.2l-15.8 16.1z" fill="#808080"/><path d="m473 868.7 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m478 868.7 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m482.5 868.7v-.8l-.8.8z" fill="#808080"/><path d="m482.5 972.3v-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.8-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-.6v.6 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.7 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.7.7v-.7z" fill="#808080"/><path d="m513.2 904.7h-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.7 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.7 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.7-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.7z" fill="#e8e7e8"/><path d="m517.7 961.9-14.5 14.9h3.7l10.8-11z" fill="#e8e7e8"/><path d="m517.7 956.8-19.5 20h3.7l15.8-16.2z" fill="#e8e7e8"/><path d="m517.7 946.5-29.6 30.3h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m517.7 967.1-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m503.3 940.8-20.8 21.2v3.9l24.5-25.1z" fill="#e8e7e8"/><path d="m517.7 951.7-24.6 25.1h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m517.7 941.4-34.6 35.4h3.8l30.8-31.6z" fill="#e8e7e8"/><path d="m493.3 940.8-10.8 11v3.8l14.5-14.8z" fill="#e8e7e8"/><path d="m488.2 940.8-5.7 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m483.2 940.8-.7.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m508.3 940.8-25.8 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m517.7 972.2-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m498.3 940.8-15.8 16.1v3.9l19.5-20z" fill="#e8e7e8"/><path d="m482.5 972.3v3.8l34.6-35.3h-3.8z" fill="#e8e7e8"/><path d="m482.5 940.8v.7l.7-.7z" fill="#808080"/><path d="m487 940.8-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m492 940.8-9.5 9.7v1.3l10.8-11z" fill="#808080"/><path d="m497 940.8-14.5 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m502 940.8-19.5 20v1.2l20.8-21.2z" fill="#808080"/><path d="m507 940.8-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m512.1 940.8-29.6 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m517.7 940.8h-.6l-34.6 35.3v.7h.6l34.6-35.4z" fill="#808080"/><path d="m517.7 945.2-30.8 31.6h1.2l29.6-30.3z" fill="#808080"/><path d="m517.7 950.4-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m517.7 955.5-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m517.7 960.6-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m517.7 965.8-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m517.7 970.9-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m517 976.8h.7v-.8z" fill="#808080"/><path d="m482.5 915.6-24.6 25.2h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m482.5 905.4-34.6 35.4h3.7l30.9-31.6z" fill="#e8e7e8"/><path d="m482.5 920.8-19.6 20h3.8l15.8-16.2z" fill="#e8e7e8"/><path d="m482.5 910.5-29.6 30.3h3.8l25.8-26.5z" fill="#e8e7e8"/><path d="m482.5 925.9-14.5 14.9h3.7l10.8-11.1z" fill="#e8e7e8"/><path d="m482.5 931-9.5 9.8h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m482.5 936.2-4.5 4.6h3.7l.8-.8z" fill="#e8e7e8"/><path d="m447.3 936.3v3.8l34.5-35.4h-3.7z" fill="#e8e7e8"/><path d="m451.8 904.7h-3.8l-.7.8v3.8z" fill="#e8e7e8"/><path d="m476.8 904.7h-3.7l-25.8 26.4v3.9z" fill="#e8e7e8"/><path d="m461.8 904.7h-3.8l-10.7 11.1v3.8z" fill="#e8e7e8"/><path d="m471.8 904.7h-3.7l-20.8 21.3v3.9z" fill="#e8e7e8"/><path d="m456.8 904.7h-3.8l-5.7 5.9v3.9z" fill="#e8e7e8"/><path d="m466.8 904.7h-3.7l-15.8 16.2v3.8z" fill="#e8e7e8"/><path d="m448 904.7h-.7v.8z" fill="#808080"/><path d="m453 904.7h-1.2l-4.5 4.6v1.3z" fill="#808080"/><path d="m458 904.7h-1.2l-9.5 9.8v1.3z" fill="#808080"/><path d="m463.1 904.7h-1.3l-14.5 14.9v1.3z" fill="#808080"/><path d="m468.1 904.7h-1.3l-19.5 20v1.3z" fill="#808080"/><path d="m473.1 904.7h-1.3l-24.5 25.2v1.2z" fill="#808080"/><path d="m478.1 904.7h-1.3l-29.5 30.3v1.3z" fill="#808080"/><path d="m482.5 904.7h-.7l-34.5 35.4v.7h.6l34.6-35.4z" fill="#808080"/><path d="m482.5 909.2-30.9 31.6h1.3l29.6-30.3z" fill="#808080"/><path d="m482.5 914.3-25.8 26.5h1.2l24.6-25.2z" fill="#808080"/><path d="m482.5 919.5-20.8 21.3h1.2l19.6-20z" fill="#808080"/><path d="m482.5 924.6-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m482.5 929.7-10.8 11.1h1.3l9.5-9.8z" fill="#808080"/><path d="m482.5 934.9-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m481.7 940.8h.8v-.8z" fill="#808080"/><path d="m517.7 986.5v-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.6v.6 3.8 1.3 3.8 1.3 2.8c3.3.1 6.8.2 10.3.3h16.7c2.9-.1 5.8-.1 8.7-.3v-2.7z" fill="#e8e7e8"/><path d="m453 976.8-5.7 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m448 976.8-.7.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m482.5 977.4-12.2 12.5c1.2.1 2.3.1 3.6.2l8.6-8.8z" fill="#e8e7e8"/><path d="m479.9 990.4c.9 0 1.7.1 2.6.1v-2.8z" fill="#e8e7e8"/><path d="m482.5 982.6-7.4 7.6c1.2.1 2.4.1 3.6.2l3.8-3.9z" fill="#e8e7e8"/><path d="m473.1 976.8-12.2 12.5c1.1.1 2.3.2 3.5.2l12.5-12.7z" fill="#e8e7e8"/><path d="m478.1 976.8-12.5 12.8c1.1.1 2.3.1 3.5.2l12.8-13z" fill="#e8e7e8"/><path d="m463.1 976.8-11.5 11.7c.9.1 2.1.2 3.5.3l11.8-12z" fill="#e8e7e8"/><path d="m458 976.8-10.8 11v.4h1.7s.5.1 1.5.1l11.4-11.6h-3.8z" fill="#e8e7e8"/><path d="m468.1 976.8-11.9 12.1c1.1.1 2.2.2 3.5.3l12.1-12.4z" fill="#e8e7e8"/><path d="m447.3 976.8v.8l.7-.8z" fill="#808080"/><path d="m451.8 976.8-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m447.3 986.5v1.3l10.7-11h-1.2z" fill="#808080"/><path d="m461.8 976.8-11.4 11.6c.3 0 .7.1 1.2.1l11.5-11.7z" fill="#808080"/><path d="m466.8 976.8-11.8 12c.4 0 .8.1 1.2.1l11.9-12.1z" fill="#808080"/><path d="m471.8 976.8-12.1 12.4c.4 0 .8.1 1.2.1l12.2-12.5z" fill="#808080"/><path d="m476.8 976.8-12.5 12.7c.4 0 .8.1 1.2.1l12.5-12.8z" fill="#808080"/><path d="m482.5 976.8h-.6l-12.8 13c.4 0 .8 0 1.2.1l12.2-12.5z" fill="#808080"/><path d="m482.5 981.3-8.6 8.8c.4 0 .8 0 1.2.1l7.4-7.6z" fill="#808080"/><path d="m482.5 986.4-3.8 3.9c.4 0 .8 0 1.2.1l2.6-2.7z" fill="#808080"/><path d="m376.8 451.1v1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.6v-.6-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-1c-12.3-.6-24.1-1.8-35.2-3.6v.6 3.8z" fill="#808080"/><path d="m426.5 472.4 20.8-21.3v-1.2c-.9.1-1.9.1-2.8.2l-21.8 22.3z" fill="#e8e7e8"/><path d="m412 461.5 10.7-11c-1.2 0-2.5 0-3.7-.1l-7 7.2z" fill="#e8e7e8"/><path d="m421.4 472.4 21.7-22.2c-1.3.1-2.6.1-3.9.2l-21.6 22.1h3.8z" fill="#e8e7e8"/><path d="m412 456.3 5.8-5.9c-1.2 0-2.4-.1-3.6-.1l-2.2 2.2z" fill="#e8e7e8"/><path d="m436.5 472.4 10.8-11v-3.9l-14.6 14.9z" fill="#e8e7e8"/><path d="m446.5 472.4.8-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m431.5 472.4 15.8-16.2v-3.8l-19.6 20z" fill="#e8e7e8"/><path d="m441.5 472.4 5.8-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m416.4 472.4 21.5-22c-1.3 0-2.6.1-3.8.1l-21.4 21.9z" fill="#e8e7e8"/><path d="m412 466.6 15.7-16.1c-.2 0-.3 0-.5 0-1.1 0-2.2 0-3.3 0l-12 12.2v3.9z" fill="#e8e7e8"/><path d="m412 471.7 20.8-21.2c-1.3 0-2.5 0-3.8 0l-17 17.4z" fill="#e8e7e8"/><path d="m413 450.2c-.3 0-.6 0-1 0v1z" fill="#e8e7e8"/><path d="m412 452.5 2.2-2.2c-.4 0-.8 0-1.2-.1l-1 1z" fill="#808080"/><path d="m412 457.6 7-7.2c-.4 0-.8 0-1.2 0l-5.8 5.9z" fill="#808080"/><path d="m412 462.8 12-12.2c-.4 0-.8 0-1.2 0l-10.7 11v1.2z" fill="#808080"/><path d="m412 467.9 17-17.4c-.4 0-.8 0-1.3 0l-15.7 16.1z" fill="#808080"/><path d="m412 472.4h.6l21.4-21.9c-.4 0-.9 0-1.3 0l-20.7 21.2z" fill="#808080"/><path d="m417.7 472.4 21.6-22.1c-.4 0-.9 0-1.3 0l-21.5 22h1.2z" fill="#808080"/><path d="m422.7 472.4 21.8-22.3c-.4 0-.9 0-1.3.1l-21.7 22.2z" fill="#808080"/><path d="m447.3 452.4v-1.3l-20.8 21.3h1.2z" fill="#808080"/><path d="m432.7 472.4 14.6-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m437.8 472.4 9.5-9.8v-1.2l-10.8 11z" fill="#808080"/><path d="m442.8 472.4 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m447.3 472.4v-.8l-.8.8z" fill="#808080"/><path d="m376.8 512.9v1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.8 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7.6v-.6-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-.7v.7z" fill="#808080"/><path d="m412 476.9v1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8.8h.8 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7.7v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.8-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-.7v.6z" fill="#e8e7e8"/><path d="m412 538.7 29.6-30.3h-3.7l-25.9 26.4z" fill="#e8e7e8"/><path d="m446.5 544.4.8-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m421.4 544.4 25.9-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m412 523.3 14.6-14.9h-3.8l-10.8 11z" fill="#e8e7e8"/><path d="m441.5 544.4 5.8-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m412 543.8 34.6-35.4h-3.7l-30.9 31.5z" fill="#e8e7e8"/><path d="m426.5 544.4 20.8-21.2v-3.9l-24.6 25.1z" fill="#e8e7e8"/><path d="m447.3 512.9v-3.8l-34.6 35.3h3.7z" fill="#e8e7e8"/><path d="m436.5 544.4 10.8-11v-3.8l-14.6 14.8z" fill="#e8e7e8"/><path d="m412 528.4 19.6-20h-3.8l-15.8 16.2z" fill="#e8e7e8"/><path d="m412 533.5 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m412 518.1 9.6-9.7h-3.8l-5.8 5.9z" fill="#e8e7e8"/><path d="m412 513 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m431.5 544.4 15.8-16.1v-3.9l-19.6 20z" fill="#e8e7e8"/><path d="m412.8 508.4h-.8v.8z" fill="#808080"/><path d="m412 514.3 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m412 519.4 10.8-11h-1.2l-9.6 9.7z" fill="#808080"/><path d="m412 524.6 15.8-16.2h-1.2l-14.6 14.9z" fill="#808080"/><path d="m412 529.7 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m412 534.8 25.9-26.4h-1.3l-24.6 25.1z" fill="#808080"/><path d="m412 539.9 30.9-31.5h-1.3l-29.6 30.3z" fill="#808080"/><path d="m412 544.4h.7l34.6-35.3v-.7h-.7l-34.6 35.4z" fill="#808080"/><path d="m417.7 544.4 29.6-30.2v-1.3l-30.9 31.5z" fill="#808080"/><path d="m422.7 544.4 24.6-25.1v-1.3l-25.9 26.4z" fill="#808080"/><path d="m427.7 544.4 19.6-20v-1.2l-20.8 21.2z" fill="#808080"/><path d="m432.7 544.4 14.6-14.8v-1.3l-15.8 16.1z" fill="#808080"/><path d="m437.8 544.4 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m442.8 544.4 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m447.3 544.4v-.7l-.8.7z" fill="#808080"/><path d="m376.8 482.1 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m386.2 508.4 25.8-26.4v-3.8l-29.5 30.2z" fill="#e8e7e8"/><path d="m401.3 508.4 10.7-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m411.3 508.4.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m391.2 508.4 20.8-21.3v-3.8l-24.5 25.1z" fill="#e8e7e8"/><path d="m406.3 508.4 5.7-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m376.8 507.8 34.6-35.4h-3.7l-30.9 31.5z" fill="#e8e7e8"/><path d="m376.8 492.4 19.6-20h-3.8l-15.8 16.1z" fill="#e8e7e8"/><path d="m376.8 497.5 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m376.8 502.6 29.6-30.2h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m396.3 508.4 15.7-16.1v-3.9l-19.5 20z" fill="#e8e7e8"/><path d="m376.8 487.2 14.6-14.8h-3.8l-10.8 11z" fill="#e8e7e8"/><path d="m412 476.9v-3.9l-34.5 35.4h3.7z" fill="#e8e7e8"/><path d="m376.8 477 4.5-4.6h-3.7l-.8.7z" fill="#e8e7e8"/><path d="m377.6 472.4h-.8v.7z" fill="#808080"/><path d="m376.8 478.3 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m376.8 483.4 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m376.8 488.5 15.8-16.1h-1.2l-14.6 14.8z" fill="#808080"/><path d="m376.8 493.7 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m376.8 498.8 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m376.8 503.9 30.9-31.5h-1.3l-29.6 30.2z" fill="#808080"/><path d="m376.8 508.4h.7l34.5-35.4v-.6h-.6l-34.6 35.4z" fill="#808080"/><path d="m382.5 508.4 29.5-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m387.5 508.4 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m392.5 508.4 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m397.5 508.4 14.5-14.9v-1.2l-15.7 16.1z" fill="#808080"/><path d="m402.5 508.4 9.5-9.7v-1.3l-10.7 11z" fill="#808080"/><path d="m407.5 508.4 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m412 508.4v-.8l-.7.8z" fill="#808080"/><path d="m381.3 616.5h1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7.6v-.6-3.9-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-.7v.6 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.8z" fill="#808080"/><path d="m412 548.9v1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.8 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7.7v-.7-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.8-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-.7v.7z" fill="#e8e7e8"/><path d="m421.4 616.5 25.9-26.4v-3.9l-29.6 30.3z" fill="#e8e7e8"/><path d="m412 595.3 14.6-14.8h-3.8l-10.8 11z" fill="#e8e7e8"/><path d="m447.3 585v-3.9l-34.6 35.4h3.7z" fill="#e8e7e8"/><path d="m412 610.7 29.6-30.2h-3.7l-25.9 26.4z" fill="#e8e7e8"/><path d="m412 590.2 9.6-9.7h-3.8l-5.8 5.9z" fill="#e8e7e8"/><path d="m426.5 616.5 20.8-21.3v-3.8l-24.6 25.1z" fill="#e8e7e8"/><path d="m431.5 616.5 15.8-16.2v-3.8l-19.6 20z" fill="#e8e7e8"/><path d="m412 605.6 24.6-25.1h-3.8l-20.8 21.2z" fill="#e8e7e8"/><path d="m412 600.5 19.6-20h-3.8l-15.8 16.1z" fill="#e8e7e8"/><path d="m412 585.1 4.5-4.6h-3.7l-.8.7z" fill="#e8e7e8"/><path d="m441.5 616.5 5.8-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m446.5 616.5.8-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m412 615.9 34.6-35.4h-3.7l-30.9 31.5z" fill="#e8e7e8"/><path d="m436.5 616.5 10.8-11v-3.9l-14.6 14.9z" fill="#e8e7e8"/><path d="m412.8 580.5h-.8v.7z" fill="#808080"/><path d="m412 586.4 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m412 591.5 10.8-11h-1.2l-9.6 9.7z" fill="#808080"/><path d="m412 596.6 15.8-16.1h-1.2l-14.6 14.8z" fill="#808080"/><path d="m412 601.7 20.8-21.2h-1.2l-19.6 20z" fill="#808080"/><path d="m412 606.9 25.9-26.4h-1.3l-24.6 25.1z" fill="#808080"/><path d="m412 612 30.9-31.5h-1.3l-29.6 30.2z" fill="#808080"/><path d="m412 615.9v.6h.7l34.6-35.4v-.6h-.7z" fill="#808080"/><path d="m417.7 616.5 29.6-30.3v-1.2l-30.9 31.5z" fill="#808080"/><path d="m422.7 616.5 24.6-25.1v-1.3l-25.9 26.4z" fill="#808080"/><path d="m427.7 616.5 19.6-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m432.7 616.5 14.6-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m437.8 616.5 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m442.8 616.5 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m447.3 616.5v-.8l-.8.8z" fill="#808080"/><path d="m376.8 569.6 24.6-25.2h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m412 548.9v-3.8l-34.5 35.4h3.7z" fill="#e8e7e8"/><path d="m376.8 574.7 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m376.8 579.8 34.6-35.4h-3.7l-30.9 31.6z" fill="#e8e7e8"/><path d="m411.3 580.5.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m386.2 580.5 25.8-26.4v-3.9l-29.5 30.3z" fill="#e8e7e8"/><path d="m376.8 549 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m376.8 559.3 14.6-14.9h-3.8l-10.8 11.1z" fill="#e8e7e8"/><path d="m391.2 580.5 20.8-21.3v-3.9l-24.5 25.2z" fill="#e8e7e8"/><path d="m396.3 580.5 15.7-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m376.8 564.4 19.6-20h-3.8l-15.8 16.2z" fill="#e8e7e8"/><path d="m406.3 580.5 5.7-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m376.8 554.2 9.5-9.8h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m401.3 580.5 10.7-11.1v-3.8l-14.5 14.9z" fill="#e8e7e8"/><path d="m377.6 544.4h-.8v.8z" fill="#808080"/><path d="m376.8 550.3 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m376.8 555.5 10.8-11.1h-1.3l-9.5 9.8z" fill="#808080"/><path d="m376.8 560.6 15.8-16.2h-1.2l-14.6 14.9z" fill="#808080"/><path d="m376.8 565.7 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m376.8 570.8 25.8-26.4h-1.2l-24.6 25.2z" fill="#808080"/><path d="m376.8 576 30.9-31.6h-1.3l-29.6 30.3z" fill="#808080"/><path d="m376.8 580.5h.7l34.5-35.4v-.7h-.6l-34.6 35.4z" fill="#808080"/><path d="m382.5 580.5 29.5-30.3v-1.3l-30.8 31.6z" fill="#808080"/><path d="m387.5 580.5 24.5-25.2v-1.2l-25.8 26.4z" fill="#808080"/><path d="m392.5 580.5 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m397.5 580.5 14.5-14.9v-1.3l-15.7 16.2z" fill="#808080"/><path d="m402.5 580.5 9.5-9.8v-1.3l-10.7 11.1z" fill="#808080"/><path d="m407.5 580.5 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m412 580.5v-.8l-.7.8z" fill="#808080"/><path d="m412 684.1v-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-.7v.7 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.8 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7.6v-.7z" fill="#808080"/><path d="m447.3 648v-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-.8h-.8-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-.7v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.8 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7.7v-.6z" fill="#e8e7e8"/><path d="m447.3 678.8-9.5 9.8h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m422.8 652.5-10.8 11v3.9l14.6-14.9z" fill="#e8e7e8"/><path d="m412.8 652.5-.8.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m417.8 652.5-5.8 5.9v3.9l9.6-9.8z" fill="#e8e7e8"/><path d="m432.8 652.5-20.8 21.3v3.8l24.6-25.1z" fill="#e8e7e8"/><path d="m447.3 668.6-19.6 20h3.8l15.8-16.2z" fill="#e8e7e8"/><path d="m447.3 684-4.5 4.6h3.7l.8-.8z" fill="#e8e7e8"/><path d="m412 684.1v3.8l34.6-35.4h-3.7z" fill="#e8e7e8"/><path d="m447.3 673.7-14.6 14.9h3.8l10.8-11.1z" fill="#e8e7e8"/><path d="m427.8 652.5-15.8 16.2v3.8l19.6-20z" fill="#e8e7e8"/><path d="m447.3 653.2-34.6 35.4h3.7l30.9-31.6z" fill="#e8e7e8"/><path d="m447.3 663.4-24.6 25.2h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m437.9 652.5-25.9 26.4v3.9l29.6-30.3z" fill="#e8e7e8"/><path d="m447.3 658.3-29.6 30.3h3.7l25.9-26.5z" fill="#e8e7e8"/><path d="m412 652.5v.8l.8-.8z" fill="#808080"/><path d="m416.5 652.5-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m421.6 652.5-9.6 9.8v1.2l10.8-11z" fill="#808080"/><path d="m426.6 652.5-14.6 14.9v1.3l15.8-16.2z" fill="#808080"/><path d="m431.6 652.5-19.6 20v1.3l20.8-21.3z" fill="#808080"/><path d="m436.6 652.5-24.6 25.1v1.3l25.9-26.4z" fill="#808080"/><path d="m441.6 652.5-29.6 30.3v1.3l30.9-31.6z" fill="#808080"/><path d="m447.3 652.5h-.7l-34.6 35.4v.7h.7l34.6-35.4z" fill="#808080"/><path d="m447.3 657-30.9 31.6h1.3l29.6-30.3z" fill="#808080"/><path d="m447.3 662.1-25.9 26.5h1.3l24.6-25.2z" fill="#808080"/><path d="m447.3 667.3-20.8 21.3h1.2l19.6-20z" fill="#808080"/><path d="m447.3 672.4-15.8 16.2h1.2l14.6-14.9z" fill="#808080"/><path d="m447.3 677.5-10.8 11.1h1.3l9.5-9.8z" fill="#808080"/><path d="m447.3 682.7-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m446.5 688.6h.8v-.8z" fill="#808080"/><path d="m412 642.8-9.5 9.7h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m397.6 616.5-20.8 21.3v3.8l24.6-25.1z" fill="#e8e7e8"/><path d="m377.6 616.5-.8.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m412 617.1-34.5 35.4h3.7l30.8-31.5z" fill="#e8e7e8"/><path d="m402.6 616.5-25.8 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m412 632.5-19.5 20h3.8l15.7-16.1z" fill="#e8e7e8"/><path d="m412 627.4-24.5 25.1h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m382.6 616.5-5.8 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m412 637.7-14.5 14.8h3.8l10.7-11z" fill="#e8e7e8"/><path d="m407.7 616.5-30.9 31.5v3.9l34.6-35.4z" fill="#e8e7e8"/><path d="m412 622.3-29.5 30.2h3.7l25.8-26.4z" fill="#e8e7e8"/><path d="m387.6 616.5-10.8 11v3.9l14.6-14.9z" fill="#e8e7e8"/><path d="m412 647.9-4.5 4.6h3.8l.7-.7z" fill="#e8e7e8"/><path d="m392.6 616.5-15.8 16.1v3.9l19.6-20z" fill="#e8e7e8"/><path d="m376.8 616.5v.8l.8-.8z" fill="#808080"/><path d="m381.3 616.5-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m386.3 616.5-9.5 9.7v1.3l10.8-11z" fill="#808080"/><path d="m391.4 616.5-14.6 14.9v1.2l15.8-16.1z" fill="#808080"/><path d="m396.4 616.5-19.6 20v1.3l20.8-21.3z" fill="#808080"/><path d="m401.4 616.5-24.6 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m406.4 616.5-29.6 30.2v1.3l30.9-31.5z" fill="#808080"/><path d="m412 616.5h-.6l-34.6 35.4v.6h.7l34.5-35.4z" fill="#808080"/><path d="m412 621-30.8 31.5h1.3l29.5-30.2z" fill="#808080"/><path d="m412 626.1-25.8 26.4h1.3l24.5-25.1z" fill="#808080"/><path d="m412 631.2-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m412 636.4-15.7 16.1h1.2l14.5-14.8z" fill="#808080"/><path d="m412 641.5-10.7 11h1.2l9.5-9.7z" fill="#808080"/><path d="m412 646.6-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m411.3 652.5h.7v-.7z" fill="#808080"/><path d="m412 756.1v-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-.7v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h35.2v-.6z" fill="#808080"/><path d="m447.3 720.1v-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-.7h-.8-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-.7v.6 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.8 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7.7v-.7z" fill="#e8e7e8"/><path d="m417.8 724.6-5.8 5.9v3.8l9.6-9.7z" fill="#e8e7e8"/><path d="m447.3 725.2-34.6 35.4h3.7l30.9-31.5z" fill="#e8e7e8"/><path d="m412.8 724.6-.8.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m422.8 724.6-10.8 11v3.8l14.6-14.8z" fill="#e8e7e8"/><path d="m412 756.1v3.9l34.6-35.4h-3.7z" fill="#e8e7e8"/><path d="m447.3 745.8-14.6 14.8h3.8l10.8-11z" fill="#e8e7e8"/><path d="m447.3 750.9-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m427.8 724.6-15.8 16.1v3.9l19.6-20z" fill="#e8e7e8"/><path d="m432.8 724.6-20.8 21.3v3.8l24.6-25.1z" fill="#e8e7e8"/><path d="m437.9 724.6-25.9 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m447.3 740.6-19.6 20h3.8l15.8-16.1z" fill="#e8e7e8"/><path d="m447.3 735.5-24.6 25.1h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m447.3 756-4.5 4.6h3.7l.8-.7z" fill="#e8e7e8"/><path d="m447.3 730.4-29.6 30.2h3.7l25.9-26.4z" fill="#e8e7e8"/><path d="m412 724.6v.7l.8-.7z" fill="#808080"/><path d="m416.5 724.6-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m421.6 724.6-9.6 9.7v1.3l10.8-11z" fill="#808080"/><path d="m426.6 724.6-14.6 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m431.6 724.6-19.6 20v1.3l20.8-21.3z" fill="#808080"/><path d="m436.6 724.6-24.6 25.1v1.3l25.9-26.4z" fill="#808080"/><path d="m441.6 724.6-29.6 30.2v1.3l30.9-31.5z" fill="#808080"/><path d="m447.3 724.6h-.7l-34.6 35.4v.6h.7l34.6-35.4z" fill="#808080"/><path d="m447.3 729.1-30.9 31.5h1.3l29.6-30.2z" fill="#808080"/><path d="m447.3 734.2-25.9 26.4h1.3l24.6-25.1z" fill="#808080"/><path d="m447.3 739.3-20.8 21.3h1.2l19.6-20z" fill="#808080"/><path d="m447.3 744.5-15.8 16.1h1.2l14.6-14.8z" fill="#808080"/><path d="m447.3 749.6-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m447.3 754.7-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m446.5 760.6h.8v-.7z" fill="#808080"/><path d="m412 714.9-9.5 9.7h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m412 709.7-14.5 14.9h3.8l10.7-11z" fill="#e8e7e8"/><path d="m412 704.6-19.5 20h3.8l15.7-16.2z" fill="#e8e7e8"/><path d="m412 694.3-29.5 30.3h3.7l25.8-26.4z" fill="#e8e7e8"/><path d="m377.6 688.6-.8.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m412 689.2-34.5 35.4h3.7l30.8-31.6z" fill="#e8e7e8"/><path d="m397.6 688.6-20.8 21.2v3.9l24.6-25.1z" fill="#e8e7e8"/><path d="m402.6 688.6-25.8 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m376.8 720.1v3.8l34.6-35.3h-3.7z" fill="#e8e7e8"/><path d="m382.6 688.6-5.8 5.8v3.9l9.5-9.7z" fill="#e8e7e8"/><path d="m412 720-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m387.6 688.6-10.8 11v3.8l14.6-14.8z" fill="#e8e7e8"/><path d="m412 699.5-24.5 25.1h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m392.6 688.6-15.8 16.1v3.8l19.6-19.9z" fill="#e8e7e8"/><path d="m376.8 688.6v.7l.8-.7z" fill="#808080"/><path d="m381.3 688.6-4.5 4.6v1.2l5.8-5.8z" fill="#808080"/><path d="m386.3 688.6-9.5 9.7v1.3l10.8-11z" fill="#808080"/><path d="m391.4 688.6-14.6 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m396.4 688.6-19.6 19.9v1.3l20.8-21.2z" fill="#808080"/><path d="m401.4 688.6-24.6 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m406.4 688.6-29.6 30.2v1.3l30.9-31.5z" fill="#808080"/><path d="m412 688.6h-.6l-34.6 35.3v.7h.7l34.5-35.4z" fill="#808080"/><path d="m412 693-30.8 31.6h1.3l29.5-30.3z" fill="#808080"/><path d="m412 698.2-25.8 26.4h1.3l24.5-25.1z" fill="#808080"/><path d="m412 703.3-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m412 708.4-15.7 16.2h1.2l14.5-14.9z" fill="#808080"/><path d="m412 713.6-10.7 11h1.2l9.5-9.7z" fill="#808080"/><path d="m412 718.7-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m411.3 724.6h.7v-.8z" fill="#808080"/><path d="m376.8 801.1v1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8.8h.8 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7.6v-.7-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-.7v.7z" fill="#808080"/><path d="m412 765.1v1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9.7h.8 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7.7v-.6-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-35.3v.7z" fill="#e8e7e8"/><path d="m412 806.4 9.6-9.8h-3.8l-5.8 5.9z" fill="#e8e7e8"/><path d="m412 811.5 14.6-14.9h-3.8l-10.8 11.1z" fill="#e8e7e8"/><path d="m446.5 832.7.8-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m431.5 832.7 15.8-16.2v-3.8l-19.6 20z" fill="#e8e7e8"/><path d="m441.5 832.7 5.8-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m412 801.2 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m436.5 832.7 10.8-11v-3.9l-14.6 14.9z" fill="#e8e7e8"/><path d="m412 821.8 24.6-25.2h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m412 832 34.6-35.4h-3.7l-30.9 31.6z" fill="#e8e7e8"/><path d="m421.4 832.7 25.9-26.4v-3.9l-29.6 30.3z" fill="#e8e7e8"/><path d="m447.3 801.1v-3.8l-34.6 35.4h3.7z" fill="#e8e7e8"/><path d="m426.5 832.7 20.8-21.3v-3.8l-24.6 25.1z" fill="#e8e7e8"/><path d="m412 826.9 29.6-30.3h-3.7l-25.9 26.5z" fill="#e8e7e8"/><path d="m412 816.6 19.6-20h-3.8l-15.8 16.2z" fill="#e8e7e8"/><path d="m412.8 796.6h-.8v.8z" fill="#808080"/><path d="m412 802.5 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m412 807.7 10.8-11.1h-1.2l-9.6 9.8z" fill="#808080"/><path d="m412 812.8 15.8-16.2h-1.2l-14.6 14.9z" fill="#808080"/><path d="m412 817.9 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m412 823.1 25.9-26.5h-1.3l-24.6 25.2z" fill="#808080"/><path d="m412 828.2 30.9-31.6h-1.3l-29.6 30.3z" fill="#808080"/><path d="m412 832.7h.7l34.6-35.4v-.7h-.7l-34.6 35.4z" fill="#808080"/><path d="m417.7 832.7 29.6-30.3v-1.3l-30.9 31.6z" fill="#808080"/><path d="m422.7 832.7 24.6-25.1v-1.3l-25.9 26.4z" fill="#808080"/><path d="m427.7 832.7 19.6-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m432.7 832.7 14.6-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m437.8 832.7 9.5-9.8v-1.2l-10.8 11z" fill="#808080"/><path d="m442.8 832.7 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m447.3 832.7v-.8l-.8.8z" fill="#808080"/><path d="m376.8 790.9 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m386.2 796.6 25.8-26.4v-3.8l-29.5 30.2z" fill="#e8e7e8"/><path d="m412 765.1v-3.8l-34.5 35.3h3.7z" fill="#e8e7e8"/><path d="m376.8 765.2 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m376.8 780.6 19.6-20h-3.8l-15.8 16.2z" fill="#e8e7e8"/><path d="m376.8 796 34.6-35.4h-3.7l-30.9 31.6z" fill="#e8e7e8"/><path d="m376.8 785.7 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m406.3 796.6 5.7-5.8v-3.9l-9.5 9.7z" fill="#e8e7e8"/><path d="m396.3 796.6 15.7-16.1v-3.8l-19.5 19.9z" fill="#e8e7e8"/><path d="m411.3 796.6.7-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m401.3 796.6 10.7-11v-3.8l-14.5 14.8z" fill="#e8e7e8"/><path d="m376.8 770.3 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m391.2 796.6 20.8-21.2v-3.9l-24.5 25.1z" fill="#e8e7e8"/><path d="m376.8 775.5 14.6-14.9h-3.8l-10.8 11z" fill="#e8e7e8"/><path d="m377.6 760.6h-.8v.8z" fill="#808080"/><path d="m376.8 766.5 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m376.8 771.6 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m376.8 776.8 15.8-16.2h-1.2l-14.6 14.9z" fill="#808080"/><path d="m376.8 781.9 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m376.8 787 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m376.8 792.2 30.9-31.6h-1.3l-29.6 30.3z" fill="#808080"/><path d="m376.8 796.6h.7l34.5-35.3v-.7h-.6l-34.6 35.4z" fill="#808080"/><path d="m382.5 796.6 29.5-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m387.5 796.6 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m392.5 796.6 19.5-19.9v-1.3l-20.8 21.2z" fill="#808080"/><path d="m397.5 796.6 14.5-14.8v-1.3l-15.7 16.1z" fill="#808080"/><path d="m402.5 796.6 9.5-9.7v-1.3l-10.7 11z" fill="#808080"/><path d="m407.5 796.6 4.5-4.6v-1.2l-5.7 5.8z" fill="#808080"/><path d="m412 796.6v-.7l-.7.7z" fill="#808080"/><path d="m381.3 904.7h1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7.6v-.6-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-.7v.7 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.8z" fill="#808080"/><path d="m412 837.2v1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8.8h.8 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7.7v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.8-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-.7v.6z" fill="#e8e7e8"/><path d="m447.3 884.7-19.6 20h3.8l15.8-16.1z" fill="#e8e7e8"/><path d="m447.3 900.1-4.5 4.6h3.7l.8-.7z" fill="#e8e7e8"/><path d="m412.8 868.7-.8.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m447.3 889.9-14.6 14.8h3.8l10.8-11z" fill="#e8e7e8"/><path d="m447.3 895-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m427.8 868.7-15.8 16.2v3.8l19.6-20z" fill="#e8e7e8"/><path d="m442.9 868.7-30.9 31.5v3.9l34.6-35.4z" fill="#e8e7e8"/><path d="m422.8 868.7-10.8 11v3.9l14.6-14.9z" fill="#e8e7e8"/><path d="m432.8 868.7-20.8 21.3v3.8l24.6-25.1z" fill="#e8e7e8"/><path d="m417.8 868.7-5.8 5.9v3.8l9.6-9.7z" fill="#e8e7e8"/><path d="m437.9 868.7-25.9 26.4v3.9l29.6-30.3z" fill="#e8e7e8"/><path d="m447.3 869.4-34.6 35.3h3.7l30.9-31.5z" fill="#e8e7e8"/><path d="m447.3 874.5-29.6 30.2h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m447.3 879.6-24.6 25.1h3.8l20.8-21.2z" fill="#e8e7e8"/><path d="m412 868.7v.8l.8-.8z" fill="#808080"/><path d="m416.5 868.7-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m421.6 868.7-9.6 9.7v1.3l10.8-11z" fill="#808080"/><path d="m426.6 868.7-14.6 14.9v1.3l15.8-16.2z" fill="#808080"/><path d="m431.6 868.7-19.6 20v1.3l20.8-21.3z" fill="#808080"/><path d="m436.6 868.7-24.6 25.1v1.3l25.9-26.4z" fill="#808080"/><path d="m441.6 868.7-29.6 30.3v1.2l30.9-31.5z" fill="#808080"/><path d="m447.3 868.7h-.7l-34.6 35.4v.6h.7l34.6-35.3z" fill="#808080"/><path d="m447.3 873.2-30.9 31.5h1.3l29.6-30.2z" fill="#808080"/><path d="m447.3 878.3-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m447.3 883.5-20.8 21.2h1.2l19.6-20z" fill="#808080"/><path d="m447.3 888.6-15.8 16.1h1.2l14.6-14.8z" fill="#808080"/><path d="m447.3 893.7-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m447.3 898.8-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m446.5 904.7h.8v-.7z" fill="#808080"/><path d="m412 853.8-14.5 14.9h3.8l10.7-11z" fill="#e8e7e8"/><path d="m412 838.5-29.5 30.2h3.7l25.8-26.4z" fill="#e8e7e8"/><path d="m376.8 868.1 34.6-35.4h-3.7l-30.9 31.5z" fill="#e8e7e8"/><path d="m412 864.1-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m412 848.7-19.5 20h3.8l15.7-16.1z" fill="#e8e7e8"/><path d="m412 843.6-24.5 25.1h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m376.8 847.5 14.6-14.8h-3.8l-10.8 11z" fill="#e8e7e8"/><path d="m376.8 837.3 4.5-4.6h-3.7l-.8.7z" fill="#e8e7e8"/><path d="m376.8 842.4 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m412 859-9.5 9.7h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m376.8 852.7 19.6-20h-3.8l-15.8 16.1z" fill="#e8e7e8"/><path d="m376.8 857.8 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m376.8 862.9 29.6-30.2h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m412 833.3-34.5 35.4h3.7l30.8-31.5z" fill="#e8e7e8"/><path d="m377.6 832.7h-.8v.7z" fill="#808080"/><path d="m376.8 838.6 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m376.8 843.7 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m376.8 848.8 15.8-16.1h-1.2l-14.6 14.8z" fill="#808080"/><path d="m376.8 854 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m376.8 859.1 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m376.8 864.2 30.9-31.5h-1.3l-29.6 30.2z" fill="#808080"/><path d="m376.8 868.7h.7l34.5-35.4v-.6h-.6l-34.6 35.4z" fill="#808080"/><path d="m412 837.2-30.8 31.5h1.3l29.5-30.2z" fill="#808080"/><path d="m412 842.3-25.8 26.4h1.3l24.5-25.1z" fill="#808080"/><path d="m412 847.4-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m412 852.6-15.7 16.1h1.2l14.5-14.9z" fill="#808080"/><path d="m412 857.7-10.7 11h1.2l9.5-9.7z" fill="#808080"/><path d="m412 862.8-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m411.3 868.7h.7v-.8z" fill="#808080"/><path d="m412 972.3v-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-.7v.6 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.8 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7.6v-.7z" fill="#808080"/><path d="m447.3 936.3v-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.8-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-.7v.7 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.8 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7.7v-.7z" fill="#e8e7e8"/><path d="m447.3 946.5-29.6 30.3h3.7l25.9-26.4z" fill="#e8e7e8"/><path d="m447.3 941.4-34.6 35.4h3.7l30.9-31.6z" fill="#e8e7e8"/><path d="m447.3 967.1-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m447.3 972.2-4.5 4.6h3.7l.8-.8z" fill="#e8e7e8"/><path d="m447.3 951.7-24.6 25.1h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m447.3 961.9-14.6 14.9h3.8l10.8-11z" fill="#e8e7e8"/><path d="m447.3 956.8-19.6 20h3.8l15.8-16.2z" fill="#e8e7e8"/><path d="m427.8 940.8-15.8 16.1v3.9l19.6-20z" fill="#e8e7e8"/><path d="m437.9 940.8-25.9 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m422.8 940.8-10.8 11v3.8l14.6-14.8z" fill="#e8e7e8"/><path d="m432.8 940.8-20.8 21.2v3.9l24.6-25.1z" fill="#e8e7e8"/><path d="m412 972.3v3.8l34.6-35.3h-3.7z" fill="#e8e7e8"/><path d="m417.8 940.8-5.8 5.9v3.8l9.6-9.7z" fill="#e8e7e8"/><path d="m412.8 940.8-.8.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m412 940.8v.7l.8-.7z" fill="#808080"/><path d="m416.5 940.8-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m421.6 940.8-9.6 9.7v1.3l10.8-11z" fill="#808080"/><path d="m426.6 940.8-14.6 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m431.6 940.8-19.6 20v1.2l20.8-21.2z" fill="#808080"/><path d="m436.6 940.8-24.6 25.1v1.3l25.9-26.4z" fill="#808080"/><path d="m441.6 940.8-29.6 30.2v1.3l30.9-31.5z" fill="#808080"/><path d="m447.3 940.8h-.7l-34.6 35.3v.7h.7l34.6-35.4z" fill="#808080"/><path d="m447.3 945.2-30.9 31.6h1.3l29.6-30.3z" fill="#808080"/><path d="m447.3 950.4-25.9 26.4h1.3l24.6-25.1z" fill="#808080"/><path d="m447.3 955.5-20.8 21.3h1.2l19.6-20z" fill="#808080"/><path d="m447.3 960.6-15.8 16.2h1.2l14.6-14.9z" fill="#808080"/><path d="m447.3 965.8-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m447.3 970.9-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m446.5 976.8h.8v-.8z" fill="#808080"/><path d="m412 936.2-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m412 931-9.5 9.8h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m412 910.5-29.5 30.3h3.7l25.8-26.5z" fill="#e8e7e8"/><path d="m412 925.9-14.5 14.9h3.8l10.7-11.1z" fill="#e8e7e8"/><path d="m412 920.8-19.5 20h3.8l15.7-16.2z" fill="#e8e7e8"/><path d="m412 915.6-24.5 25.2h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m412 905.4-34.5 35.4h3.7l30.8-31.6z" fill="#e8e7e8"/><path d="m381.3 904.7h-3.7l-.8.8v3.8z" fill="#e8e7e8"/><path d="m411.4 904.7h-3.7l-30.9 31.6v3.8z" fill="#e8e7e8"/><path d="m396.4 904.7h-3.8l-15.8 16.2v3.8z" fill="#e8e7e8"/><path d="m401.4 904.7h-3.8l-20.8 21.3v3.9z" fill="#e8e7e8"/><path d="m406.4 904.7h-3.8l-25.8 26.4v3.9z" fill="#e8e7e8"/><path d="m391.4 904.7h-3.8l-10.8 11.1v3.8z" fill="#e8e7e8"/><path d="m386.3 904.7h-3.7l-5.8 5.9v3.9z" fill="#e8e7e8"/><path d="m377.6 904.7h-.8v.8z" fill="#808080"/><path d="m382.6 904.7h-1.3l-4.5 4.6v1.3z" fill="#808080"/><path d="m387.6 904.7h-1.3l-9.5 9.8v1.3z" fill="#808080"/><path d="m392.6 904.7h-1.2l-14.6 14.9v1.3z" fill="#808080"/><path d="m397.6 904.7h-1.2l-19.6 20v1.3z" fill="#808080"/><path d="m402.6 904.7h-1.2l-24.6 25.2v1.2z" fill="#808080"/><path d="m407.7 904.7h-1.3l-29.6 30.3v1.3z" fill="#808080"/><path d="m412 904.7h-.6l-34.6 35.4v.7h.7l34.5-35.4z" fill="#808080"/><path d="m412 909.2-30.8 31.6h1.3l29.5-30.3z" fill="#808080"/><path d="m412 914.3-25.8 26.5h1.3l24.5-25.2z" fill="#808080"/><path d="m412 919.5-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m412 924.6-15.7 16.2h1.2l14.5-14.9z" fill="#808080"/><path d="m412 929.7-10.7 11.1h1.2l9.5-9.8z" fill="#808080"/><path d="m412 934.9-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m411.3 940.8h.7v-.8z" fill="#808080"/><path d="m447.3 986.5v-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.2v.6 3.8 1.3 3.8.4c17.5.9 30.7 1.3 35.2 1.5v-.4-1.3z" fill="#e8e7e8"/><path d="m377.6 976.8-.8.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m412 977.4-8.7 8.9c1.2.1 2.4.1 3.6.2l5.1-5.2z" fill="#e8e7e8"/><path d="m397.6 976.8-8.4 8.6c1.2.1 2.4.2 3.5.2l8.7-8.9h-3.8z" fill="#e8e7e8"/><path d="m412 982.6-3.9 4c1.2.1 2.4.1 3.6.2l.3-.3z" fill="#e8e7e8"/><path d="m402.6 976.8-8.7 8.9c1.2.1 2.4.1 3.5.2l8.9-9.2h-3.7z" fill="#e8e7e8"/><path d="m407.7 976.8-9 9.2c1.2.1 2.4.1 3.5.2l9.2-9.4z" fill="#e8e7e8"/><path d="m392.6 976.8-8.1 8.3c1.2.1 2.4.2 3.5.2l8.4-8.5z" fill="#e8e7e8"/><path d="m387.6 976.8-7.8 8c1.2.1 2.3.2 3.5.2l8-8.2z" fill="#e8e7e8"/><path d="m382.6 976.8-5.8 5.9v1.9c.6 0 1.2.1 1.8.1l7.7-7.9z" fill="#e8e7e8"/><path d="m376.8 976.8v.8l.8-.8z" fill="#808080"/><path d="m376.8 981.4v1.3l5.8-5.9h-1.3z" fill="#808080"/><path d="m386.3 976.8-7.7 7.9c.4 0 .8.1 1.2.1l7.8-8z" fill="#808080"/><path d="m391.4 976.8-8 8.2c.4 0 .8.1 1.2.1l8.1-8.3z" fill="#808080"/><path d="m396.4 976.8-8.4 8.5c.4 0 .8.1 1.2.1l8.4-8.6z" fill="#808080"/><path d="m401.4 976.8-8.7 8.9c.4 0 .8.1 1.2.1l8.7-8.9h-1.2z" fill="#808080"/><path d="m406.4 976.8-8.9 9.2c.4 0 .8 0 1.2.1l9-9.2h-1.3z" fill="#808080"/><path d="m412 976.8h-.6l-9.2 9.4c.4 0 .8 0 1.2.1l8.7-8.9v-.6z" fill="#808080"/><path d="m412 981.3-5.1 5.2c.4 0 .8 0 1.2.1l3.9-4z" fill="#808080"/><path d="m411.7 986.7h.3v-.4z" fill="#808080"/><path d="m332.1 436.3h-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.5-1.3-3.7-.6v.6 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.6v-.6-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-2.7c-1.9-.6-3.7-1.3-5.6-1.9h-.2z" fill="#808080"/><path d="m371.1 472.4 5.7-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m341.6 466.6 22-22.5c-1-.2-2.1-.5-3.1-.7l-18.9 19.3z" fill="#e8e7e8"/><path d="m341.6 471.7 26.1-26.7c-1.1-.2-2.1-.4-3.1-.6l-23 23.5z" fill="#e8e7e8"/><path d="m341.6 461.5 17.8-18.3c-1-.2-2-.5-3-.7l-14.8 15.1z" fill="#e8e7e8"/><path d="m376.1 472.4.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m346 472.4 26-26.6c-1.1-.2-2.1-.4-3.2-.6l-26.6 27.2z" fill="#e8e7e8"/><path d="m351 472.4 25.3-25.9c-1.1-.2-2.2-.4-3.2-.5l-25.8 26.4z" fill="#e8e7e8"/><path d="m341.6 456.3 13.8-14.1c-1-.3-2-.5-3-.8l-10.8 11z" fill="#e8e7e8"/><path d="m361 472.4 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m366.1 472.4 10.7-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m376.8 451.1v-3.8l-24.5 25.1h3.7z" fill="#e8e7e8"/><path d="m341.6 446.1 5.9-6c-1-.3-1.9-.6-2.9-.9l-3 3z" fill="#e8e7e8"/><path d="m341.6 451.2 9.8-10c-1-.3-2-.5-2.9-.8l-6.9 7z" fill="#e8e7e8"/><path d="m343.6 438.9c-.7-.2-1.3-.4-2-.6v2.7z" fill="#e8e7e8"/><path d="m341.6 442.2 3-3c-.3-.1-.6-.2-1-.3l-2 2z" fill="#808080"/><path d="m341.6 447.4 6.9-7c-.3-.1-.7-.2-1-.3l-5.9 6z" fill="#808080"/><path d="m341.6 452.5 10.8-11c-.3-.1-.7-.2-1-.3l-9.8 10z" fill="#808080"/><path d="m341.6 457.6 14.8-15.1c-.3-.1-.7-.2-1-.2l-13.8 14.1z" fill="#808080"/><path d="m341.6 462.8 18.9-19.3c-.3-.1-.7-.2-1-.2l-17.8 18.3v1.2z" fill="#808080"/><path d="m341.6 467.9 23-23.5c-.3-.1-.7-.1-1-.2l-22 22.5z" fill="#808080"/><path d="m341.6 472.4h.6l26.6-27.2c-.4-.1-.7-.1-1.1-.2l-26.1 26.7z" fill="#808080"/><path d="m347.3 472.4 25.8-26.4c-.4-.1-.7-.1-1.1-.2l-26 26.6z" fill="#808080"/><path d="m352.3 472.4 24.6-25.1v-.6c-.2 0-.4-.1-.5-.1l-25.4 25.8z" fill="#808080"/><path d="m357.3 472.4 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m362.3 472.4 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m367.3 472.4 9.5-9.8v-1.2l-10.7 11z" fill="#808080"/><path d="m372.3 472.4 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m376.8 472.4v-.8l-.7.8z" fill="#808080"/><path d="m310.5 431.5c-1.4.2-2.7.4-4.1.6v3.6z" fill="#e8e7e8"/><path d="m335.9 436.3c-.9-.4-1.8-.7-2.7-1.1l-1.1 1.1z" fill="#e8e7e8"/><path d="m330.8 436.3 1.4-1.4c-.9-.4-1.8-.7-2.7-1.1l-2.5 2.5z" fill="#e8e7e8"/><path d="m320.8 436.3 4.3-4.4c-.9-.4-1.7-.8-2.6-1.2l-5.5 5.6z" fill="#e8e7e8"/><path d="m315.8 436.3 5.9-6c-.3-.1-.6-.3-.9-.4-1 .2-2 .3-3 .5l-5.8 6h3.8z" fill="#e8e7e8"/><path d="m310.8 436.3 5.6-5.7c-1.5.2-2.9.5-4.4.7l-4.9 5.1h3.7z" fill="#e8e7e8"/><path d="m325.8 436.3 2.8-2.9c-.9-.4-1.8-.7-2.6-1.1l-3.9 4z" fill="#e8e7e8"/><path d="m306.4 436.3h.6l4.9-5.1c-.5.1-1 .1-1.5.2l-4.1 4.2v.7z" fill="#808080"/><path d="m312 436.3 5.8-6c-.5.1-1 .2-1.5.2l-5.6 5.7h1.3z" fill="#808080"/><path d="m317.1 436.3 5.5-5.6c-.3-.1-.6-.3-.8-.4l-5.9 6z" fill="#808080"/><path d="m322.1 436.3 3.9-4c-.3-.1-.6-.3-.9-.4l-4.3 4.4z" fill="#808080"/><path d="m327.1 436.3 2.5-2.5c-.3-.1-.6-.3-.9-.4l-2.8 2.9z" fill="#808080"/><path d="m332.1 436.3 1.1-1.1c-.3-.1-.6-.2-.9-.4l-1.4 1.4h1.2z" fill="#808080"/><path d="m336.1 436.3c-.1 0-.1 0-.2-.1l-.1.1z" fill="#808080"/><path d="m306.4 512.9v1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.7 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.6-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.7z" fill="#808080"/><path d="m341.6 476.9v1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8.8h.8 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6v.6z" fill="#e8e7e8"/><path d="m366.1 544.4 10.7-11v-3.8l-14.5 14.8z" fill="#e8e7e8"/><path d="m361 544.4 15.8-16.1v-3.9l-19.5 20z" fill="#e8e7e8"/><path d="m341.6 518.1 9.5-9.7h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m341.6 533.5 24.6-25.1h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m376.8 512.9v-3.8l-34.6 35.3h3.8z" fill="#e8e7e8"/><path d="m341.6 538.7 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m341.6 528.4 19.6-20h-3.8l-15.8 16.2z" fill="#e8e7e8"/><path d="m341.6 513 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m341.6 523.3 14.5-14.9h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m371.1 544.4 5.7-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m356 544.4 20.8-21.2v-3.9l-24.5 25.1z" fill="#e8e7e8"/><path d="m351 544.4 25.8-26.4v-3.8l-29.5 30.2z" fill="#e8e7e8"/><path d="m376.1 544.4.7-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m341.6 543.8 34.6-35.4h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m342.4 508.4h-.8v.8z" fill="#808080"/><path d="m341.6 514.3 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m341.6 519.4 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m341.6 524.6 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m341.6 529.7 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m341.6 534.8 25.8-26.4h-1.2l-24.6 25.1z" fill="#808080"/><path d="m341.6 539.9 30.8-31.5h-1.2l-29.6 30.3z" fill="#808080"/><path d="m341.6 544.4h.6l34.6-35.3v-.7h-.6l-34.6 35.4z" fill="#808080"/><path d="m347.3 544.4 29.5-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m352.3 544.4 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m357.3 544.4 19.5-20v-1.2l-20.8 21.2z" fill="#808080"/><path d="m362.3 544.4 14.5-14.8v-1.3l-15.8 16.1z" fill="#808080"/><path d="m367.3 544.4 9.5-9.7v-1.3l-10.7 11z" fill="#808080"/><path d="m372.3 544.4 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m376.8 544.4v-.7l-.7.7z" fill="#808080"/><path d="m306.4 492.4 19.5-20h-3.7l-15.8 16.1z" fill="#e8e7e8"/><path d="m306.4 507.8 34.6-35.4h-3.8l-30.8 31.5z" fill="#e8e7e8"/><path d="m306.4 502.6 29.6-30.2h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m306.4 497.5 24.5-25.1h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m306.4 482.1 9.5-9.7h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m306.4 487.2 14.5-14.8h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m320.8 508.4 20.8-21.3v-3.8l-24.5 25.1z" fill="#e8e7e8"/><path d="m315.8 508.4 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m330.8 508.4 10.8-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m335.9 508.4 5.7-5.9v-3.8l-9.5 9.7z" fill="#e8e7e8"/><path d="m340.9 508.4.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m325.8 508.4 15.8-16.1v-3.9l-19.5 20z" fill="#e8e7e8"/><path d="m306.4 477 4.5-4.6h-3.8l-.7.7z" fill="#e8e7e8"/><path d="m341.6 476.9v-3.9l-34.6 35.4h3.8z" fill="#e8e7e8"/><path d="m307.1 472.4h-.7v.7z" fill="#808080"/><path d="m306.4 478.3 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m306.4 483.4 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m306.4 488.5 15.8-16.1h-1.3l-14.5 14.8z" fill="#808080"/><path d="m306.4 493.7 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m306.4 498.8 25.8-26.4h-1.3l-24.5 25.1z" fill="#808080"/><path d="m306.4 503.9 30.8-31.5h-1.2l-29.6 30.2z" fill="#808080"/><path d="m306.4 508.4h.6l34.6-35.4v-.6h-.6l-34.6 35.4z" fill="#808080"/><path d="m312 508.4 29.6-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m317.1 508.4 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m322.1 508.4 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m327.1 508.4 14.5-14.9v-1.2l-15.8 16.1z" fill="#808080"/><path d="m332.1 508.4 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m337.1 508.4 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m341.6 508.4v-.8l-.7.8z" fill="#808080"/><path d="m310.9 616.5h1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.6-3.9-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.6 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.7z" fill="#808080"/><path d="m346.1 580.5h1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.7-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6v.7 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.8z" fill="#e8e7e8"/><path d="m376.8 611.9-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m376.8 581.1-34.6 35.4h3.8l30.8-31.5z" fill="#e8e7e8"/><path d="m352.4 580.5-10.8 11v3.8l14.5-14.8z" fill="#e8e7e8"/><path d="m347.4 580.5-5.8 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m342.4 580.5-.8.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m372.4 580.5-30.8 31.5v3.9l34.6-35.4z" fill="#e8e7e8"/><path d="m367.4 580.5-25.8 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m357.4 580.5-15.8 16.1v3.9l19.6-20z" fill="#e8e7e8"/><path d="m376.8 586.2-29.5 30.3h3.7l25.8-26.4z" fill="#e8e7e8"/><path d="m376.8 601.6-14.5 14.9h3.8l10.7-11z" fill="#e8e7e8"/><path d="m376.8 596.5-19.5 20h3.7l15.8-16.2z" fill="#e8e7e8"/><path d="m376.8 606.8-9.5 9.7h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m362.4 580.5-20.8 21.2v3.9l24.6-25.1z" fill="#e8e7e8"/><path d="m376.8 591.4-24.5 25.1h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m341.6 580.5v.7l.8-.7z" fill="#808080"/><path d="m346.1 580.5-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m351.1 580.5-9.5 9.7v1.3l10.8-11z" fill="#808080"/><path d="m356.1 580.5-14.5 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m361.2 580.5-19.6 20v1.2l20.8-21.2z" fill="#808080"/><path d="m366.2 580.5-24.6 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m371.2 580.5-29.6 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m376.8 581.1v-.6h-.6l-34.6 35.4v.6h.6z" fill="#808080"/><path d="m376.8 585-30.8 31.5h1.3l29.5-30.3z" fill="#808080"/><path d="m376.8 590.1-25.8 26.4h1.3l24.5-25.1z" fill="#808080"/><path d="m376.8 595.2-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m376.8 600.3-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m376.8 605.5-10.7 11h1.2l9.5-9.7z" fill="#808080"/><path d="m376.8 610.6-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m376.1 616.5h.7v-.8z" fill="#808080"/><path d="m341.6 570.7-9.5 9.8h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m307.1 544.4-.7.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m322.2 544.4-15.8 16.2v3.8l19.5-20z" fill="#e8e7e8"/><path d="m312.1 544.4-5.7 5.9v3.9l9.5-9.8z" fill="#e8e7e8"/><path d="m317.2 544.4-10.8 11.1v3.8l14.5-14.9z" fill="#e8e7e8"/><path d="m341.6 575.9-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m341.6 550.2-29.6 30.3h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m327.2 544.4-20.8 21.3v3.9l24.5-25.2z" fill="#e8e7e8"/><path d="m341.6 545.1-34.6 35.4h3.8l30.8-31.6z" fill="#e8e7e8"/><path d="m341.6 555.3-24.5 25.2h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m341.6 560.5-19.5 20h3.7l15.8-16.2z" fill="#e8e7e8"/><path d="m332.2 544.4-25.8 26.4v3.9l29.6-30.3z" fill="#e8e7e8"/><path d="m341.6 565.6-14.5 14.9h3.7l10.8-11.1z" fill="#e8e7e8"/><path d="m337.2 544.4-30.8 31.6v3.8l34.6-35.4z" fill="#e8e7e8"/><path d="m306.4 544.4v.8l.7-.8z" fill="#808080"/><path d="m310.9 544.4-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m315.9 544.4-9.5 9.8v1.3l10.8-11.1z" fill="#808080"/><path d="m320.9 544.4-14.5 14.9v1.3l15.8-16.2z" fill="#808080"/><path d="m325.9 544.4-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m330.9 544.4-24.5 25.2v1.2l25.8-26.4z" fill="#808080"/><path d="m336 544.4-29.6 30.3v1.3l30.8-31.6z" fill="#808080"/><path d="m341.6 544.4h-.6l-34.6 35.4v.7h.6l34.6-35.4z" fill="#808080"/><path d="m341.6 548.9-30.8 31.6h1.2l29.6-30.3z" fill="#808080"/><path d="m341.6 554.1-25.8 26.4h1.3l24.5-25.2z" fill="#808080"/><path d="m341.6 559.2-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m341.6 564.3-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m341.6 569.4-10.8 11.1h1.3l9.5-9.8z" fill="#808080"/><path d="m341.6 574.6-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m340.9 580.5h.7v-.8z" fill="#808080"/><path d="m310.9 688.6h1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.7-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.7 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.7z" fill="#808080"/><path d="m346.1 652.5h1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.8z" fill="#e8e7e8"/><path d="m352.4 652.5-10.8 11v3.9l14.5-14.9z" fill="#e8e7e8"/><path d="m347.4 652.5-5.8 5.9v3.9l9.5-9.8z" fill="#e8e7e8"/><path d="m342.4 652.5-.8.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m357.4 652.5-15.8 16.2v3.8l19.6-20z" fill="#e8e7e8"/><path d="m376.8 678.8-9.5 9.8h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m376.8 653.2-34.6 35.4h3.8l30.8-31.6z" fill="#e8e7e8"/><path d="m376.8 684-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m376.8 658.3-29.5 30.3h3.7l25.8-26.5z" fill="#e8e7e8"/><path d="m376.8 668.6-19.5 20h3.7l15.8-16.2z" fill="#e8e7e8"/><path d="m372.4 652.5-30.8 31.6v3.8l34.6-35.4z" fill="#e8e7e8"/><path d="m367.4 652.5-25.8 26.4v3.9l29.6-30.3z" fill="#e8e7e8"/><path d="m362.4 652.5-20.8 21.3v3.8l24.6-25.1z" fill="#e8e7e8"/><path d="m376.8 663.4-24.5 25.2h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m376.8 673.7-14.5 14.9h3.8l10.7-11.1z" fill="#e8e7e8"/><path d="m341.6 652.5v.8l.8-.8z" fill="#808080"/><path d="m346.1 652.5-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m351.1 652.5-9.5 9.8v1.2l10.8-11z" fill="#808080"/><path d="m356.1 652.5-14.5 14.9v1.3l15.8-16.2z" fill="#808080"/><path d="m361.2 652.5-19.6 20v1.3l20.8-21.3z" fill="#808080"/><path d="m366.2 652.5-24.6 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m371.2 652.5-29.6 30.3v1.3l30.8-31.6z" fill="#808080"/><path d="m376.8 652.5h-.6l-34.6 35.4v.7h.6l34.6-35.4z" fill="#808080"/><path d="m376.8 657-30.8 31.6h1.3l29.5-30.3z" fill="#808080"/><path d="m376.8 662.1-25.8 26.5h1.3l24.5-25.2z" fill="#808080"/><path d="m376.8 667.3-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m376.8 672.4-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m376.8 677.5-10.7 11.1h1.2l9.5-9.8z" fill="#808080"/><path d="m376.8 682.7-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m376.1 688.6h.7v-.8z" fill="#808080"/><path d="m341.6 632.5-19.5 20h3.7l15.8-16.1z" fill="#e8e7e8"/><path d="m341.6 617.1-34.6 35.4h3.8l30.8-31.5z" fill="#e8e7e8"/><path d="m307.1 616.5-.7.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m341.6 622.3-29.6 30.2h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m312.1 616.5-5.7 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m341.6 647.9-4.5 4.6h3.8l.7-.7z" fill="#e8e7e8"/><path d="m341.6 642.8-9.5 9.7h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m341.6 627.4-24.5 25.1h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m341.6 637.7-14.5 14.8h3.7l10.8-11z" fill="#e8e7e8"/><path d="m317.2 616.5-10.8 11v3.9l14.5-14.9z" fill="#e8e7e8"/><path d="m332.2 616.5-25.8 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m337.2 616.5-30.8 31.5v3.9l34.6-35.4z" fill="#e8e7e8"/><path d="m322.2 616.5-15.8 16.1v3.9l19.5-20z" fill="#e8e7e8"/><path d="m327.2 616.5-20.8 21.3v3.8l24.5-25.1z" fill="#e8e7e8"/><path d="m306.4 616.5v.8l.7-.8z" fill="#808080"/><path d="m310.9 616.5-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m315.9 616.5-9.5 9.7v1.3l10.8-11z" fill="#808080"/><path d="m320.9 616.5-14.5 14.9v1.2l15.8-16.1z" fill="#808080"/><path d="m325.9 616.5-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m330.9 616.5-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m336 616.5-29.6 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m341.6 617.1v-.6h-.6l-34.6 35.4v.6h.6z" fill="#808080"/><path d="m341.6 621-30.8 31.5h1.2l29.6-30.2z" fill="#808080"/><path d="m341.6 626.1-25.8 26.4h1.3l24.5-25.1z" fill="#808080"/><path d="m341.6 631.2-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m341.6 636.4-15.8 16.1h1.3l14.5-14.8z" fill="#808080"/><path d="m341.6 641.5-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m341.6 646.6-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m340.9 652.5h.7v-.7z" fill="#808080"/><path d="m341.6 756.1v-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h35.2v-.6z" fill="#808080"/><path d="m376.8 720.1v-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-.7h-.7-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6v.6 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.8 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.7z" fill="#e8e7e8"/><path d="m376.8 745.8-14.5 14.8h3.8l10.7-11z" fill="#e8e7e8"/><path d="m367.4 724.6-25.8 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m362.4 724.6-20.8 21.3v3.8l24.6-25.1z" fill="#e8e7e8"/><path d="m342.4 724.6-.8.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m352.4 724.6-10.8 11v3.8l14.5-14.8z" fill="#e8e7e8"/><path d="m357.4 724.6-15.8 16.1v3.9l19.6-20z" fill="#e8e7e8"/><path d="m376.8 735.5-24.5 25.1h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m376.8 740.6-19.5 20h3.7l15.8-16.1z" fill="#e8e7e8"/><path d="m347.4 724.6-5.8 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m341.6 756.1v3.9l34.6-35.4h-3.8z" fill="#e8e7e8"/><path d="m376.8 750.9-9.5 9.7h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m376.8 725.2-34.6 35.4h3.8l30.8-31.5z" fill="#e8e7e8"/><path d="m376.8 730.4-29.5 30.2h3.7l25.8-26.4z" fill="#e8e7e8"/><path d="m376.8 756-4.5 4.6h3.8l.7-.7z" fill="#e8e7e8"/><path d="m341.6 724.6v.7l.8-.7z" fill="#808080"/><path d="m346.1 724.6-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m351.1 724.6-9.5 9.7v1.3l10.8-11z" fill="#808080"/><path d="m356.1 724.6-14.5 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m361.2 724.6-19.6 20v1.3l20.8-21.3z" fill="#808080"/><path d="m366.2 724.6-24.6 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m371.2 724.6-29.6 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m376.8 724.6h-.6l-34.6 35.4v.6h.6l34.6-35.4z" fill="#808080"/><path d="m376.8 729.1-30.8 31.5h1.3l29.5-30.2z" fill="#808080"/><path d="m376.8 734.2-25.8 26.4h1.3l24.5-25.1z" fill="#808080"/><path d="m376.8 739.3-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m376.8 744.5-15.8 16.1h1.3l14.5-14.8z" fill="#808080"/><path d="m376.8 749.6-10.7 11h1.2l9.5-9.7z" fill="#808080"/><path d="m376.8 754.7-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m376.1 760.6h.7v-.7z" fill="#808080"/><path d="m307.1 688.6-.7.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m312.1 688.6-5.7 5.8v3.9l9.5-9.7z" fill="#e8e7e8"/><path d="m322.2 688.6-15.8 16.1v3.8l19.5-19.9z" fill="#e8e7e8"/><path d="m317.2 688.6-10.8 11v3.8l14.5-14.8z" fill="#e8e7e8"/><path d="m341.6 699.5-24.5 25.1h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m341.6 694.3-29.6 30.3h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m327.2 688.6-20.8 21.2v3.9l24.5-25.1z" fill="#e8e7e8"/><path d="m341.6 709.7-14.5 14.9h3.7l10.8-11z" fill="#e8e7e8"/><path d="m332.2 688.6-25.8 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m337.2 688.6-30.8 31.5v3.8l34.6-35.3z" fill="#e8e7e8"/><path d="m341.6 720-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m341.6 704.6-19.5 20h3.7l15.8-16.2z" fill="#e8e7e8"/><path d="m341.6 689.2-34.6 35.4h3.8l30.8-31.6z" fill="#e8e7e8"/><path d="m341.6 714.9-9.5 9.7h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m306.4 688.6v.7l.7-.7z" fill="#808080"/><path d="m310.9 688.6-4.5 4.6v1.2l5.7-5.8z" fill="#808080"/><path d="m315.9 688.6-9.5 9.7v1.3l10.8-11z" fill="#808080"/><path d="m320.9 688.6-14.5 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m325.9 688.6-19.5 19.9v1.3l20.8-21.2z" fill="#808080"/><path d="m330.9 688.6-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m336 688.6-29.6 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m341.6 688.6h-.6l-34.6 35.3v.7h.6l34.6-35.4z" fill="#808080"/><path d="m341.6 693-30.8 31.6h1.2l29.6-30.3z" fill="#808080"/><path d="m341.6 698.2-25.8 26.4h1.3l24.5-25.1z" fill="#808080"/><path d="m341.6 703.3-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m341.6 708.4-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m341.6 713.6-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m341.6 718.7-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m340.9 724.6h.7v-.8z" fill="#808080"/><path d="m306.4 801.1v1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8.8h.7 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.7-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.7z" fill="#808080"/><path d="m341.6 765.1v1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9.7h.8 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.6-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-35.2v.7z" fill="#e8e7e8"/><path d="m341.6 816.6 19.6-20h-3.8l-15.8 16.2z" fill="#e8e7e8"/><path d="m341.6 806.4 9.5-9.8h-3.7l-5.8 5.9z" fill="#e8e7e8"/><path d="m356 832.7 20.8-21.3v-3.8l-24.5 25.1z" fill="#e8e7e8"/><path d="m341.6 811.5 14.5-14.9h-3.7l-10.8 11.1z" fill="#e8e7e8"/><path d="m371.1 832.7 5.7-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m366.1 832.7 10.7-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m341.6 832 34.6-35.4h-3.8l-30.8 31.6z" fill="#e8e7e8"/><path d="m361 832.7 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m351 832.7 25.8-26.4v-3.9l-29.5 30.3z" fill="#e8e7e8"/><path d="m341.6 801.2 4.5-4.6h-3.7l-.8.8z" fill="#e8e7e8"/><path d="m376.8 801.1v-3.8l-34.6 35.4h3.8z" fill="#e8e7e8"/><path d="m376.1 832.7.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m341.6 821.8 24.6-25.2h-3.8l-20.8 21.3z" fill="#e8e7e8"/><path d="m341.6 826.9 29.6-30.3h-3.8l-25.8 26.5z" fill="#e8e7e8"/><path d="m342.4 796.6h-.8v.8z" fill="#808080"/><path d="m341.6 802.5 5.8-5.9h-1.3l-4.5 4.6z" fill="#808080"/><path d="m341.6 807.7 10.8-11.1h-1.3l-9.5 9.8z" fill="#808080"/><path d="m341.6 812.8 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m341.6 817.9 20.8-21.3h-1.2l-19.6 20z" fill="#808080"/><path d="m341.6 823.1 25.8-26.5h-1.2l-24.6 25.2z" fill="#808080"/><path d="m341.6 828.2 30.8-31.6h-1.2l-29.6 30.3z" fill="#808080"/><path d="m341.6 832.7h.6l34.6-35.4v-.7h-.6l-34.6 35.4z" fill="#808080"/><path d="m347.3 832.7 29.5-30.3v-1.3l-30.8 31.6z" fill="#808080"/><path d="m352.3 832.7 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m357.3 832.7 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m362.3 832.7 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m367.3 832.7 9.5-9.8v-1.2l-10.7 11z" fill="#808080"/><path d="m372.3 832.7 4.5-4.6v-1.3l-5.7 5.9z" fill="#808080"/><path d="m376.8 832.7v-.8l-.7.8z" fill="#808080"/><path d="m306.4 780.6 19.5-20h-3.7l-15.8 16.2z" fill="#e8e7e8"/><path d="m306.4 765.2 4.5-4.6h-3.8l-.7.8z" fill="#e8e7e8"/><path d="m306.4 770.3 9.5-9.7h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m315.8 796.6 25.8-26.4v-3.8l-29.6 30.2z" fill="#e8e7e8"/><path d="m306.4 775.5 14.5-14.9h-3.7l-10.8 11z" fill="#e8e7e8"/><path d="m306.4 796 34.6-35.4h-3.8l-30.8 31.6z" fill="#e8e7e8"/><path d="m306.4 785.7 24.5-25.1h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m320.8 796.6 20.8-21.2v-3.9l-24.5 25.1z" fill="#e8e7e8"/><path d="m325.8 796.6 15.8-16.1v-3.8l-19.5 19.9z" fill="#e8e7e8"/><path d="m306.4 790.9 29.6-30.3h-3.8l-25.8 26.4z" fill="#e8e7e8"/><path d="m341.6 765.1v-3.8l-34.6 35.3h3.8z" fill="#e8e7e8"/><path d="m340.9 796.6.7-.7v-3.9l-4.5 4.6z" fill="#e8e7e8"/><path d="m335.9 796.6 5.7-5.8v-3.9l-9.5 9.7z" fill="#e8e7e8"/><path d="m330.8 796.6 10.8-11v-3.8l-14.5 14.8z" fill="#e8e7e8"/><path d="m307.1 760.6h-.7v.8z" fill="#808080"/><path d="m306.4 766.5 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m306.4 771.6 10.8-11h-1.3l-9.5 9.7z" fill="#808080"/><path d="m306.4 776.8 15.8-16.2h-1.3l-14.5 14.9z" fill="#808080"/><path d="m306.4 781.9 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m306.4 787 25.8-26.4h-1.3l-24.5 25.1z" fill="#808080"/><path d="m306.4 792.2 30.8-31.6h-1.2l-29.6 30.3z" fill="#808080"/><path d="m306.4 796.6h.6l34.6-35.3v-.7h-.6l-34.6 35.4z" fill="#808080"/><path d="m312 796.6 29.6-30.2v-1.3l-30.8 31.5z" fill="#808080"/><path d="m317.1 796.6 24.5-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m322.1 796.6 19.5-19.9v-1.3l-20.8 21.2z" fill="#808080"/><path d="m327.1 796.6 14.5-14.8v-1.3l-15.8 16.1z" fill="#808080"/><path d="m332.1 796.6 9.5-9.7v-1.3l-10.8 11z" fill="#808080"/><path d="m337.1 796.6 4.5-4.6v-1.2l-5.7 5.8z" fill="#808080"/><path d="m341.6 796.6v-.7l-.7.7z" fill="#808080"/><path d="m341.6 900.2v-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-.6v.7 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.7 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8.6v-.6z" fill="#808080"/><path d="m341.6 837.2v1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8.8h.8 3.7 1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6v.6z" fill="#e8e7e8"/><path d="m376.8 889.9-14.5 14.8h3.8l10.7-11z" fill="#e8e7e8"/><path d="m376.8 895-9.5 9.7h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m376.8 884.7-19.5 20h3.7l15.8-16.1z" fill="#e8e7e8"/><path d="m376.8 879.6-24.5 25.1h3.7l20.8-21.2z" fill="#e8e7e8"/><path d="m342.4 868.7-.8.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m376.8 900.1-4.5 4.6h3.8l.7-.7z" fill="#e8e7e8"/><path d="m367.4 868.7-25.8 26.4v3.9l29.6-30.3z" fill="#e8e7e8"/><path d="m341.6 900.2v3.9l34.6-35.4h-3.8z" fill="#e8e7e8"/><path d="m362.4 868.7-20.8 21.3v3.8l24.6-25.1z" fill="#e8e7e8"/><path d="m347.4 868.7-5.8 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m352.4 868.7-10.8 11v3.9l14.5-14.9z" fill="#e8e7e8"/><path d="m376.8 869.4-34.6 35.3h3.8l30.8-31.5z" fill="#e8e7e8"/><path d="m357.4 868.7-15.8 16.2v3.8l19.6-20z" fill="#e8e7e8"/><path d="m376.8 874.5-29.5 30.2h3.7l25.8-26.4z" fill="#e8e7e8"/><path d="m341.6 868.7v.8l.8-.8z" fill="#808080"/><path d="m346.1 868.7-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m351.1 868.7-9.5 9.7v1.3l10.8-11z" fill="#808080"/><path d="m356.1 868.7-14.5 14.9v1.3l15.8-16.2z" fill="#808080"/><path d="m361.2 868.7-19.6 20v1.3l20.8-21.3z" fill="#808080"/><path d="m366.2 868.7-24.6 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m371.2 868.7-29.6 30.3v1.2l30.8-31.5z" fill="#808080"/><path d="m376.8 868.7h-.6l-34.6 35.4v.6h.6l34.6-35.3z" fill="#808080"/><path d="m376.8 873.2-30.8 31.5h1.3l29.5-30.2z" fill="#808080"/><path d="m376.8 878.3-25.8 26.4h1.3l24.5-25.1z" fill="#808080"/><path d="m376.8 883.5-20.8 21.2h1.3l19.5-20z" fill="#808080"/><path d="m376.8 888.6-15.8 16.1h1.3l14.5-14.8z" fill="#808080"/><path d="m376.8 893.7-10.7 11h1.2l9.5-9.7z" fill="#808080"/><path d="m376.8 898.8-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m376.1 904.7h.7v-.7z" fill="#808080"/><path d="m341.6 843.6-24.5 25.1h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m341.6 838.5-29.6 30.2h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m327.2 832.7-20.8 21.3v3.8l24.5-25.1z" fill="#e8e7e8"/><path d="m332.2 832.7-25.8 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m322.2 832.7-15.8 16.1v3.9l19.5-20z" fill="#e8e7e8"/><path d="m341.6 833.3-34.6 35.4h3.8l30.8-31.5z" fill="#e8e7e8"/><path d="m337.2 832.7-30.8 31.5v3.9l34.6-35.4z" fill="#e8e7e8"/><path d="m341.6 864.1-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m317.2 832.7-10.8 11v3.8l14.5-14.8z" fill="#e8e7e8"/><path d="m341.6 848.7-19.5 20h3.7l15.8-16.1z" fill="#e8e7e8"/><path d="m341.6 853.8-14.5 14.9h3.7l10.8-11z" fill="#e8e7e8"/><path d="m312.1 832.7-5.7 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m341.6 859-9.5 9.7h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m307.1 832.7-.7.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m306.4 832.7v.7l.7-.7z" fill="#808080"/><path d="m310.9 832.7-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m315.9 832.7-9.5 9.7v1.3l10.8-11z" fill="#808080"/><path d="m320.9 832.7-14.5 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m325.9 832.7-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m330.9 832.7-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m336 832.7-29.6 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m341.6 833.3v-.6h-.6l-34.6 35.4v.6h.6z" fill="#808080"/><path d="m341.6 837.2-30.8 31.5h1.2l29.6-30.2z" fill="#808080"/><path d="m341.6 842.3-25.8 26.4h1.3l24.5-25.1z" fill="#808080"/><path d="m341.6 847.4-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m341.6 852.6-15.8 16.1h1.3l14.5-14.9z" fill="#808080"/><path d="m341.6 857.7-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m341.6 862.8-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m340.9 868.7h.7v-.8z" fill="#808080"/><path d="m310.9 976.8h1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.6v-.6-3.8-1.4-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.7-.6v.6 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.7c.2 0 .3.1.5.1h.2 3.8z" fill="#808080"/><path d="m346.1 940.8h1.3 3.7 1.3 3.7 1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8.6v-.7-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.7-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-.6v.7 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.8z" fill="#e8e7e8"/><path d="m376.8 961.9-14.5 14.9h3.8l10.7-11z" fill="#e8e7e8"/><path d="m376.8 956.8-19.5 20h3.7l15.8-16.2z" fill="#e8e7e8"/><path d="m367.4 940.8-25.8 26.4v3.8l29.6-30.2z" fill="#e8e7e8"/><path d="m352.4 940.8-10.8 11v3.8l14.5-14.8z" fill="#e8e7e8"/><path d="m357.4 940.8-15.8 16.1v3.9l19.6-20z" fill="#e8e7e8"/><path d="m342.4 940.8-.8.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m376.8 951.7-24.5 25.1h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m362.4 940.8-20.8 21.2v3.9l24.6-25.1z" fill="#e8e7e8"/><path d="m376.8 946.5-29.5 30.3h3.7l25.8-26.4z" fill="#e8e7e8"/><path d="m372.4 940.8-30.8 31.5v3.8l34.6-35.3z" fill="#e8e7e8"/><path d="m376.8 941.4-34.6 35.4h3.8l30.8-31.6z" fill="#e8e7e8"/><path d="m347.4 940.8-5.8 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m376.8 972.2-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m376.8 967.1-9.5 9.7h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m341.6 940.8v.7l.8-.7z" fill="#808080"/><path d="m346.1 940.8-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m351.1 940.8-9.5 9.7v1.3l10.8-11z" fill="#808080"/><path d="m356.1 940.8-14.5 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m361.2 940.8-19.6 20v1.2l20.8-21.2z" fill="#808080"/><path d="m366.2 940.8-24.6 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m371.2 940.8-29.6 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m376.8 940.8h-.6l-34.6 35.3v.7h.6l34.6-35.4z" fill="#808080"/><path d="m376.8 945.2-30.8 31.6h1.3l29.5-30.3z" fill="#808080"/><path d="m376.8 950.4-25.8 26.4h1.3l24.5-25.1z" fill="#808080"/><path d="m376.8 955.5-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m376.8 960.6-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m376.8 965.8-10.7 11h1.2l9.5-9.7z" fill="#808080"/><path d="m376.8 970.9-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m376.1 976.8h.7v-.8z" fill="#808080"/><path d="m341.6 915.6-24.5 25.2h3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m341.6 925.9-14.5 14.9h3.7l10.8-11.1z" fill="#e8e7e8"/><path d="m341.6 920.8-19.5 20h3.7l15.8-16.2z" fill="#e8e7e8"/><path d="m341.6 931-9.5 9.8h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m341.6 936.2-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m341.6 905.4-34.6 35.4h3.8l30.8-31.6z" fill="#e8e7e8"/><path d="m341.6 910.5-29.6 30.3h3.8l25.8-26.5z" fill="#e8e7e8"/><path d="m336 904.7h-3.8l-25.8 26.4v3.9z" fill="#e8e7e8"/><path d="m306.4 936.3v3.8l34.6-35.4h-3.8z" fill="#e8e7e8"/><path d="m325.9 904.7h-3.7l-15.8 16.2v3.8z" fill="#e8e7e8"/><path d="m320.9 904.7h-3.7l-10.8 11.1v3.8z" fill="#e8e7e8"/><path d="m310.9 904.7h-3.8l-.7.8v3.8z" fill="#e8e7e8"/><path d="m330.9 904.7h-3.7l-20.8 21.3v3.9z" fill="#e8e7e8"/><path d="m315.9 904.7h-3.8l-5.7 5.9v3.9z" fill="#e8e7e8"/><path d="m307.1 904.7h-.7v.8z" fill="#808080"/><path d="m312.1 904.7h-1.2l-4.5 4.6v1.3z" fill="#808080"/><path d="m317.2 904.7h-1.3l-9.5 9.8v1.3z" fill="#808080"/><path d="m322.2 904.7h-1.3l-14.5 14.9v1.3z" fill="#808080"/><path d="m327.2 904.7h-1.3l-19.5 20v1.3z" fill="#808080"/><path d="m332.2 904.7h-1.3l-24.5 25.2v1.2z" fill="#808080"/><path d="m337.2 904.7h-1.2l-29.6 30.3v1.3z" fill="#808080"/><path d="m341.6 904.7h-.6l-34.6 35.4v.7h.6l34.6-35.4z" fill="#808080"/><path d="m341.6 909.2-30.8 31.6h1.2l29.6-30.3z" fill="#808080"/><path d="m341.6 914.3-25.8 26.5h1.3l24.5-25.2z" fill="#808080"/><path d="m341.6 919.5-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m341.6 924.6-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m341.6 929.7-10.8 11.1h1.3l9.5-9.8z" fill="#808080"/><path d="m341.6 934.9-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m340.9 940.8h.7v-.8z" fill="#808080"/><path d="m376.8 981.4v-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.1-3.8-1.2-3.8-1.2-3.8-1.2-3.8-.6v.6 3.8.1c11.7 1.2 23.7 2.3 35.2 3.1v-1.9z" fill="#e8e7e8"/><path d="m312.1 976.8-.7.7c1.1.2 2.2.3 3.3.5l1.2-1.2z" fill="#e8e7e8"/><path d="m317.2 976.8-1.4 1.4c1.1.2 2.2.3 3.3.5l1.8-1.9z" fill="#e8e7e8"/><path d="m327.2 976.8-2.6 2.6c1.1.1 2.2.3 3.3.4l3-3z" fill="#e8e7e8"/><path d="m322.2 976.8-2 2c1.1.2 2.2.3 3.3.4l2.4-2.5h-3.7z" fill="#e8e7e8"/><path d="m337.2 976.8-3.6 3.7c1.1.1 2.2.3 3.4.4l4-4.1z" fill="#e8e7e8"/><path d="m332.2 976.8-3.1 3.2c1.1.1 2.2.3 3.4.4l3.5-3.6z" fill="#e8e7e8"/><path d="m307.1 976.8c1 .2 2.1.4 3.2.6l.5-.6z" fill="#e8e7e8"/><path d="m341.6 977.4-3.5 3.6c1.1.1 2.3.2 3.4.4l.1-.1z" fill="#e8e7e8"/><path d="m306.9 976.8h.2z" fill="#808080"/><path d="m310.9 976.8-.5.6c.4.1.7.1 1.1.2l.7-.7h-1.3z" fill="#808080"/><path d="m315.9 976.8-1.2 1.2c.4.1.7.1 1.1.2l1.4-1.4z" fill="#808080"/><path d="m320.9 976.8-1.8 1.9c.4.1.7.1 1.1.2l2-2h-1.3z" fill="#808080"/><path d="m325.9 976.8-2.4 2.5c.4 0 .7.1 1.1.1l2.6-2.6z" fill="#808080"/><path d="m330.9 976.8-3 3c.4 0 .7.1 1.1.1l3.1-3.2h-1.2z" fill="#808080"/><path d="m336 976.8-3.5 3.6c.4 0 .8.1 1.1.1l3.6-3.7z" fill="#808080"/><path d="m341.6 976.8h-.6l-4 4.1c.4 0 .8.1 1.1.1l3.5-3.6z" fill="#808080"/><path d="m341.5 981.4h.1v-.1z" fill="#808080"/><path d="m236 442.1v3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.8h.7 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.6v-.6-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.8h-.7-2.8c-8.6.8-15.7 1.4-19.9 1.9-4.3.5-8.2 1-11.8 1.7v.9 1.2z" fill="#808080"/><path d="m271.9 436.3h3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.6v-.6-3.6c-11.8 1.6-24.4 2.9-35.2 3.9v.3z" fill="#e8e7e8"/><path d="m295.6 472.4 10.8-11v-3.9l-14.5 14.9z" fill="#e8e7e8"/><path d="m280.6 472.4 25.8-26.4v-3.9l-29.6 30.3z" fill="#e8e7e8"/><path d="m287 436.3-15.8 16.2v3.8l19.5-20z" fill="#e8e7e8"/><path d="m292 436.3-20.8 21.3v3.9l24.5-25.2z" fill="#e8e7e8"/><path d="m275.6 472.4 30.8-31.6v-3.8l-34.6 35.4z" fill="#e8e7e8"/><path d="m297 436.3-25.8 26.5v3.8l29.5-30.3z" fill="#e8e7e8"/><path d="m285.6 472.4 20.8-21.3v-3.8l-24.6 25.1z" fill="#e8e7e8"/><path d="m281.9 436.3-10.7 11.1v3.8l14.5-14.9z" fill="#e8e7e8"/><path d="m290.6 472.4 15.8-16.2v-3.8l-19.5 20z" fill="#e8e7e8"/><path d="m302 436.3-30.8 31.6v3.8l34.6-35.4z" fill="#e8e7e8"/><path d="m271.9 436.3-.7.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m300.6 472.4 5.8-5.9v-3.9l-9.5 9.8z" fill="#e8e7e8"/><path d="m305.7 472.4.7-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m276.9 436.3-5.7 5.9v3.9l9.5-9.8z" fill="#e8e7e8"/><path d="m271.2 436.3v.8l.7-.8z" fill="#808080"/><path d="m275.7 436.3-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m280.7 436.3-9.5 9.8v1.3l10.7-11.1z" fill="#808080"/><path d="m285.7 436.3-14.5 14.9v1.3l15.8-16.2z" fill="#808080"/><path d="m290.7 436.3-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m295.7 436.3-24.5 25.2v1.3l25.8-26.5z" fill="#808080"/><path d="m300.7 436.3-29.5 30.3v1.3l30.8-31.6z" fill="#808080"/><path d="m306.4 437v-.7h-.6l-34.6 35.4v.7h.6z" fill="#808080"/><path d="m276.8 472.4 29.6-30.3v-1.3l-30.8 31.6z" fill="#808080"/><path d="m281.8 472.4 24.6-25.1v-1.3l-25.8 26.4z" fill="#808080"/><path d="m286.9 472.4 19.5-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m291.9 472.4 14.5-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m296.9 472.4 9.5-9.8v-1.2l-10.8 11z" fill="#808080"/><path d="m301.9 472.4 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m306.4 472.4v-.8l-.7.8z" fill="#808080"/><path d="m270.7 436.1c-1 .1-2.1.2-3.1.3h2.8z" fill="#e8e7e8"/><path d="m271.2 436.3v-.3c-.2 0-.3 0-.5 0l-.3.3z" fill="#808080"/><path d="m240.5 544.4h1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7.7v-.6-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-.8-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-.6v.7 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.7z" fill="#808080"/><path d="m271.2 476.9v1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8.8h.7 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.6z" fill="#e8e7e8"/><path d="m281.9 508.4-10.7 11v3.9l14.5-14.9z" fill="#e8e7e8"/><path d="m287 508.4-15.8 16.2v3.8l19.5-20z" fill="#e8e7e8"/><path d="m292 508.4-20.8 21.3v3.8l24.5-25.1z" fill="#e8e7e8"/><path d="m276.9 508.4-5.7 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m297 508.4-25.8 26.4v3.9l29.5-30.3z" fill="#e8e7e8"/><path d="m271.9 508.4-.7.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m306.4 539.8-4.5 4.6h3.8l.7-.7z" fill="#e8e7e8"/><path d="m306.4 514.2-29.6 30.2h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m306.4 519.3-24.6 25.1h3.8l20.8-21.2z" fill="#e8e7e8"/><path d="m306.4 524.4-19.5 20h3.7l15.8-16.1z" fill="#e8e7e8"/><path d="m306.4 529.6-14.5 14.8h3.7l10.8-11z" fill="#e8e7e8"/><path d="m306.4 534.7-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m302 508.4-30.8 31.5v3.9l34.6-35.4z" fill="#e8e7e8"/><path d="m306.4 509.1-34.6 35.3h3.8l30.8-31.5z" fill="#e8e7e8"/><path d="m271.2 508.4v.8l.7-.8z" fill="#808080"/><path d="m275.7 508.4-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m280.7 508.4-9.5 9.7v1.3l10.7-11z" fill="#808080"/><path d="m285.7 508.4-14.5 14.9v1.3l15.8-16.2z" fill="#808080"/><path d="m290.7 508.4-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m295.7 508.4-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m300.7 508.4-29.5 30.3v1.2l30.8-31.5z" fill="#808080"/><path d="m306.4 509.1v-.7h-.6l-34.6 35.4v.6h.6z" fill="#808080"/><path d="m306.4 512.9-30.8 31.5h1.2l29.6-30.2z" fill="#808080"/><path d="m306.4 518-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m306.4 523.2-20.8 21.2h1.3l19.5-20z" fill="#808080"/><path d="m306.4 528.3-15.8 16.1h1.3l14.5-14.8z" fill="#808080"/><path d="m306.4 533.4-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m306.4 538.5-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m305.7 544.4h.7v-.7z" fill="#808080"/><path d="m236 477 4.5-4.6h-3.8l-.7.7z" fill="#e8e7e8"/><path d="m271.2 488.4-19.6 20h3.8l15.8-16.1z" fill="#e8e7e8"/><path d="m271.2 493.5-14.6 14.9h3.8l10.8-11z" fill="#e8e7e8"/><path d="m271.2 483.3-24.6 25.1h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m271.2 498.7-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m271.2 503.8-4.5 4.6h3.7l.8-.8z" fill="#e8e7e8"/><path d="m236 502.6 29.5-30.2h-3.7l-25.8 26.4z" fill="#e8e7e8"/><path d="m236 507.8 34.5-35.4h-3.7l-30.8 31.5z" fill="#e8e7e8"/><path d="m271.2 478.2-29.6 30.2h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m271.2 473-34.6 35.4h3.7l30.9-31.5z" fill="#e8e7e8"/><path d="m236 497.5 24.5-25.1h-3.7l-20.8 21.3z" fill="#e8e7e8"/><path d="m236 482.1 9.5-9.7h-3.8l-5.7 5.9z" fill="#e8e7e8"/><path d="m236 492.4 19.5-20h-3.8l-15.7 16.1z" fill="#e8e7e8"/><path d="m236 487.2 14.5-14.8h-3.8l-10.7 11z" fill="#e8e7e8"/><path d="m236.7 472.4h-.7v.7z" fill="#808080"/><path d="m236 478.3 5.7-5.9h-1.2l-4.5 4.6z" fill="#808080"/><path d="m236 483.4 10.7-11h-1.2l-9.5 9.7z" fill="#808080"/><path d="m236 488.5 15.7-16.1h-1.2l-14.5 14.8z" fill="#808080"/><path d="m236 493.7 20.8-21.3h-1.3l-19.5 20z" fill="#808080"/><path d="m236 498.8 25.8-26.4h-1.3l-24.5 25.1z" fill="#808080"/><path d="m236 503.9 30.8-31.5h-1.3l-29.5 30.2z" fill="#808080"/><path d="m236 508.4h.6l34.6-35.4v-.6h-.7l-34.5 35.4z" fill="#808080"/><path d="m271.2 476.9-30.9 31.5h1.3l29.6-30.2z" fill="#808080"/><path d="m271.2 482-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m271.2 487.1-20.8 21.3h1.2l19.6-20z" fill="#808080"/><path d="m271.2 492.3-15.8 16.1h1.2l14.6-14.9z" fill="#808080"/><path d="m271.2 497.4-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m271.2 502.5-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m270.4 508.4h.8v-.8z" fill="#808080"/><path d="m240.5 616.5h1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7.7v-.6-3.9-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.8-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-.6v.6 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.7z" fill="#808080"/><path d="m275.7 580.5h1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8.6v-.7-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.7-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.7 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.7z" fill="#e8e7e8"/><path d="m297 580.5-25.8 26.4v3.8l29.5-30.2z" fill="#e8e7e8"/><path d="m306.4 581.1-34.6 35.4h3.8l30.8-31.5z" fill="#e8e7e8"/><path d="m281.9 580.5-10.7 11v3.8l14.5-14.8z" fill="#e8e7e8"/><path d="m302 580.5-30.8 31.5v3.9l34.6-35.4z" fill="#e8e7e8"/><path d="m287 580.5-15.8 16.1v3.9l19.5-20z" fill="#e8e7e8"/><path d="m271.9 580.5-.7.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m276.9 580.5-5.7 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m306.4 586.2-29.6 30.3h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m306.4 611.9-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m306.4 606.8-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m306.4 601.6-14.5 14.9h3.7l10.8-11z" fill="#e8e7e8"/><path d="m306.4 591.4-24.6 25.1h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m306.4 596.5-19.5 20h3.7l15.8-16.2z" fill="#e8e7e8"/><path d="m292 580.5-20.8 21.2v3.9l24.5-25.1z" fill="#e8e7e8"/><path d="m271.2 580.5v.7l.7-.7z" fill="#808080"/><path d="m275.7 580.5-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m280.7 580.5-9.5 9.7v1.3l10.7-11z" fill="#808080"/><path d="m285.7 580.5-14.5 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m290.7 580.5-19.5 20v1.2l20.8-21.2z" fill="#808080"/><path d="m295.7 580.5-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m300.7 580.5-29.5 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m306.4 580.5h-.6l-34.6 35.4v.6h.6l34.6-35.4z" fill="#808080"/><path d="m306.4 585-30.8 31.5h1.2l29.6-30.3z" fill="#808080"/><path d="m306.4 590.1-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m306.4 595.2-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m306.4 600.3-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m306.4 605.5-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m306.4 610.6-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m305.7 616.5h.7v-.8z" fill="#808080"/><path d="m251.7 544.4-15.7 16.2v3.8l19.5-20z" fill="#e8e7e8"/><path d="m246.7 544.4-10.7 11.1v3.8l14.5-14.9z" fill="#e8e7e8"/><path d="m241.7 544.4-5.7 5.9v3.9l9.5-9.8z" fill="#e8e7e8"/><path d="m256.8 544.4-20.8 21.3v3.9l24.5-25.2z" fill="#e8e7e8"/><path d="m266.8 544.4-30.8 31.6v3.8l34.5-35.4z" fill="#e8e7e8"/><path d="m261.8 544.4-25.8 26.4v3.9l29.5-30.3z" fill="#e8e7e8"/><path d="m271.2 545.1-34.6 35.4h3.7l30.9-31.6z" fill="#e8e7e8"/><path d="m271.2 575.9-4.5 4.6h3.7l.8-.8z" fill="#e8e7e8"/><path d="m271.2 570.7-9.5 9.8h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m271.2 550.2-29.6 30.3h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m271.2 565.6-14.6 14.9h3.8l10.8-11.1z" fill="#e8e7e8"/><path d="m271.2 560.5-19.6 20h3.8l15.8-16.2z" fill="#e8e7e8"/><path d="m271.2 555.3-24.6 25.2h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m236.7 544.4-.7.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m236 544.4v.8l.7-.8z" fill="#808080"/><path d="m240.5 544.4-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m245.5 544.4-9.5 9.8v1.3l10.7-11.1z" fill="#808080"/><path d="m250.5 544.4-14.5 14.9v1.3l15.7-16.2z" fill="#808080"/><path d="m255.5 544.4-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m260.5 544.4-24.5 25.2v1.2l25.8-26.4z" fill="#808080"/><path d="m265.5 544.4-29.5 30.3v1.3l30.8-31.6z" fill="#808080"/><path d="m271.2 545.1v-.7h-.7l-34.5 35.4v.7h.6z" fill="#808080"/><path d="m271.2 548.9-30.9 31.6h1.3l29.6-30.3z" fill="#808080"/><path d="m271.2 554.1-25.8 26.4h1.2l24.6-25.2z" fill="#808080"/><path d="m271.2 559.2-20.8 21.3h1.2l19.6-20z" fill="#808080"/><path d="m271.2 564.3-15.8 16.2h1.2l14.6-14.9z" fill="#808080"/><path d="m271.2 569.4-10.8 11.1h1.3l9.5-9.8z" fill="#808080"/><path d="m271.2 574.6-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m270.4 580.5h.8v-.8z" fill="#808080"/><path d="m241.7 688.6h3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.6v-.6-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.5v.6 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 1c.7 2.9 1.3 5.9 1.9 8.8h2.6 1.2z" fill="#808080"/><path d="m275.7 652.5h1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9.7h.7z" fill="#e8e7e8"/><path d="m276.9 652.5-5.7 5.9v3.9l9.5-9.8z" fill="#e8e7e8"/><path d="m306.4 673.7-14.5 14.9h3.7l10.8-11.1z" fill="#e8e7e8"/><path d="m302 652.5-30.8 31.6v3.8l34.6-35.4z" fill="#e8e7e8"/><path d="m306.4 684-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m306.4 658.3-29.6 30.3h3.8l25.8-26.5z" fill="#e8e7e8"/><path d="m292 652.5-20.8 21.3v3.8l24.5-25.1z" fill="#e8e7e8"/><path d="m297 652.5-25.8 26.4v3.9l29.5-30.3z" fill="#e8e7e8"/><path d="m281.9 652.5-10.7 11v3.9l14.5-14.9z" fill="#e8e7e8"/><path d="m271.9 652.5-.7.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m306.4 678.8-9.5 9.8h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m287 652.5-15.8 16.2v3.8l19.5-20z" fill="#e8e7e8"/><path d="m306.4 653.2-34.6 35.4h3.8l30.8-31.6z" fill="#e8e7e8"/><path d="m306.4 668.6-19.5 20h3.7l15.8-16.2z" fill="#e8e7e8"/><path d="m306.4 663.4-24.6 25.2h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m271.2 652.5v.8l.7-.8z" fill="#808080"/><path d="m275.7 652.5-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m280.7 652.5-9.5 9.8v1.2l10.7-11z" fill="#808080"/><path d="m285.7 652.5-14.5 14.9v1.3l15.8-16.2z" fill="#808080"/><path d="m290.7 652.5-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m295.7 652.5-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m300.7 652.5-29.5 30.3v1.3l30.8-31.6z" fill="#808080"/><path d="m306.4 653.2v-.7h-.6l-34.6 35.4v.7h.6z" fill="#808080"/><path d="m306.4 657-30.8 31.6h1.2l29.6-30.3z" fill="#808080"/><path d="m306.4 662.1-25.8 26.5h1.2l24.6-25.2z" fill="#808080"/><path d="m306.4 667.3-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m306.4 672.4-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m306.4 677.5-10.8 11.1h1.3l9.5-9.8z" fill="#808080"/><path d="m306.4 682.7-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m305.7 688.6h.7v-.8z" fill="#808080"/><path d="m271.2 642.8-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m261.8 616.5-25.8 26.4v3.8l29.5-30.2z" fill="#e8e7e8"/><path d="m266.8 616.5-30.8 31.5v3.9l34.5-35.4z" fill="#e8e7e8"/><path d="m271.2 637.7-14.6 14.8h3.8l10.8-11z" fill="#e8e7e8"/><path d="m236.7 616.5-.7.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m271.2 647.9-4.5 4.6h3.7l.8-.7z" fill="#e8e7e8"/><path d="m241.7 616.5-5.7 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m271.2 632.5-19.6 20h3.8l15.8-16.1z" fill="#e8e7e8"/><path d="m251.7 616.5-15.7 16.1v3.9l19.5-20z" fill="#e8e7e8"/><path d="m271.2 622.3-29.6 30.2h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m246.7 616.5-10.7 11v3.9l14.5-14.9z" fill="#e8e7e8"/><path d="m271.2 627.4-24.6 25.1h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m256.8 616.5-20.8 21.3v3.8l24.5-25.1z" fill="#e8e7e8"/><path d="m271.2 617.1-34.6 35.4h3.7l30.9-31.5z" fill="#e8e7e8"/><path d="m236 616.5v.8l.7-.8z" fill="#808080"/><path d="m240.5 616.5-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m245.5 616.5-9.5 9.7v1.3l10.7-11z" fill="#808080"/><path d="m250.5 616.5-14.5 14.9v1.2l15.7-16.1z" fill="#808080"/><path d="m255.5 616.5-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m260.5 616.5-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m265.5 616.5-29.5 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m271.2 616.5h-.7l-34.5 35.4v.6h.6l34.6-35.4z" fill="#808080"/><path d="m271.2 621-30.9 31.5h1.3l29.6-30.2z" fill="#808080"/><path d="m271.2 626.1-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m271.2 631.2-20.8 21.3h1.2l19.6-20z" fill="#808080"/><path d="m271.2 636.4-15.8 16.1h1.2l14.6-14.8z" fill="#808080"/><path d="m271.2 641.5-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m271.2 646.6-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m270.4 652.5h.8v-.7z" fill="#808080"/><path d="m271.2 760v-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-1.3c1.6 12 2.9 24.1 3.9 36h23.2v-.7z" fill="#808080"/><path d="m275.7 724.6h1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8.6v-.7-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.2-3.9-.7h-.7-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.6 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8.8h.7z" fill="#e8e7e8"/><path d="m287 724.6-15.8 16.1v3.9l19.5-20z" fill="#e8e7e8"/><path d="m292 724.6-20.8 21.3v3.8l24.5-25.1z" fill="#e8e7e8"/><path d="m306.4 725.2-34.6 35.4h3.8l30.8-31.5z" fill="#e8e7e8"/><path d="m306.4 735.5-24.6 25.1h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m276.9 724.6-5.7 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m306.4 730.4-29.6 30.2h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m297 724.6-25.8 26.4v3.8l29.5-30.2z" fill="#e8e7e8"/><path d="m306.4 745.8-14.5 14.8h3.7l10.8-11z" fill="#e8e7e8"/><path d="m302 724.6-30.8 31.5v3.9l34.6-35.4z" fill="#e8e7e8"/><path d="m306.4 756-4.5 4.6h3.8l.7-.7z" fill="#e8e7e8"/><path d="m271.9 724.6-.7.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m281.9 724.6-10.7 11v3.8l14.5-14.8z" fill="#e8e7e8"/><path d="m306.4 740.6-19.5 20h3.7l15.8-16.1z" fill="#e8e7e8"/><path d="m306.4 750.9-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m271.2 724.6v.7l.7-.7z" fill="#808080"/><path d="m275.7 724.6-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m280.7 724.6-9.5 9.7v1.3l10.7-11z" fill="#808080"/><path d="m285.7 724.6-14.5 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m290.7 724.6-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m295.7 724.6-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m300.7 724.6-29.5 30.2v1.3l30.8-31.5z" fill="#808080"/><path d="m306.4 724.6h-.6l-34.6 35.4v.6h.6l34.6-35.4z" fill="#808080"/><path d="m306.4 729.1-30.8 31.5h1.2l29.6-30.2z" fill="#808080"/><path d="m306.4 734.2-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m306.4 739.3-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m306.4 744.5-15.8 16.1h1.3l14.5-14.8z" fill="#808080"/><path d="m306.4 749.6-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m306.4 754.7-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m305.7 760.6h.7v-.7z" fill="#808080"/><path d="m251.7 688.6-11.5 11.8c.2 1.1.4 2.2.6 3.2l14.7-15z" fill="#e8e7e8"/><path d="m271.2 704.6-19.6 20h3.8l15.8-16.2z" fill="#e8e7e8"/><path d="m271.2 699.5-24.6 25.1h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m271.2 709.7-14.6 14.9h3.8l10.8-11z" fill="#e8e7e8"/><path d="m271.2 714.9-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m271.2 698.2v-3.8l-27.4 28c.1.7.2 1.5.3 2.2h1.3z" fill="#e8e7e8"/><path d="m271.2 720-4.5 4.6h3.7l.8-.8z" fill="#e8e7e8"/><path d="m237.9 688.6c.2.7.3 1.4.5 2.2l2.1-2.2z" fill="#e8e7e8"/><path d="m241.7 688.6-3.2 3.2c.2 1.1.4 2.1.6 3.2l6.3-6.4z" fill="#e8e7e8"/><path d="m261.8 688.6-20 20.5c.2 1.1.4 2.2.5 3.3l23.2-23.8z" fill="#e8e7e8"/><path d="m266.8 688.6-24.3 24.9c0 .2.1.4.1.6.1.9.3 1.8.4 2.8l27.6-28.2h-3.8z" fill="#e8e7e8"/><path d="m256.8 688.6-15.8 16.1c.2 1.1.4 2.2.6 3.3l18.9-19.4z" fill="#e8e7e8"/><path d="m246.7 688.6-7.3 7.5c.2 1.1.4 2.1.6 3.2l10.5-10.7z" fill="#e8e7e8"/><path d="m271.2 689.2-28 28.7c.2 1.1.3 2.2.5 3.4l27.6-28.2v-3.9z" fill="#e8e7e8"/><path d="m240.5 688.6-2.1 2.2c.1.4.1.7.2 1.1l3.2-3.2h-1.3z" fill="#808080"/><path d="m245.5 688.6-6.3 6.4c.1.4.1.7.2 1.1l7.3-7.5z" fill="#808080"/><path d="m250.5 688.6-10.5 10.7c.1.4.1.7.2 1.1l11.5-11.8z" fill="#808080"/><path d="m255.5 688.6-14.7 15c.1.4.1.7.2 1.1l15.7-16.1z" fill="#808080"/><path d="m260.5 688.6-18.9 19.4c.1.4.1.7.2 1.1l20-20.5z" fill="#808080"/><path d="m265.5 688.6-23.2 23.8c.1.4.1.7.2 1.1l24.3-24.9z" fill="#808080"/><path d="m271.2 688.6h-.6l-27.6 28.2c.1.4.1.7.2 1.1l28-28.7z" fill="#808080"/><path d="m271.2 693-27.6 28.2c.1.4.1.8.2 1.1l27.4-28z" fill="#808080"/><path d="m271.2 698.2-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m271.2 703.3-20.8 21.3h1.2l19.6-20z" fill="#808080"/><path d="m271.2 708.4-15.8 16.2h1.2l14.6-14.9z" fill="#808080"/><path d="m271.2 713.6-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m271.2 718.7-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m270.4 724.6h.8v-.8z" fill="#808080"/><path d="m255.5 832.7h1.3 3.8 1.3 3.8 1.3 3.8.6v-.7-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3c.6 12.3 1 24.4 1.3 36h3.9z" fill="#808080"/><path d="m271.2 765.1v1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9.7h.7 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8.6v-.6-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-.8h-35.2v.7z" fill="#e8e7e8"/><path d="m306.4 822.9-9.5 9.8h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m276.9 796.6-5.7 5.9v3.9l9.5-9.8z" fill="#e8e7e8"/><path d="m292 796.6-20.8 21.3v3.9l24.5-25.2z" fill="#e8e7e8"/><path d="m306.4 828.1-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m281.9 796.6-10.7 11.1v3.8l14.5-14.9z" fill="#e8e7e8"/><path d="m287 796.6-15.8 16.2v3.8l19.5-20z" fill="#e8e7e8"/><path d="m306.4 797.3-34.6 35.4h3.8l30.8-31.6z" fill="#e8e7e8"/><path d="m271.9 796.6-.7.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m306.4 812.7-19.5 20h3.7l15.8-16.2z" fill="#e8e7e8"/><path d="m306.4 807.6-24.6 25.1h3.8l20.8-21.3z" fill="#e8e7e8"/><path d="m297 796.6-25.8 26.5v3.8l29.5-30.3z" fill="#e8e7e8"/><path d="m302 796.6-30.8 31.6v3.8l34.6-35.4z" fill="#e8e7e8"/><path d="m306.4 817.8-14.5 14.9h3.7l10.8-11z" fill="#e8e7e8"/><path d="m306.4 802.4-29.6 30.3h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m271.2 796.6v.8l.7-.8z" fill="#808080"/><path d="m275.7 796.6-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m280.7 796.6-9.5 9.8v1.3l10.7-11.1z" fill="#808080"/><path d="m285.7 796.6-14.5 14.9v1.3l15.8-16.2z" fill="#808080"/><path d="m290.7 796.6-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m295.7 796.6-24.5 25.2v1.3l25.8-26.5z" fill="#808080"/><path d="m300.7 796.6-29.5 30.3v1.3l30.8-31.6z" fill="#808080"/><path d="m306.4 797.3v-.7h-.6l-34.6 35.4v.7h.6z" fill="#808080"/><path d="m306.4 801.1-30.8 31.6h1.2l29.6-30.3z" fill="#808080"/><path d="m306.4 806.3-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m306.4 811.4-20.8 21.3h1.3l19.5-20z" fill="#808080"/><path d="m306.4 816.5-15.8 16.2h1.3l14.5-14.9z" fill="#808080"/><path d="m306.4 821.7-10.8 11h1.3l9.5-9.8z" fill="#808080"/><path d="m306.4 826.8-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m305.7 832.7h.7v-.8z" fill="#808080"/><path d="m256.8 760.6-8.1 8.3c.1 1.2.2 2.4.3 3.6l11.6-11.9z" fill="#e8e7e8"/><path d="m266.8 760.6-17.5 17.9c.1 1.2.2 2.4.2 3.6l21-21.5z" fill="#e8e7e8"/><path d="m271.2 776.7-19.6 19.9h3.8l15.8-16.1z" fill="#e8e7e8"/><path d="m251.7 760.6-3.5 3.5c.1 1.2.2 2.4.3 3.6l6.9-7.1z" fill="#e8e7e8"/><path d="m248 760.6c.1.8.1 1.6.2 2.3l2.3-2.3z" fill="#e8e7e8"/><path d="m271.2 766.4-21.2 21.7c.1 1.2.1 2.4.2 3.6l21-21.5z" fill="#e8e7e8"/><path d="m271.2 771.5-21 21.5c.1 1.2.1 2.4.2 3.7l20.8-21.3z" fill="#e8e7e8"/><path d="m271.2 761.3-21.5 22c.1 1.2.1 2.4.2 3.6l21.3-21.8z" fill="#e8e7e8"/><path d="m271.2 781.8-14.6 14.8h3.8l10.8-11z" fill="#e8e7e8"/><path d="m271.2 792-4.5 4.6h3.7l.8-.7z" fill="#e8e7e8"/><path d="m271.2 786.9-9.5 9.7h3.7l5.8-5.8z" fill="#e8e7e8"/><path d="m261.8 760.6-12.8 13.1c.1 1.2.2 2.4.2 3.6l16.3-16.6h-3.7z" fill="#e8e7e8"/><path d="m250.5 760.6-2.3 2.3c0 .4.1.8.1 1.2l3.5-3.5z" fill="#808080"/><path d="m255.5 760.6-6.9 7.1c0 .4.1.8.1 1.2l8.1-8.3z" fill="#808080"/><path d="m260.5 760.6-11.6 11.9c0 .4.1.8.1 1.2l12.8-13.1z" fill="#808080"/><path d="m265.5 760.6-16.3 16.6c0 .4.1.8.1 1.2l17.5-17.9h-1.3z" fill="#808080"/><path d="m271.2 760.6h-.6l-21 21.5c0 .4 0 .8.1 1.2l21.5-22z" fill="#808080"/><path d="m271.2 765.1-21.3 21.8c0 .4 0 .8.1 1.2l21.2-21.7z" fill="#808080"/><path d="m271.2 770.2-21 21.5c0 .4 0 .8.1 1.2l21-21.5v-1.2z" fill="#808080"/><path d="m271.2 776.7v-1.3l-20.8 21.2h1.2z" fill="#808080"/><path d="m271.2 780.5-15.8 16.1h1.2l14.6-14.8z" fill="#808080"/><path d="m271.2 785.6-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m271.2 790.8-5.8 5.8h1.3l4.5-4.6z" fill="#808080"/><path d="m270.4 796.6h.8v-.7z" fill="#808080"/><path d="m256.8 904.7h3.8 1.3 3.8 1.3 3.8.6v-.6-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.3-2.9c.3 12.9.5 25.1 1 36h2 1.3z" fill="#808080"/><path d="m275.7 868.7h1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.7-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8.8h.7z" fill="#e8e7e8"/><path d="m306.4 874.5-29.6 30.2h3.8l25.8-26.4z" fill="#e8e7e8"/><path d="m306.4 884.7-19.5 20h3.7l15.8-16.1z" fill="#e8e7e8"/><path d="m302 868.7-30.8 31.5v3.9l34.6-35.4z" fill="#e8e7e8"/><path d="m306.4 900.1-4.5 4.6h3.8l.7-.7z" fill="#e8e7e8"/><path d="m297 868.7-25.8 26.4v3.9l29.5-30.3z" fill="#e8e7e8"/><path d="m271.9 868.7-.7.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m306.4 879.6-24.6 25.1h3.8l20.8-21.2z" fill="#e8e7e8"/><path d="m306.4 895-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m306.4 889.9-14.5 14.8h3.7l10.8-11z" fill="#e8e7e8"/><path d="m306.4 869.4-34.6 35.3h3.8l30.8-31.5z" fill="#e8e7e8"/><path d="m276.9 868.7-5.7 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m281.9 868.7-10.7 11v3.9l14.5-14.9z" fill="#e8e7e8"/><path d="m287 868.7-15.8 16.2v3.8l19.5-20z" fill="#e8e7e8"/><path d="m292 868.7-20.8 21.3v3.8l24.5-25.1z" fill="#e8e7e8"/><path d="m271.2 868.7v.8l.7-.8z" fill="#808080"/><path d="m275.7 868.7-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m280.7 868.7-9.5 9.7v1.3l10.7-11z" fill="#808080"/><path d="m285.7 868.7-14.5 14.9v1.3l15.8-16.2z" fill="#808080"/><path d="m290.7 868.7-19.5 20v1.3l20.8-21.3z" fill="#808080"/><path d="m295.7 868.7-24.5 25.1v1.3l25.8-26.4z" fill="#808080"/><path d="m300.7 868.7-29.5 30.3v1.2l30.8-31.5z" fill="#808080"/><path d="m306.4 869.4v-.7h-.6l-34.6 35.4v.6h.6z" fill="#808080"/><path d="m306.4 873.2-30.8 31.5h1.2l29.6-30.2z" fill="#808080"/><path d="m306.4 878.3-25.8 26.4h1.2l24.6-25.1z" fill="#808080"/><path d="m306.4 883.5-20.8 21.2h1.3l19.5-20z" fill="#808080"/><path d="m306.4 888.6-15.8 16.1h1.3l14.5-14.8z" fill="#808080"/><path d="m306.4 893.7-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m306.4 898.8-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m305.7 904.7h.7v-.7z" fill="#808080"/><path d="m271.2 852.6v-3.8l-18.7 19.1v.9h2.9z" fill="#e8e7e8"/><path d="m251.7 832.7c0 1.3.1 2.5.1 3.8l3.7-3.8z" fill="#e8e7e8"/><path d="m271.2 843.6-18.8 19.2c0 1.3.1 2.5.1 3.8l18.7-19.1z" fill="#e8e7e8"/><path d="m271.2 864.1-4.5 4.6h3.7l.8-.8z" fill="#e8e7e8"/><path d="m271.2 859-9.5 9.7h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m261.8 832.7-9.8 10c0 1.3.1 2.5.1 3.8l13.5-13.8z" fill="#e8e7e8"/><path d="m266.8 832.7-14.7 15c0 1.3.1 2.5.1 3.8l18.4-18.8z" fill="#e8e7e8"/><path d="m271.2 853.8-14.6 14.9h3.8l10.8-11z" fill="#e8e7e8"/><path d="m271.2 838.5-18.9 19.3c0 1.3.1 2.5.1 3.8l18.8-19.2z" fill="#e8e7e8"/><path d="m256.8 832.7-4.9 5c0 1.3.1 2.5.1 3.7l8.6-8.8h-3.8z" fill="#e8e7e8"/><path d="m271.2 833.3-19 19.4c0 1.3.1 2.5.1 3.8l18.9-19.3z" fill="#e8e7e8"/><path d="m255.5 832.7-3.7 3.8v1.3l4.9-5h-1.2z" fill="#808080"/><path d="m260.5 832.7-8.6 8.8v1.3l9.8-10h-1.2z" fill="#808080"/><path d="m265.5 832.7-13.5 13.8v1.3l14.7-15h-1.2z" fill="#808080"/><path d="m271.2 832.7h-.6l-18.4 18.8v1.3l19-19.4z" fill="#808080"/><path d="m271.2 837.2-18.9 19.3v1.3l18.9-19.3z" fill="#808080"/><path d="m271.2 842.3-18.8 19.2v1.3l18.8-19.2z" fill="#808080"/><path d="m271.2 847.4-18.7 19.1v1.3l18.7-19.1z" fill="#808080"/><path d="m271.2 852.6-15.8 16.1h1.2l14.6-14.9z" fill="#808080"/><path d="m271.2 857.7-10.8 11h1.3l9.5-9.7z" fill="#808080"/><path d="m271.2 862.8-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m270.4 868.7h.8v-.8z" fill="#808080"/><path d="m271.2 965.9v-3.9-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-.2c1.6 10.2 3.9 17.7 7.3 21.8 1.5 1.8 4 3.4 7.3 5v-.4-1.3z" fill="#808080"/><path d="m306.4 936.3v-1.3-3.9-1.2-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-.8h-.7-3.8-1.3-3.7-1.3-3.7-1.3-3.7-1.3-3.8-1.2-3.8-1.2-3.8-.6v.7 3.8 1.3 3.8 1.3 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.3 3.8.8h.7 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7 1.3 3.7 1.3 3.8.6v-.7z" fill="#e8e7e8"/><path d="m306.4 961.9-12.2 12.5c1 .2 2.1.4 3.1.6l9.1-9.3z" fill="#e8e7e8"/><path d="m302 940.8-27.5 28.2c.9.3 1.8.7 2.8 1l28.5-29.2z" fill="#e8e7e8"/><path d="m271.9 940.8-.7.7v3.9l4.5-4.6z" fill="#e8e7e8"/><path d="m306.4 946.5-24.3 24.9c1 .3 1.9.5 3 .8l21.4-21.9v-3.8z" fill="#e8e7e8"/><path d="m306.4 951.7-20.4 20.8c1 .3 2 .5 3 .7l17.3-17.7v-3.8z" fill="#e8e7e8"/><path d="m306.4 967.1-8 8.2c1 .2 2.1.4 3.2.6l4.8-4.9z" fill="#e8e7e8"/><path d="m306.4 956.8-16.3 16.7c1 .2 2 .5 3.1.7l13.2-13.5z" fill="#e8e7e8"/><path d="m306.4 941.4-28.2 28.8c.9.3 1.9.6 2.9.9l25.3-25.9z" fill="#e8e7e8"/><path d="m297 940.8-25.8 26.4v.4c.8.4 1.6.7 2.4 1l27.2-27.8z" fill="#e8e7e8"/><path d="m281.9 940.8-10.7 11v3.8l14.5-14.8z" fill="#e8e7e8"/><path d="m292 940.8-20.8 21.2v3.9l24.5-25.1z" fill="#e8e7e8"/><path d="m276.9 940.8-5.7 5.9v3.8l9.5-9.7z" fill="#e8e7e8"/><path d="m287 940.8-15.8 16.1v3.9l19.5-20z" fill="#e8e7e8"/><path d="m306.4 972.2-3.8 3.9c1.1.2 2.1.4 3.2.6l.6-.6z" fill="#e8e7e8"/><path d="m271.2 940.8v.7l.7-.7z" fill="#808080"/><path d="m275.7 940.8-4.5 4.6v1.3l5.7-5.9z" fill="#808080"/><path d="m280.7 940.8-9.5 9.7v1.3l10.7-11z" fill="#808080"/><path d="m285.7 940.8-14.5 14.8v1.3l15.8-16.1z" fill="#808080"/><path d="m290.7 940.8-19.5 20v1.2l20.8-21.2z" fill="#808080"/><path d="m271.2 965.9v1.3l25.8-26.4h-1.3z" fill="#808080"/><path d="m300.7 940.8-27.2 27.8c.3.1.6.2.9.4l27.5-28.2z" fill="#808080"/><path d="m306.4 940.8h-.6l-28.5 29.2c.3.1.6.2.9.3l28.2-28.8z" fill="#808080"/><path d="m306.4 945.2-25.3 25.9c.3.1.6.2 1 .3l24.3-24.9z" fill="#808080"/><path d="m306.4 950.4-21.4 21.8c.3.1.7.2 1 .3l20.4-20.8z" fill="#808080"/><path d="m306.4 955.5-17.3 17.7c.3.1.7.2 1 .2l16.3-16.7z" fill="#808080"/><path d="m306.4 960.6-13.2 13.5c.3.1.7.1 1 .2l12.2-12.5z" fill="#808080"/><path d="m306.4 965.8-9.1 9.3c.4.1.7.1 1.1.2l8-8.2z" fill="#808080"/><path d="m306.4 970.9-4.8 4.9c.4.1.7.1 1.1.2l3.8-3.9v-1.2z" fill="#808080"/><path d="m305.8 976.6c.2 0 .4.1.6.1v-.7z" fill="#808080"/><path d="m271.2 931-9.5 9.8h3.7l5.8-5.9z" fill="#e8e7e8"/><path d="m271.2 936.2-4.5 4.6h3.7l.8-.8z" fill="#e8e7e8"/><path d="m271.2 925.9-14.6 14.9h3.8l10.8-11.1z" fill="#e8e7e8"/><path d="m271.2 910.5-16.3 16.7c.1 1.2.2 2.4.3 3.5l16-16.3z" fill="#e8e7e8"/><path d="m271.2 920.8-15.3 15.6c.1 1.2.3 2.3.5 3.4l14.8-15.2z" fill="#e8e7e8"/><path d="m271.2 915.6-15.8 16.2c.1 1.2.3 2.3.4 3.4l15.4-15.8z" fill="#e8e7e8"/><path d="m271.2 905.4-16.7 17.1c.1 1.2.2 2.4.3 3.6l16.4-16.8z" fill="#e8e7e8"/><path d="m270.5 904.7h-3.8l-12.6 12.9c.1 1.2.2 2.4.2 3.6z" fill="#e8e7e8"/><path d="m255.5 904.7h-2c0 .6.1 1.3.1 1.9z" fill="#e8e7e8"/><path d="m265.5 904.7h-3.8l-7.9 8.1c.1 1.2.1 2.4.2 3.6z" fill="#e8e7e8"/><path d="m260.5 904.7h-3.8l-3.1 3.2c.1 1.2.1 2.5.2 3.7z" fill="#e8e7e8"/><path d="m256.8 904.7h-1.3l-1.9 1.9c0 .4 0 .8.1 1.2z" fill="#808080"/><path d="m261.8 904.7h-1.3l-6.7 6.8c0 .4 0 .8.1 1.2z" fill="#808080"/><path d="m266.8 904.7h-1.3l-11.4 11.7c0 .4 0 .8.1 1.2z" fill="#808080"/><path d="m271.2 904.7h-.6l-16.1 16.5c0 .4.1.8.1 1.2l16.7-17.1v-.6z" fill="#808080"/><path d="m271.2 909.2-16.4 16.8c0 .4.1.8.1 1.2l16.3-16.7z" fill="#808080"/><path d="m271.2 914.3-16 16.3c0 .4.1.8.1 1.2l15.8-16.2v-1.3z" fill="#808080"/><path d="m271.2 919.5-15.4 15.8c0 .4.1.8.1 1.1l15.3-15.6z" fill="#808080"/><path d="m271.2 925.9v-1.3l-14.8 15.2c0 .3.1.7.1 1h.2z" fill="#808080"/><path d="m271.2 929.7-10.8 11.1h1.3l9.5-9.8z" fill="#808080"/><path d="m271.2 934.9-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m270.4 940.8h.8v-.8z" fill="#808080"/><path d="m196.4 472.4h3.8.6v-.6-3.8-1.3-3.8-1.3-3.8-1.3-.5c-3.7 4.5-6.1 9.9-7.9 16.6h2.2 1.3z" fill="#808080"/><path d="m200.7 466.6 23.6-24.2c-1.9.5-3.7 1.1-5.4 1.6l-18.3 18.7v3.9z" fill="#e8e7e8"/><path d="m225.2 472.4 10.8-11v-3.9l-14.6 14.9z" fill="#e8e7e8"/><path d="m200.7 471.7 30.2-30.8c-1.7.3-3.3.7-4.8 1.1l-25.3 25.9v3.8z" fill="#e8e7e8"/><path d="m200.7 461.5 16.3-16.7c-2.5 1-4.8 2-6.9 3.2l-9.4 9.6z" fill="#e8e7e8"/><path d="m205.1 472.4 30.8-31.5v-.9c-1.2.2-2.4.4-3.5.6l-31.1 31.8z" fill="#e8e7e8"/><path d="m235.2 472.4.8-.8v-3.8l-4.5 4.6z" fill="#e8e7e8"/><path d="m220.2 472.4 15.8-16.2v-3.8l-19.6 20z" fill="#e8e7e8"/><path d="m210.1 472.4 25.9-26.4v-3.9l-29.6 30.3z" fill="#e8e7e8"/><path d="m230.2 472.4 5.8-5.9v-3.9l-9.6 9.8z" fill="#e8e7e8"/><path d="m215.2 472.4 20.8-21.3v-3.8l-24.6 25.1z" fill="#e8e7e8"/><path d="m206.8 450.1c-2.3 1.7-4.3 3.6-6.1 5.6v.5z" fill="#e8e7e8"/><path d="m200.7 457.6 9.4-9.6c-1.2.7-2.3 1.4-3.4 2.2l-6.1 6.2v1.2z" fill="#808080"/><path d="m200.7 462.8 18.3-18.7c-.7.2-1.3.5-2 .7l-16.3 16.7z" fill="#808080"/><path d="m200.7 467.9 25.3-25.9c-.6.1-1.1.3-1.7.4l-23.6 24.2z" fill="#808080"/><path d="m200.7 472.4h.6l31.1-31.8c-.5.1-1.1.2-1.6.3l-30.2 30.8v.7z" fill="#808080"/><path d="m236 442.1v-1.3l-30.9 31.6h1.3z" fill="#808080"/><path d="m211.4 472.4 24.6-25.1v-1.3l-25.9 26.4z" fill="#808080"/><path d="m216.4 472.4 19.6-20v-1.3l-20.8 21.3z" fill="#808080"/><path d="m221.4 472.4 14.6-14.9v-1.3l-15.8 16.2z" fill="#808080"/><path d="m226.4 472.4 9.6-9.8v-1.2l-10.8 11z" fill="#808080"/><path d="m231.5 472.4 4.5-4.6v-1.3l-5.8 5.9z" fill="#808080"/><path d="m236 472.4v-.8l-.8.8z" fill="#808080"/><path d="m200.7 544.4v-.6-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.5-3.8-.8h-.7-3.8-1.2-3.8-1.2-.2c1.5 9.6 4.5 21.9 8.4 36h1.9z" fill="#808080"/><path d="m205.2 508.4h1.3 3.8 1.2 3.8 1.2 3.8 1.2 3.8 1.3 3.7 1.3 3.7.7v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.9-1.3-3.8-1.3-3.8-1.3-3.9-.7h-.8-3.7-1.3-3.8-1.2-3.8-1.2-3.8-1.2-3.8-1.3-3.7-1.3-3.7-.7v.6 3.9 1.3 3.8 1.3 3.8 1.3 3.9 1.2 3.9 1.3 3.8 1.3 3.8.8h.8z" fill="#e8e7e8"/><path d="m201.5 508.4-.8.8v3.8l4.5-4.6z" fill="#e8e7e8"/><path d="m226.6 508.4-25.9 26.4v3.9l29.6-30.3z" fill="#e8e7e8"/><path d="m231.6 508.4-30.9 31.5v3.9l34.6-35.4z" fill="#e8e7e8"/><path d="m216.5 508.4-15.8 16.2v3.8l19.6-20z" fill="#e8e7e8"/><path d="m236 514.2-29.6 30.2h3.7l25.9-26.4z" fill="#e8e7e8"/><path d="m221.5 508.4-20.8 21.3v3.8l24.6-25.1z" fill="#e8e7e8"/><path d="m236 509.1-34.6 35.3h3.7l30.9-31.5z" fill="#e8e7e8"/><path d="m206.5 508.4-5.8 5.9v3.8l9.6-9.7z" fill="#e8e7e8"/><path d="m236 534.7-9.6 9.7h3.8l5.8-5.9z" fill="#e8e7e8"/><path d="m211.5 508.4-10.8 11v3.9l14.6-14.9z" fill="#e8e7e8"/><path d="m236 539.8-4.5 4.6h3.7l.8-.7z" fill="#e8e7e8"/><path d="m236 529.6-14.6 14.8h3.8l10.8-11z" fill="#e8e7e8"/><path d="m236 524.4-19.6 20h3.8l15.8-16.1z" fill="#e8e7e8"/><path d="m236 519.3-24.6 25.1h3.8l20.8-21.2z" fill="#e8e7e8"/><path d="m200.7 508.4v.8l.8-.8z" fill="#808080"/><path d="m205.2 508.4-4.5 4.6v1.3l5.8-5.9z" fill="#808080"/><path d="m210.3 508.4-9.6 9.7v1.3l10.8-11z" fill="#808080"/><path d="m215.3 508.4-14.6 14.9v1.3l15.8-16.2z" fill="#808080"/><path d="m220.3 508.4-19.6 20v1.3l20.8-21.3z" fill="#808080"/><path d="m225.3 508.4-24.6 25.1v1.3l25.9-26.4z" fill="#808080"/><path d="m230.3 508.4-29.6 30.3v1.2l30.9-31.5z" fill="#808080"/><path d="m236 508.4h-.7l-34.6 35.4v.6h.7l34.6-35.3z" fill="#808080"/><path d="m236 512.9-30.9 31.5h1.3l29.6-30.2z" fill="#808080"/><path d="m236 518-25.9 26.4h1.3l24.6-25.1z" fill="#808080"/><path d="m236 523.2-20.8 21.2h1.2l19.6-20z" fill="#808080"/><path d="m236 528.3-15.8 16.1h1.2l14.6-14.8z" fill="#808080"/><path d="m236 533.4-10.8 11h1.2l9.6-9.7z" fill="#808080"/><path d="m236 538.5-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m235.2 544.4h.8v-.7z" fill="#808080"/><path d="m192.9 472.4c-.3 1-.5 2-.8 3.1l3-3.1z" fill="#e8e7e8"/><path d="m196.4 472.4-4.6 4.7c-.3 1.6-.7 3.2-1 4.8l9.4-9.6h-3.8z" fill="#e8e7e8"/><path d="m200.7 473-10.3 10.5c-.3 1.5-.5 3-.8 4.6l11-11.3v-3.8z" fill="#e8e7e8"/><path d="m200.7 503.8-4.5 4.6h3.8l.7-.8z" fill="#e8e7e8"/><path d="m200.7 498.7-9.5 9.7h3.8l5.7-5.9z" fill="#e8e7e8"/><path d="m200.7 483.3-12 12.3c0 1.2 0 2.4.1 3.8l11.9-12.2z" fill="#e8e7e8"/><path d="m200.7 478.2-11.3 11.6c-.1.9-.3 1.9-.4 2.8-.1.5-.1 1.1-.2 1.6l11.9-12.2z" fill="#e8e7e8"/><path d="m200.7 488.4-11.9 12.1c.1 1.1.2 2.3.3 3.5l11.5-11.8v-3.8z" fill="#e8e7e8"/><path d="m200.7 497.4v-3.8l-11.4 11.7c.1 1 .3 2.1.5 3.2h.2z" fill="#e8e7e8"/><path d="m195.1 472.4-3 3.1c-.1.6-.3 1.1-.4 1.7l4.6-4.7h-1.2z" fill="#808080"/><path d="m200.7 472.4h-.6l-9.4 9.6c-.1.5-.2 1-.3 1.6l10.3-10.5z" fill="#808080"/><path d="m200.7 476.9-11 11.3c-.1.5-.2 1-.2 1.5l11.3-11.6v-1.2z" fill="#808080"/><path d="m200.7 482-11.9 12.2c0 .4-.1.9-.1 1.4l12-12.3z" fill="#808080"/><path d="m200.7 487.1-11.9 12.2c0 .4 0 .8.1 1.2l11.9-12.1v-1.3z" fill="#808080"/><path d="m200.7 492.3-11.5 11.8c0 .4.1.8.1 1.1l11.4-11.7z" fill="#808080"/><path d="m200.7 497.4-10.7 11h1.2l9.5-9.7z" fill="#808080"/><path d="m200.7 502.5-5.7 5.9h1.2l4.5-4.6z" fill="#808080"/><path d="m200 508.4h.7v-.8z" fill="#808080"/><path d="m211.5 580.5h3.8 1.3 3.8 1.3 3.8 1.3 3.8 1.3 3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.5-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.6v.6 3.8 1.3 3.2c2.4 8.5 5.1 17.6 7.9 27.1h1.6 1.4z" fill="#e8e7e8"/><path d="m236 581.1-20.8 21.3c.3 1 .6 2 .9 3l19.9-20.4z" fill="#e8e7e8"/><path d="m208.7 580.5c.1.4.2.8.4 1.3l1.2-1.3z" fill="#e8e7e8"/><path d="m211.5 580.5-2.2 2.2c.3 1 .6 2 .9 2.9l5.1-5.2h-3.8z" fill="#e8e7e8"/><path d="m236 601.6-14.6 14.9h3.8l10.8-11z" fill="#e8e7e8"/><path d="m216.5 580.5-6 6.2c.3 1 .6 2 .9 2.9l8.9-9.1z" fill="#e8e7e8"/><path d="m236 611.9-4.5 4.6h3.7l.8-.8z" fill="#e8e7e8"/><path d="m236 606.8-9.6 9.7h3.8l5.8-5.9z" fill="#e8e7e8"/><path d="m236 591.4-18.5 18.9c.3 1 .6 2 .9 3l17.6-18z" fill="#e8e7e8"/><path d="m236 586.2-19.6 20.1c.3 1 .6 2 .9 3l18.8-19.2v-3.9z" fill="#e8e7e8"/><path d="m236 600.3v-3.8l-17.3 17.7c.2.8.4 1.5.7 2.3h.9z" fill="#e8e7e8"/><path d="m226.6 580.5-13.7 14c.3 1 .6 2 .9 2.9l16.6-17h-3.8z" fill="#e8e7e8"/><path d="m221.5 580.5-9.9 10.1c.3 1 .6 2 .9 2.9l12.8-13.1h-3.8z" fill="#e8e7e8"/><path d="m231.6 580.5-17.6 18 .9 3 20.5-20.9h-3.8z" fill="#e8e7e8"/><path d="m210.3 580.5-1.2 1.3c.1.3.2.7.3 1l2.2-2.2h-1.3z" fill="#808080"/><path d="m215.3 580.5-5.1 5.2c.1.3.2.7.3 1l6-6.2z" fill="#808080"/><path d="m220.3 580.5-8.9 9.1c.1.3.2.7.3 1l9.9-10.1z" fill="#808080"/><path d="m225.3 580.5-12.8 13.1c.1.3.2.7.3 1l13.7-14h-1.2z" fill="#808080"/><path d="m230.3 580.5-16.6 17c.1.3.2.7.3 1l17.6-18z" fill="#808080"/><path d="m236 580.5h-.6l-20.5 20.9c.1.3.2.7.3 1l20.8-21.3z" fill="#808080"/><path d="m236 585-20 20.3c.1.3.2.7.3 1l19.6-20.1v-1.2z" fill="#808080"/><path d="m236 590.1-18.8 19.2c.1.3.2.7.3 1l18.5-18.9z" fill="#808080"/><path d="m236 595.2-17.6 18c.1.3.2.7.3 1l17.3-17.7z" fill="#808080"/><path d="m236 600.3-15.8 16.2h1.2l14.6-14.9z" fill="#808080"/><path d="m236 605.5-10.8 11h1.2l9.6-9.7z" fill="#808080"/><path d="m236 610.6-5.8 5.9h1.3l4.5-4.6z" fill="#808080"/><path d="m235.2 616.5h.8v-.8z" fill="#808080"/><path d="m200.7 545.1-1.8 1.9c.3 1 .6 2 .8 3l1-1z" fill="#e8e7e8"/><path d="m200 550.9c.2.8.5 1.6.7 2.5v-3.2z" fill="#e8e7e8"/><path d="m198.2 544.4c.1.5.3 1 .4 1.5l1.5-1.5z" fill="#e8e7e8"/><path d="m200.7 544.4h-.6l-1.5 1.5c.1.3.2.7.3 1l1.8-1.9z" fill="#808080"/><path d="m200.7 548.9-1 1c.1.3.2.7.3 1l.7-.7z" fill="#808080"/><path d="m231.6 652.5h3.8.6v-.6-3.9-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-1.3-3.8-.8h-.7-3.8-1.3-3.8-1.3-3.8-1.3-.9c3.4 11.9 6.8 24 10 36h1 1.5z" fill="#e8e7e8"/><path d="m231.6 652.5-1.8 1.9c.3 1 .5 2 .8 3l4.8-4.9z" fill="#e8e7e8"/><path d="m236 663.4-3.1 3.2c.3 1 .5 2.1.7 3.1l2.4-2.4z" fill="#e8e7e8"/><path d="m229.3 652.5c.1.3.1.6.2.8l.8-.8z" fill="#e8e7e8"/><path d="m236 658.3-4.1 4.2c.3 1 .5 2 .8 3.1l3.4-3.4v-3.9z" fill="#e8e7e8"/><path d="m236 653.2-5.2 5.3c.3 1 .5 2 .8 3l4.4-4.5z" fill="#e8e7e8"/><path d="m235.8 679c.1.3.1.5.2.8v-1z" fill="#e8e7e8"/><path d="m236 668.6-2.1 2.2c.2 1 .5 2.1.7 3.1l1.4-1.4z" fill="#e8e7e8"/><path d="m236 673.7-1.1 1.2c.2 1 .5 2.1.7 3.1l.4-.4z" fill="#e8e7e8"/><path d="m230.3 652.5-.8.8c.1.3.2.7.3 1l1.8-1.9h-1.3z" fill="#808080"/><path d="m236 652.5h-.6l-4.8 4.9c.1.3.2.7.3 1l5.2-5.3v-.6z" fill="#808080"/><path d="m236 657-4.4 4.5c.1.3.2.7.3 1l4.1-4.2z" fill="#808080"/><path d="m236 662.1-3.4 3.4c.1.3.2.7.3 1l3.1-3.2z" fill="#808080"/><path d="m236 667.3-2.4 2.4c.1.3.2.7.2 1l2.1-2.2v-1.2z" fill="#808080"/><path d="m236 672.4-1.4 1.4c.1.3.2.7.2 1l1.1-1.2v-1.2z" fill="#808080"/><path d="m236 677.5-.4.4c.1.3.2.7.2 1l.2-.2z" fill="#808080"/><path d="m303.3 226.2h2.3c-1-7.8-1.9-15.5-2.9-22.8-4.9-37.9-10.3-148.4 115.9-148.4 114.3 0 120.8 110.5 115.9 148.3-1 7.3-1.9 15-2.9 22.8h2.3c20.1-14.9 21.8 23.9 13.4 37.2-6.9 11-7.1 12.2-11.3 24.2-3.1 8.9-8.2 10.1-12.5 9.1-.5 5.3-1 9.9-1.3 13.5-1.8 20.4-50.9 61.2-62 74-10.4 12-27.8 7.3-33.3 7-5.6-.3-8.3-.4-8.3-.4s-2.7.1-8.3.4-22.9 4.9-33.3-7c-11.1-12.8-60.1-53.6-62-74-.3-3.7-.8-8.3-1.3-13.5-4.3 1-9.4-.2-12.5-9.1-4.2-12.1-4.3-13.3-11.3-24.2-8.3-13.2-6.7-52 13.4-37.1z" fill="#b56441"/><path d="m321.1 287.5s2.3 6 2.3 6c16.8 51.4 66 65.6 92.2 66.4 1 0 1.5-22.8 1.5-22.8-1.5 0 6.4-.3 6.8 0 0 0 .6 22.6 1.1 22.6 24.5-1.1 73-12.5 88.9-61.1 0 0 2.2-11.1 2.2-11.1.4-1.5 11.9-47.9 13-43.6-.4 3.4-.8 6.8-1.3 10.2 0 0-2.5 29.6-4.3 42.7-.5 5.3-.9 9.9-1.3 13.5-2.5 20.2-8 26.7-12.8 34.2 0 0 0 .1-.1.1-15.8 19.6-36.1 41.7-43.7 50.4-10.4 12-33.1 12.7-38.7 12.4-5.2-.2-7.9-.4-8.2-.4h-.1c-.4 0-3 .2-8.2.4-5.6.3-28.3-.4-38.7-12.4-7.7-8.8-27.9-30.9-43.7-50.4 0 0 0-.1-.1-.1-4.9-7.5-10.4-14-12.8-34.2-.4-3.6-.8-8.3-1.3-13.5-1.9-13.1-4.3-42.7-4.3-42.7-.4-3.4-.8-6.8-1.3-10.2 1-4.4 12.6 42.1 12.9 43.6z" fill="#582d11"/><path d="m422.1 298c10.9-.1 49 14 46.4 17.9-8.2 10.1-30.4-10.9-46.9-10.1-27 1.4-38.7 20.2-46.9 10.1-2.6-3.9 34.3-17.8 47.4-17.9z" fill="#582d11"/><path d="m533.7 209.3c-4.6 2.5-13.2-25.6-37.2-44.9-6.7-5.4-26.4-21.5-78-21.5v-92.5s51.9-3.6 86.9 33.7c35.2 37.3 44.1 116.9 28.3 125.2z" fill="#b56441"/><path d="m303.5 209.3c4.7 2.5 13.2-25.6 37.2-44.9 6.7-5.4 26.4-21.5 78-21.5v-92.5s-51.9-3.6-86.9 33.7c-35.1 37.3-44 116.9-28.3 125.2z" fill="#b56441"/><path d="m481.8 392.2-63 31.3 5.4 67.5 90.7-59.1z" fill="#e0e0e0"/><path d="m355.2 392.8 63.6 30.7-4.9 67.5-94.8-57z" fill="#e0e0e0"/><path d="m533.6 994.8-40.1-.1 73.2-559.5c6.2.6 27.9 3 31.9 4.3 3.9 1.3-65 555.3-65 555.3z" fill="#4189c6"/><path d="m318.7 980.6 43 4.6-67.6-552.1c-6.2.6-30.1 3.4-35.2 3.9z" fill="#4189c6"/><path d="m407.9 693.6c0 3.2 2.6 5.7 5.7 5.7 3.2 0 5.7-2.6 5.7-5.7s-2.6-5.7-5.7-5.7c-3.1-.1-5.7 2.5-5.7 5.7z" fill="#4189c6"/><path d="m407.9 601.1c0 3.2 2.6 5.7 5.7 5.7 3.2 0 5.7-2.6 5.7-5.7 0-3.2-2.6-5.7-5.7-5.7-3.1-.1-5.7 2.5-5.7 5.7z" fill="#4189c6"/><path d="m405.2 508.5c0 3.2 2.6 5.7 5.7 5.7 3.2 0 5.7-2.6 5.7-5.7 0-3.2-2.6-5.7-5.7-5.7s-5.7 2.6-5.7 5.7z" fill="#4189c6"/><path d="m413.7 786.1c0 3.2 2.6 5.7 5.7 5.7 3.2 0 5.7-2.6 5.7-5.7 0-3.2-2.6-5.7-5.7-5.7s-5.7 2.5-5.7 5.7z" fill="#4189c6"/><path d="m417.4 878.6c0 3.2 2.6 5.7 5.7 5.7 3.2 0 5.7-2.6 5.7-5.7 0-3.2-2.6-5.7-5.7-5.7s-5.7 2.6-5.7 5.7z" fill="#4189c6"/><path d="m365.2 203c12.8 0 23.2 10.4 23.2 23.2s-10.4 23.2-23.2 23.2-23.2-10.4-23.2-23.2 10.4-23.2 23.2-23.2z" fill="#fff"/><path d="m374.5 226c0 5.4-4.4 9.9-9.9 9.9-4 0-7.5-2.4-9-5.9.6.4 1.3.6 2 .6 2.3 0 4.1-1.8 4.1-4.1s-1.8-4.1-4.1-4.1c-.9 0-1.8.3-2.4.8 1.2-4 5-7 9.4-7 5.5-.1 9.9 4.4 9.9 9.8z" fill="#3f2609"/><path d="m470.2 203c12.8 0 23.2 10.4 23.2 23.2s-10.4 23.2-23.2 23.2-23.2-10.4-23.2-23.2 10.4-23.2 23.2-23.2z" fill="#fff"/><path d="m479.5 226c0 5.4-4.4 9.9-9.9 9.9-4 0-7.5-2.4-9-5.9.6.4 1.3.6 2 .6 2.3 0 4.1-1.8 4.1-4.1s-1.8-4.1-4.1-4.1c-.9 0-1.8.3-2.4.8 1.2-4 5-7 9.4-7 5.5-.1 9.9 4.4 9.9 9.8z" fill="#3f2609"/><path d="m433.9 443s-88.1-49.1-95.1-17.5-15.1 55.7 8.2 59.7c23.3 4.1 86.9-42.2 86.9-42.2z" fill="#3373aa"/><path d="m418.6 435.7c24.8-13.4 73.9-36.4 79.9-13 8.2 31.5 17.1 55.3-6 60.2-16.2 3.5-53.2-17.3-73.8-29.9-.2-15.3.2-2.2-.1-17.3z" fill="#4189c6"/><path d="m367.1 164.6c-24.7.5-39 8.6-39 16.9 0 8.4 13.2 6 23 2.1s22.9-3.6 28.3.4 17.2 5.2 17.7-3.3-21.5-16.3-30-16.1z" fill="#582d11"/><path d="m467.9 164.4c24.7.5 39.1 8.5 39.1 16.9 0 8.3-13.2 6-23 2.1-9.9-3.9-22.9-3.6-28.4.4s-17.2 5.1-17.7-3.3c-.5-8.5 21.6-16.3 30-16.1z" fill="#582d11"/><path d="m388 323s8.4 14.5 31.7 14 31.2-14 31.2-14-15.2-4.9-27.5-4.9c-5.3 0-10.7 2.9-17.7 4.1s-17.7.8-17.7.8z" fill="#c18c7e"/><path d="m366.4 996-47 6.4c-.6.1-1.2-.4-1.3-1l-9-66.2c-.1-.6.4-1.2 1-1.3l47-6.4c.6-.1 1.2.4 1.3 1l9 66.2c.1.6-.4 1.2-1 1.3z" fill="#474b56"/><path d="m536.9 1006.1-47.1-6c-.6-.1-1.1-.6-1-1.3l8.4-66.3c.1-.6.6-1.1 1.3-1l47.1 6c.6.1 1.1.6 1 1.3l-8.4 66.3c-.1.6-.7 1-1.3 1z" fill="#474b56"/><path d="m241.3 769.1c-8.2 5.4-16.6 10.4-25.2 14.9-2.1 1.1-5 3.4-7.5 2-1.4-.8-2.8-4.6-3.6-6-2.5-4.4-4.7-8.9-6.7-13.6-.7-1.8-3.6-1-2.9.8 2.3 5.4 4.8 10.7 7.8 15.8 1.6 2.8 3.2 7.1 7.1 6.8 2-.1 4-1.5 5.6-2.4 3.1-1.6 6.2-3.3 9.2-5 6-3.4 11.9-7 17.7-10.8 1.6-.9.1-3.5-1.5-2.5z" fill="#3a3032"/><path d="m529.4 158.2c-.2-.1-.4-.2-.6-.3-51.9-25-108.1-49.9-163.6-34.2-35.2 10-65.9 21.4-76.3 23-11.3 1.8-23.8-10.9-17.8-17.3 22.9-24 55.4-29.7 62.5-30.1 23-1.4 39.3-1.7 62.2-1.4 43.9.5 87.4-3.2 130.8-10 8-1.3 12.2-10 23.8 1.7 16.4 16.5 13.6 54-2.6 77.3-3.1 4.8-11.8-4.1-18.4-8.7z" fill="#474b56"/><path d="m556.4 102.9c-51.3 10.2-107.5 6.7-159.7 6.8-47.7 0-71.5 7.9-112.2 37.3-9.4 6.8-19.2 11.1-8.3-13.4 16.8-37.7 65.3-74.1 132.5-85.3 49.3-8.2 100.3 5.2 138.7 38.8 7 6 7.6 13.2 9 15.8z" fill="#474b56"/><path d="m340.5 131.4c-12.4 3.6-11.9 11.5-62.3 22.3-22.4 4.8-19.1-20.2-19-20.6 3.9-16.6 37.5-30 59.9-25.4 5.6 1.2 75.4-23.5 143.1 8.6 28.7 13.6 39.8 12.1 82.3 48.9.9.7-.1 2.1-1.1 1.5-12.9-8.7-31.9-20-47-22.3 0 0 0 0-.1 0-36.8-9.2-50.8-24.8-92.3-22.7-50.7 2.6-64.3 8.3-63.5 9.7z" fill="#474b56"/><path d="m259.7 140.9s-10-18.5 36.9-37.8c57.3-23.6 109-.6 169.6 21.1 11.6 4.2 30.9 15.5 32.6 20.8.5 1.6-75-18.5-147.3-28.3-59.3-8.1-79.8-.1-91.8 24.2z" fill="#3d4251"/><path d="m133.7 771.9 10.7-50.9s32.1-9.9 72.6-5.6c40.5 4.2 56.3 24.5 56.3 24.5l-27.3 69-90.8-13.1c-14.4-2-23.9-12.6-21.5-23.9z" fill="#e0e0e0"/><path d="m171.2 781.3c26.6-56.3 75.4-163.5 85.6-211.3 1.7-7.9 5.1-15.3 10.4-21.3 13.1-15.3 24.5-10.5 32.9-1.2 11 12.3 14.6 29.5 10.1 45.4l-37.8 133.7s-35.9 100.9-45 121.5c-7.5 16.8-21 7.4-39.7-5.4-19.7-13.7-26.7-39.7-16.5-61.4z" fill="#b5694e"/><path d="m273.8 601.5c-12.3-11.8-48.4-109.2-33.7-123.2s36.1-36 47.8-39.8c11.8-3.8 20-7.6 28.2-3.8s30.3 17.3 32.6 29.1c2.3 11.9-28.1 33.4-32.5 44.3-4.4 10.8 3.8 43.4 1.5 52.2s-3.8 44.4-22.9 46.8c-19.1 2.3-8.8 6.3-21-5.6z" fill="#b56441"/><path d="m221.5 772c-1.2 1.4-2.3 2.5-3.2 3.3s-1.8 1.4-2.5 1.8c-.8.4-1.5.6-2.1.6-.7 0-1.4-.2-2.1-.5s-1.2-.7-1.5-1.2-.5-1.1-.5-1.7c-.1-.6-.1-1.3 0-2.1s.1-1.6.1-2.4c0 0 0-.3 0-.8s0-1.2 0-2.1c0-.8 0-1.8 0-2.8s0-2 .1-3c0-1 .1-1.9.1-2.8s.1-1.6.1-2.1c0-.3.1-.6.2-.9s.3-.6.6-.7c.2-.2.5-.3.8-.3.3-.1.6-.1.9 0 .3 0 .6.1.8.1.2.1.4.1.6.2s.2.1.3.1c.5.2.8.5.9.9s.2.8.1 1.3l-1.7 16.9 9.7-10.2c.2-.2.4-.3.7-.5s.6-.4 1-.5.8-.2 1.2-.2.8 0 1.2.2.7.5.8 1 .1 1-.2 1.6c-.2.5-.6 1.1-1.1 1.6-.5.6-1 1.1-1.6 1.7s-1.2 1.2-1.9 1.8c-.7.5-1.3 1.1-1.8 1.7z" fill="#333"/><path d="m238.4 760c-1.7-.7-3.2-1.8-4.7-3.2s-2.7-3-3.7-4.9c-1-1.8-1.8-3.9-2.3-6-.5-2.2-.6-4.4-.3-6.7-1.3.7-2.6 1.3-4 1.8-1.3.5-2.6.9-3.9 1.1s-2.5.4-3.7.3c-1.2 0-2.2-.3-3.2-.7-1.3-.5-2.4-1.2-3.4-2s-1.9-1.6-2.6-2.5c-.8-.9-1.4-1.9-1.9-2.9s-.8-2-1.1-3c-.2-1-.3-2-.2-2.9.1-1 .3-1.9.7-2.7.5-1.1 1.2-2.1 2.3-2.8 1-.8 2.3-1.3 3.9-1.6s3.5-.2 5.6.2c2.2.4 4.6 1.2 7.4 2.4 2 .9 3.9 1.8 5.6 2.7s3.4 1.9 4.9 2.9c.8-.5 1.6-1.1 2.4-1.7l2.4-1.8c.2-.1.4-.3.6-.4.2-.2.5-.4.7-.5.3-.2.5-.3.7-.4s.4-.1.5-.1c.1.1.2.2.3.3.1.2.1.3.2.5 0 .2.1.4.1.5v.4c0 .3 0 .6-.2.9-.3.7-.8 1.4-1.5 2.3-.7.8-1.5 1.7-2.4 2.6 2 1.5 3.8 3.1 5.4 4.7s2.9 3.2 4 4.7c1.1 1.6 2 3.1 2.7 4.6s1.2 2.9 1.4 4.3c.3 1.4.4 2.6.3 3.8s-.3 2.2-.7 3.2-1 1.8-1.8 2.4c-.8.7-1.7 1.1-2.7 1.4-1.1.3-2.2.3-3.5.2-1.3-.3-2.7-.7-4.3-1.4zm3.3-4.2c1.3.5 2.3.7 3.2.5s1.5-.7 1.8-1.5c.4-.8.4-1.9.1-3.2s-.9-2.9-2-4.5c-1-1.7-2.5-3.5-4.4-5.5s-4.3-3.9-7.2-6l-.7.5c-.3 1.4-.4 2.8-.3 4.2s.4 2.8.8 4.1.9 2.6 1.6 3.9c.7 1.2 1.4 2.3 2.2 3.4.8 1 1.6 1.9 2.4 2.6.9.6 1.7 1.2 2.5 1.5zm-28.2-19.4c1 .4 2.1.6 3.2.6 1.2 0 2.4-.2 3.7-.5 1.3-.4 2.6-.9 4-1.5 1.4-.7 2.8-1.4 4.3-2.3-1.6-1-3.4-1.9-5.2-2.9s-3.8-1.9-6-2.8c-1.5-.6-2.7-1.1-3.8-1.3-1.1-.3-2-.4-2.8-.3-.8 0-1.4.2-1.8.5-.5.3-.8.7-1 1.2s-.3 1-.3 1.5c0 .6.1 1.2.3 1.8s.5 1.2.8 1.9c.3.6.7 1.2 1.2 1.7l1.5 1.5c.7.3 1.3.7 1.9.9z" fill="#333"/><path d="m245.5 693.2c1.3 1.1 2.6 2.1 3.8 2.9s2.3 1.5 3.2 1.9c.8.4 1.6.5 2.2.3.6-.1 1.1-.6 1.5-1.4.1-.3.2-.7.2-1.2s-.1-1.1-.2-1.8-.4-1.6-.7-2.5-.7-2-1.2-3.2h.6 1.2c.6 0 1.3.1 2.3.1.6 1.3 1 2.7 1.4 3.9.3 1.3.6 2.4.7 3.5s.1 2.1 0 3-.3 1.7-.6 2.4c-.3.8-.8 1.4-1.4 2-.6.5-1.3.9-2 1.2-.8.2-1.6.3-2.5.3-.9-.1-1.9-.3-2.9-.8-.4-.2-.8-.4-1.3-.7s-1.1-.7-1.7-1.1-1.3-.9-2-1.5-1.5-1.2-2.3-1.8c-.5 1.7-1.1 3.4-1.6 5s-1 3.2-1.6 4.7c.9.8 1.7 1.6 2.6 2.4.8.8 1.6 1.5 2.4 2.2.7.7 1.4 1.3 2 1.9l1.5 1.5c1 1.2 1.7 2.2 2 3s.3 1.4.1 1.9c-.1.3-.3.6-.5.8s-.5.4-.8.6c-.3.1-.6.2-.9.2s-.6 0-1-.2c-.2-.1-.4-.2-.5-.3-1.7-1.3-3.2-2.7-4.7-4.1s-2.9-2.7-4.3-4.1c-.3.7-.6 1.3-1 1.9s-.8 1.1-1.3 1.5-1.1.7-1.7.9-1.4.3-2.2.3c-.2 0-.5-.1-.6-.1-.2 0-.4-.1-.5-.2-.5-.2-.7-.5-.6-.9.1-.2.3-.4.7-.6s.9-.4 1.7-.6c.2-.6.5-1.2.7-1.8s.5-1.2.8-1.9l.8-1.8c-1-.9-1.9-1.9-2.8-2.7-.9-.9-1.8-1.7-2.6-2.5-.6-.5-1.1-.9-1.7-1.4-.6-.4-1.2-.7-1.8-1-.5-.2-.9-.4-1.4-.5-.4-.1-.9-.1-1.2 0-.4.1-.7.2-1 .5-.3.2-.5.6-.7 1s-.3.8-.4 1.4c-.1.5-.1 1.2-.1 1.9s.1 1.5.2 2.4.4 1.9.7 3c.1.4.2.7.2 1s-.1.5-.1.7c0 .1-.2.1-.6 0-.3-.1-.8-.2-1.2-.5-.6-.3-1.2-.7-1.6-1.3s-.8-1.2-1.1-1.9-.5-1.5-.6-2.3-.2-1.7-.1-2.5c0-.8.1-1.6.3-2.4s.4-1.4.6-2c.4-.9.9-1.6 1.4-2.3.6-.7 1.3-1.2 2-1.6.8-.4 1.7-.6 2.6-.5 1 0 2.1.3 3.2.8.6.2 1.2.6 1.9 1.1s1.5 1 2.4 1.7c.9.6 1.8 1.3 2.7 2.1s1.9 1.6 2.9 2.4c.5-1.3 1-2.8 1.6-4.4s1.2-3.3 1.8-4.9c-1.8-1.5-3.6-3.2-5.5-4.9s-3.7-3.5-5.4-5.2c-.6-.6-1-1.2-1.2-1.9-.2-.6-.2-1.3.1-1.9.1-.3.3-.5.4-.7.2-.2.4-.4.6-.5s.5-.2.8-.2.6.1.9.2.6.3 1 .5.7.5 1.1.8c.6.6 1.3 1.3 2.1 2 .7.7 1.5 1.4 2.3 2.1s1.6 1.5 2.4 2.2 1.6 1.5 2.5 2.2c.3-.8.5-1.5.8-2.1.2-.6.4-1.1.5-1.4 0-.1.1-.3.1-.4s.1-.2.1-.3c.2-.4.3-.7.5-.8s.4-.3.5-.4c.2-.1.4-.1.6-.1s.4.1.7.2.5.3.6.4c.1.2.2.4.2.6v.6c0 .2-.1.4-.1.6-.1.4-.2.6-.2.8s-.1.3-.1.3v.1.1c0 .1-.1.2-.1.4-.1.2-.2.5-.3.9-.1.5-.3.9-.4 1.4-.5.6-.7 1-.8 1.4z" fill="#333"/><path d="m265.3 671.2c-.1.8-.1 1.7-.2 2.6 0 .9-.1 1.7-.1 2.6 0 .8-.1 1.6-.2 2.3s-.3 1.4-.5 1.9c-.3.6-.6 1-1 1.2s-.8.2-1.2.1c-.4-.2-.7-.4-1-.6-.3-.3-.5-.5-.7-.8s-.3-.6-.4-.8c-.1-.3-.1-.5-.2-.7l.9-14.7-9.7 11.6c-.3.4-.7.7-1 .8-.3.2-.8.1-1.2-.1 0 0-.1 0-.2-.1s-.3-.2-.5-.3-.4-.3-.6-.5-.4-.4-.5-.7c-.1-.2-.2-.5-.3-.8 0-.3 0-.6.2-.9.1-.3.3-.5.5-.8.3-.4.7-.8 1.2-1.4.5-.5 1.1-1.1 1.7-1.7l1.8-1.8c.6-.6 1.2-1.2 1.7-1.7s.9-.9 1.3-1.2c.3-.3.5-.5.5-.5.6-.6 1.2-1.1 1.7-1.7s1-1 1.5-1.4 1-.7 1.6-.8c.5-.1 1.2-.1 1.8.2.7.3 1.4.7 1.8 1.2.5.5.8 1.1 1.1 1.9.2.8.4 1.8.4 3.1 0 1.2-.1 2.7-.2 4.5z" fill="#333"/><path d="m705.2 772.5-16.2-49.3s-33-6.3-72.8 2.4-53.3 30.5-53.3 30.5l34.9 65.7 88.8-23c14-3.7 22.2-15.3 18.6-26.3z" fill="#e0e0e0"/><path d="m670.7 775.2c-26.6-56.3-75.4-163.5-85.6-211.3-1.7-7.9-5.1-15.3-10.4-21.3-13.1-15.3-24.5-10.5-32.9-1.2-11 12.3-14.6 29.5-10.1 45.4l37.8 133.7s35.9 100.9 45 121.5c7.5 16.8 21 7.4 39.7-5.4 19.6-13.7 26.7-39.7 16.5-61.4z" fill="#b5694e"/><path d="m568.1 595.4c12.3-11.8 48.4-109.2 33.7-123.2-14.7-14.1-36.1-36-47.8-39.8-11.8-3.8-20-7.6-28.2-3.8s-30.3 17.3-32.6 29.1c-2.3 11.9 28.1 33.4 32.5 44.3s-3.8 43.4-1.5 52.2 3.8 44.4 22.9 46.8c19 2.3 8.7 6.3 21-5.6z" fill="#b56441"/></svg> \ No newline at end of file diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_1_head-192.png b/borestop/src/main/webapp/content/images/jhipster_family_member_1_head-192.png new file mode 100755 index 0000000000000000000000000000000000000000..ac5f2a00ac809809f7e48628d79e04849ebad98b Binary files /dev/null and b/borestop/src/main/webapp/content/images/jhipster_family_member_1_head-192.png differ diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_1_head-256.png b/borestop/src/main/webapp/content/images/jhipster_family_member_1_head-256.png new file mode 100755 index 0000000000000000000000000000000000000000..443822e8ea1f8db01adc11f33e8685fb14b997dc Binary files /dev/null and b/borestop/src/main/webapp/content/images/jhipster_family_member_1_head-256.png differ diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_1_head-384.png b/borestop/src/main/webapp/content/images/jhipster_family_member_1_head-384.png new file mode 100755 index 0000000000000000000000000000000000000000..4a5e9fe4775b79347fcf33c97a7ad10e3f693b2c Binary files /dev/null and b/borestop/src/main/webapp/content/images/jhipster_family_member_1_head-384.png differ diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_1_head-512.png b/borestop/src/main/webapp/content/images/jhipster_family_member_1_head-512.png new file mode 100755 index 0000000000000000000000000000000000000000..66c625c10626011b5e142ce32ca009cbaea5f0bb Binary files /dev/null and b/borestop/src/main/webapp/content/images/jhipster_family_member_1_head-512.png differ diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_2.svg b/borestop/src/main/webapp/content/images/jhipster_family_member_2.svg new file mode 100755 index 0000000000000000000000000000000000000000..51c6a5a9865606b4cd332e008cb1ec79b39e7e40 --- /dev/null +++ b/borestop/src/main/webapp/content/images/jhipster_family_member_2.svg @@ -0,0 +1 @@ +<svg enable-background="new 0 0 792 1135.9" viewBox="0 0 792 1135.9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><clipPath id="a"><path d="m218.1 566.3h368.4v119.1h-368.4z" transform="matrix(.9975 -.0707811 .0707811 .9975 -43.287 30.0417)"/></clipPath><linearGradient id="b"><stop offset="0" stop-color="#a8aaaa"/><stop offset=".06716418" stop-color="#a1a3a3"/><stop offset=".08773019" stop-color="#a8aaaa"/><stop offset=".1178" stop-color="#bcbdbd"/><stop offset=".1535" stop-color="#dcdcdc"/><stop offset=".1766" stop-color="#f4f4f4"/><stop offset=".1785" stop-color="#eff0f0"/><stop offset=".1907" stop-color="#d7d7d7"/><stop offset=".2045" stop-color="#c3c4c4"/><stop offset=".2203" stop-color="#b5b6b6"/><stop offset=".2401" stop-color="#adaeae"/><stop offset=".2761" stop-color="#abacac"/><stop offset=".2957" stop-color="#9a9b9b"/><stop offset=".3202" stop-color="#8f9090"/><stop offset=".3546" stop-color="#888989"/><stop offset=".4502" stop-color="#868787"/><stop offset=".4883" stop-color="#8e8f8f"/><stop offset=".5924" stop-color="#9d9f9f"/><stop offset=".7107" stop-color="#a6a8a8"/><stop offset=".8731" stop-color="#a9abab"/><stop offset=".9627" stop-color="#dcdcdc"/></linearGradient><linearGradient id="c" gradientTransform="matrix(.7554 .6553 .6553 -.7554 -576.0345 2048.7961)" gradientUnits="userSpaceOnUse" x1="-188.9606" x2="-59.2798" xlink:href="#b" y1="1678.3533" y2="1603.4819"/><linearGradient id="d" gradientTransform="matrix(.7554 .6553 .6553 -.7554 -576.0345 2048.7961)" gradientUnits="userSpaceOnUse" x1="-192.1841" x2="-26.456" xlink:href="#b" y1="1696.2814" y2="1600.5984"/><linearGradient id="e" gradientTransform="matrix(.7554 .6553 .6553 -.7554 -576.0345 2048.7961)" gradientUnits="userSpaceOnUse" x1="-180.3568" x2="-42.2597" xlink:href="#b" y1="1695.8671" y2="1616.1365"/><linearGradient id="f" gradientTransform="matrix(.7554 .6553 .6553 -.7554 -576.0345 2048.7961)" gradientUnits="userSpaceOnUse" x1="-163.5929" x2="-66.7436" xlink:href="#b" y1="1682.6437" y2="1626.7278"/><linearGradient id="g" gradientTransform="matrix(.7554 .6553 .6553 -.7554 -576.0345 2048.7961)" gradientUnits="userSpaceOnUse" x1="-173.0439" x2="-37.0958" xlink:href="#b" y1="1698.9542" y2="1620.4646"/><linearGradient id="h" gradientTransform="matrix(.7554 .6553 .6553 -.7554 -576.0345 2048.7961)" gradientUnits="userSpaceOnUse" x1="-192.1338" x2="-12.7169" xlink:href="#b" y1="1720.593" y2="1617.0066"/><linearGradient id="i" gradientTransform="matrix(.7554 .6553 .6553 -.7554 -576.0345 2048.7961)" gradientUnits="userSpaceOnUse" x1="-182.9737" x2="-16.82" xlink:href="#b" y1="1715.4465" y2="1619.5176"/><linearGradient id="j" gradientTransform="matrix(.7554 .6553 .6553 -.7554 -576.0345 2048.7961)" gradientUnits="userSpaceOnUse" x1="-165.1052" x2="-31.8849" xlink:href="#b" y1="1710.3193" y2="1633.4045"/><path d="m417.8 361.5c-2 1.3-4 35-5.5 69.5-1.5-34.6-3.5-68.2-5.5-69.5-4.2-2.8-142.6 4.1-142.6 4.1v134.9s56.9 6.5 148.1 5.8c91.2.7 148.1-5.8 148.1-5.8v-134.8s-138.4-6.9-142.6-4.2z" fill="#0d0905"/><path d="m603.3 547.2c-5.5-36.5-43.2-50.6-61.7-56.1s-49.1-7.6-68.5-18.6c-19.4-11.1-16.3-66.4-16.3-66.4h-41.8-41.9s3.1 55.4-16.3 66.4c-19.4 11.1-50 13.1-68.5 18.6s-49.6 19.7-55.2 56.1c-4.4 29.2-17.6 113.7-17.6 113.7h199.4 199.4c.1.1-6.5-84.5-11-113.7z" fill="#fca65b"/><path d="m369.6 451.1c22.5-4.2 66-18.1 87.2-33.9 0-1.7 0-3.2 0-4.5v-.1c0-.6 0-1.1 0-1.7 0-.1 0-.2 0-.3 0-.4 0-.8.1-1.3 0-.1 0-.2 0-.3 0-.4 0-.7 0-1 0-.1 0-.2 0-.2 0-.3 0-.5 0-.8v-.1c0-.2 0-.3 0-.5s0-.3 0-.3h-41.8-41.9c0-.1 1.4 25.2-3.6 45z" fill="#eb9449"/><path d="m534.2 267.8s17.7-75.4-2.9-117.4c-22.2-45.2-55.4-71.1-116.3-71.1s-94.1 25.8-116.3 71.1c-20.6 41.9-2.9 117.4-2.9 117.4-27.7-5.5-22.5 24.7-13.9 38.4 7.2 11.4 7.3 12.6 11.7 25.1 6.2 18 20.5 5.6 20.5 5.6 8.3 23.1 14.2 28.5 47.3 59.1 28.8 26.6 38.9 26.3 53.5 26.3s24.4.3 53.5-26.3c33.2-30.4 39-36 47.3-59.1 0 0 14.3 12.5 20.5-5.6 4.3-12.5 4.5-13.7 11.6-25.1 8.9-13.7 14.1-44-13.6-38.4z" fill="#f29b50"/><path d="m225 519s-6.4 249-25.4 299.8 71.8 9.2 71.8 9.2l17-36.3s7.9-45.5 7.8-58.4c0-12.8-71.2-214.3-71.2-214.3z" fill="#d31616"/><path d="m608.9 535.4s6.4 208.8 25.4 259.6-81.9 25.4-81.9 25.4l-18.1-42s3.3-15.9 3.3-28.7c.2-12.8 71.3-214.3 71.3-214.3z" fill="#d31616"/><path d="m220.6 575.1c-1.5-34.3-3.9-66.7 31.7-73.2 13.4-2.4 56.6-11.1 56.6-11.1l41-15.2s3.3 64 62.7 64 60.6-67.1 60.6-67.1l58.1 22.8c29 2.3 29.2 4.1 42.5 6.6 32.7 6 37.9 29.2 36.9 62.6-.5 15.3-40.9 134.5-52 225.6-14.3 116.5 17.6 180.3 1.5 197-21 21.7-145.4 20.6-145.4 20.6s-136.4-3.6-153.1-23.6c-17.1-20.6 13.6-122.8-2-225-11.6-75.9-37.7-151.8-39.1-184z" fill="#ea1818"/><path d="m387.8 353.7c-11.6-4 11 18.6 29.3 18s41.4-25.3 26.2-17.9c-5 2.4-12-14.1-21.2-8.9-6.6 3.7-3.4 5.4-9.4-.2-8.1-5.7-16.6 11.8-24.9 9z" fill="#ea1818"/><path d="m364.7 222.9c-12.5.7-30.6 11.6-33.8 20.8-3.9 11.3 10.3-6.3 20.3-10.7 8.5-7.9 24.8-4 34.5 2.2 9.6 6.1 11.6 15.2 11.6 7.2-2.6-7.8-22.5-19.5-32.6-19.5z" fill="#1c140a"/><path d="m468.5 220.5c-12.5.7-30.6 11.6-33.8 20.8-3.9 11.3 10.3-6.3 20.3-10.7 8.5-7.9 24.8-4 34.5 2.2 9.6 6.1 11.6 15.2 11.6 7.2-2.6-7.8-22.5-19.5-32.6-19.5z" fill="#1c140a"/><path d="m398.9 159.6s5.5 16.4 6.7 25.7c1.3 9.3 2.3 20.4 2.3 20.4s2.1-7-.3-20.9-8.7-25.2-8.7-25.2z" fill="#261e14"/><path d="m358.3 216.3s-1.5-15.4 4.6-33.1 21.1-21.5 21.1-21.5-10.7 5.9-17.3 21.8c-6.7 15.8-8.4 32.8-8.4 32.8z" fill="#261e14"/><path d="m450.5 202.9s-.7-13.8-8.5-28.5-21.5-16.1-21.5-16.1 10.2 3.8 18.2 16.8 11.8 27.8 11.8 27.8z" fill="#261e14"/><path d="m484.8 475.4s1.2.1 3.3.3c44 11.9 60.7 14.4 92 19.3 17.5-2.2 40.9 21.1 30.6 42.9s-41.6 218.7-41.6 254.5 1.1 183.8 2.5 196.6-91.6 32.4-104.7 18.7c-7.1-7.4 13.5-91.5 34.2-190.2 17.5-83 8.7-188.6 4.8-211.3-8.7-49.6-41.2-86.6-41.2-86.6" fill="#3d4251"/><path d="m612.7 527.9s21.2 250.4 39.5 298.8-77.8 40.3-77.8 40.3l-16.8-98.2s-5.3-42.4-5.3-54.7c-.1-12.1 60.4-186.2 60.4-186.2z" fill="#363a47"/><path d="m280.9 121.7c.1-.4-23.1 40 .2-1.2 13.1-31.2 178.2-53.9 260.2 0 23.8 25.1 39.9 101.5 23.6 109.1-5.8 2.7-25.3-25.7-55.4-46.8-8.4-5.9-33.2-23.6-98.1-23.6s-89.7 17.7-98.1 23.6c-30.1 21.1-43.4 52.1-49.3 49.3-15.9-7.5-8.9-66.7 16.9-110.4z" fill="#474b56"/><path d="m348.9 482.4s-4.2-4.3-6.3-4.1c-44 11.9-57.7 18.8-89 23.7-17.5-2.2-40.9 21.1-30.6 42.9s41.6 218.7 41.6 254.5-8.9 168.7-10.4 181.5 90.2 38.3 103.3 24.7c7.1-7.4 2.1-94-18.7-192.7-17.5-83-15.1-177-11.1-199.7 8.7-49.6 41.2-86.6 41.2-86.6" fill="#3d4251"/><path d="m221 534.9s-33.4 200.8-40.4 283.7c-2.3 41.2 95.7 21.2 95.7 21.2l-2.7-54.3s14.7-33.9 14.7-46.2-67.3-204.4-67.3-204.4z" fill="#363a47"/><path d="m404.3 268.8h25.1v10.2h-25.1z" fill="#4189c6"/><path d="m553.6 182.8c-34.2-120.3-137.8-120.3-137.8-120.3s-103.6 0-137.9 120.2c-2.9 10.1-.3 24.3-7.1 36.8-49.1 89.1 9.6 380.1 13.7 380.7 1.2-7.3 2.3-20.1 2.3-20.1l2.1 19.6c5.5.4 12.9.7 18.5.2l.2-27.7 4.6 26.6c5.2-.7 17.2-2.1 22.1-3.1l-.5-12.7 4.8 11.9c19-4.7-9.1-359.4-9.1-359.4s17.6-.8 27.6-2l3.9-16 3.7 15.1c4.4-.4 9.1-.9 13.8-1.4l7.5-38.7 5.3 37.4c7.8-.6 19.9-1.4 24.6-1.4h.1l3-22.2 4.7 22.4c10.5.5 25.2 1.9 38.3 3.3l3-37.5 4.9 38.3c12.4 1.4 32.3 2.5 32.3 2.5s-21.8 352.7-6.3 355.7l9.9-33.3-4.5 34.3c6.8 1.2 14.2 2.2 21.8 2.8l6-20.5 2.1 20.9c12.5.4 82.3-278.9 29.6-378.8-6.3-11.1-4.5-24.2-7.2-33.6z" fill="#1c140a"/><path d="m396.9 236.7h-66.6c-4.5 0-8.2 3.7-8.2 8.2v51c0 4.5 3.7 8.2 8.2 8.2h66.6c4.5 0 8.2-3.7 8.2-8.2v-51c0-4.5-3.6-8.2-8.2-8.2zm-1.7 52.1c0 3.4-2.8 6.1-6.2 6.1h-50.4c-3.4 0-6.2-2.7-6.2-6.1v-37.7c0-3.4 2.8-6.1 6.2-6.1h50.4c3.4 0 6.2 2.7 6.2 6.1z" fill="#4189c6"/><path d="m500.9 236.7h-66.6c-4.5 0-8.2 3.7-8.2 8.2v51c0 4.5 3.7 8.2 8.2 8.2h66.6c4.5 0 8.2-3.7 8.2-8.2v-51c0-4.5-3.6-8.2-8.2-8.2zm-1.7 52.1c0 3.4-2.8 6.1-6.2 6.1h-50.4c-3.4 0-6.2-2.7-6.2-6.1v-37.7c0-3.4 2.8-6.1 6.2-6.1h50.4c3.4 0 6.2 2.7 6.2 6.1z" fill="#4189c6"/><path d="m289.6 113.8c.1-.4.1-.7.2-1.1 5.5-20.3 14.6-35.1 26.4-46.7.3-.4.6-.8 1-1.2 16-17.4 21-19.7 27.7-30.6s15.4-20.8 34.7-20.1c10.2.4 10.6 3.2 28.4 2.6 19.9-.6 30-2.9 36.3 0 10.7 4.9 8.3 8 38.7 29.6 6.3 4.5 13 9.7 18.6 16.2 19.6 19 30.5 50.2 30.5 50.2 24.7 40.7 34.4 96.6 19.3 103.6-5.4 2.5-20.9-26.2-48.9-45.8-7.8-5.5-30.9-21.9-91.4-21.9-60.4 0-83.6 16.4-91.4 21.9-28 19.6-38.1 48.2-43.6 45.6-14.8-6.9-10.7-61.7 13.5-102.3z" fill="#3d4251"/><path d="m291.2 106.5c2.2-6.8 3.5-10.2 5.4-13.8 1-.4 11.5-5.4 12.6-5.8 34.9-14.4 83.8-15.5 98-15.5h4.3 4.2c13.9 0 61.7 0 109.3 24.3 2 4.3 4.3 9.3 4.3 9.3 1 2.2 1.4 3.4 2.2 5.4-3.1-8-22.5-14.2-33.1-18.6-31.7-13.1-61.2-12.4-82.7-13.6-2.4-.1-3.8 0-3.9 0h-.3-.5c-.1 0-1.5 0-3.9 0-13.1 0-58.3 1-89.9 14.1-10.7 4.4-20.5 9.9-26.6 16.1" fill="#474b56"/><path d="m471.8 470.6c15.8 23.9 13.3 52.2-6.3 64.5s-49.1 4.1-67.6-18.1z" fill="#d31616"/><path d="m349.9 475.5c-12.3 30.7-8.8 60.9 8.7 68.7 17.5 7.9 42.4-9.5 57.2-39.1z" fill="#d31616"/><path d="m427.7 529.6s-88.1-49.1-95.1-17.5-15.1 55.7 8.2 59.7 86.9-42.2 86.9-42.2z" fill="#3373aa"/><path d="m412.5 522.2c24.8-13.4 73.9-36.4 79.9-13 8.2 31.5 17.1 55.3-6 60.2-16.2 3.5-53.2-17.3-73.8-29.9-.3-15.3.1-2.2-.1-17.3z" fill="#4189c6"/><path d="m229.2 671.5 236.2 204.9c5 4.3 12.6 3.8 16.9-1.2l120-138.2c4.3-5 3.8-12.6-1.2-16.9l-236.2-205c-5-4.3-12.6-3.8-16.9 1.2l-120 138.3c-4.3 5-3.7 12.6 1.2 16.9z" fill="#e1e1e1"/><path clip-path="url(#a)" d="m230.1 672.2 236.2 204.9c5 4.3 12.6 3.8 16.9-1.2l119.9-138.3c4.3-5 3.8-12.6-1.2-16.9l-236.1-204.9c-5-4.3-12.6-3.8-16.9 1.2l-120 138.3c-4.3 5-3.7 12.6 1.2 16.9z" fill="#e6e6e6"/><path d="m462.9 875.1-232.6-201.7c-.5-.4-.5-1.2-.1-1.6l.2-.2c.4-.5 1.2-.5 1.6-.1l232.5 201.7c.5.4.5 1.2.1 1.6l-.2.2c-.3.5-1.1.5-1.5.1z" fill="#b2b1b1"/><circle cx="415.2" cy="695.8" fill="#ededed" r="22.6"/><path d="m374 673.3c.7-.8 1.5-1.4 2.5-2 1-.5 2.1-.9 3.2-1.2 1.2-.2 2.4-.3 3.6-.2 1.3.1 2.5.4 3.7.9-.1-.8-.2-1.6-.3-2.4 0-.8 0-1.6.1-2.3s.2-1.4.4-2 .5-1.2.9-1.6c.5-.6 1.1-1.1 1.6-1.5.6-.4 1.2-.7 1.8-1s1.2-.4 1.9-.5c.6-.1 1.2-.1 1.8-.1.6.1 1.1.2 1.6.4s1 .5 1.3.8c.5.4.9 1 1.1 1.7s.3 1.5.2 2.4-.5 1.9-1 3c-.6 1.1-1.4 2.3-2.5 3.6-.8.9-1.6 1.8-2.4 2.6s-1.6 1.5-2.4 2.2c.2.5.3 1 .5 1.6.2.5.4 1 .5 1.6 0 .1.1.2.1.4.1.2.1.3.2.5 0 .2.1.3.1.4s0 .2-.1.3c0 .1-.1.1-.2.1s-.2 0-.3 0-.2 0-.3 0-.2 0-.2-.1c-.1 0-.3-.1-.4-.3-.3-.3-.6-.7-1-1.2-.3-.5-.7-1.1-1-1.7-1.2.8-2.3 1.5-3.4 2.1s-2.2 1-3.2 1.4c-1 .3-2 .6-2.9.7s-1.8.1-2.5.1c-.8-.1-1.5-.2-2.1-.5-.6-.2-1.1-.5-1.6-.9s-.8-.8-1-1.4c-.2-.5-.3-1.1-.3-1.7s.2-1.3.5-1.9c.4-.9.8-1.6 1.5-2.3zm1.7 2.5c-.5.6-.8 1.1-.8 1.6s.1.9.5 1.2.9.5 1.7.6 1.7 0 2.8-.3 2.3-.8 3.7-1.5 2.8-1.6 4.4-2.9l-.1-.5c-.7-.4-1.4-.7-2.2-.9s-1.6-.3-2.3-.3c-.8 0-1.6.1-2.3.2-.8.1-1.5.3-2.2.6-.7.2-1.3.5-1.8.9-.7.5-1.1.9-1.4 1.3zm15.1-11.9c-.4.5-.7 1-.9 1.6s-.3 1.3-.3 2.1 0 1.6.1 2.4c.1.9.3 1.8.5 2.7.8-.7 1.6-1.5 2.4-2.3s1.7-1.7 2.5-2.7c.6-.7 1-1.3 1.4-1.8.3-.5.5-1 .6-1.4s.1-.8 0-1.1-.2-.5-.5-.7c-.2-.2-.5-.3-.8-.4s-.6-.1-1-.1-.7 0-1.1.1-.8.2-1.1.4c-.4.2-.7.3-1.1.6-.2 0-.5.3-.7.6z" fill="url(#c)"/><path d="m408.7 688.3c-.8.5-1.5 1-2.2 1.6-.6.5-1.2 1-1.6 1.4-.3.4-.5.8-.5 1.1 0 .4.1.7.5 1 .1.1.4.2.6.3.3.1.6.2 1 .2s.9.1 1.5.1 1.2 0 1.9-.1c0 0 0 .2-.1.3 0 .1-.1.4-.2.7s-.3.7-.4 1.2c-.8.1-1.6.1-2.3.1s-1.4-.1-2-.2-1.2-.3-1.6-.5c-.5-.2-.9-.4-1.2-.7-.4-.3-.6-.7-.8-1.1s-.3-.8-.3-1.3.1-.9.3-1.4.5-1 .9-1.5c.1-.2.3-.4.6-.6s.6-.5.9-.7c.3-.3.7-.5 1.2-.8.4-.3.9-.6 1.4-.9-.8-.6-1.6-1.1-2.4-1.7-.8-.5-1.5-1.1-2.3-1.6-.6.3-1.1.7-1.7 1s-1.1.6-1.6.9-.9.5-1.4.8c-.4.2-.8.4-1.1.6-.8.4-1.5.6-1.9.6-.5 0-.8-.1-1-.2-.1-.1-.3-.3-.3-.4-.1-.2-.2-.3-.2-.5s0-.3 0-.5.1-.3.3-.5c.1-.1.2-.2.3-.2 1-.7 2-1.3 3-1.9s2-1.1 2.9-1.6c-.3-.3-.6-.6-.8-.9s-.4-.6-.6-.9c-.1-.3-.2-.7-.2-1.1s.1-.8.2-1.2c.1-.1.1-.2.2-.3s.1-.2.2-.3c.2-.3.4-.3.6-.1.1.1.2.3.2.5s0 .6 0 1c.3.2.6.4.8.7.3.2.6.5.9.7l.8.7c.7-.4 1.3-.7 1.9-1s1.2-.7 1.8-1c.4-.2.7-.5 1-.7.3-.3.6-.5.8-.8.2-.2.4-.4.5-.7.1-.2.2-.4.2-.7 0-.2 0-.4-.1-.6s-.2-.4-.4-.6c-.2-.1-.4-.3-.7-.4s-.6-.3-1-.4-.8-.2-1.3-.3-1.1-.1-1.7-.1c-.2 0-.4 0-.6-.1s-.3-.1-.4-.2c0 0 0-.1.1-.3s.3-.4.5-.6c.3-.3.6-.5.9-.7l1.2-.3c.4 0 .9 0 1.3.1.5.1.9.2 1.4.3.4.2.8.3 1.2.5s.7.4 1 .7c.4.3.7.7 1 1.2.3.4.4.9.5 1.4s0 1-.2 1.5-.5 1.1-1 1.6c-.2.3-.5.5-.9.9-.4.3-.8.7-1.3 1-.5.4-1 .7-1.6 1.1s-1.2.8-1.8 1.1c.6.5 1.3 1 2.1 1.6s1.5 1.2 2.3 1.8c1.1-.7 2.3-1.4 3.5-2.1s2.5-1.4 3.7-2c.4-.2.8-.3 1.2-.3s.7.1 1 .4c.1.1.2.2.3.4.1.1.1.3.2.4v.4c0 .2-.1.3-.3.5-.1.1-.3.3-.4.4-.2.2-.4.3-.6.4-.4.2-.9.5-1.4.8s-1 .6-1.5.9-1.1.6-1.6.9-1.1.6-1.6 1c.4.3.7.5 1 .8.3.2.5.4.6.5.1 0 .1.1.2.1s.1.1.2.1c.2.1.3.3.4.4s.1.2.1.4 0 .2-.1.3-.1.2-.2.3-.2.2-.3.2-.2 0-.4 0c-.1 0-.2-.1-.3-.1-.1-.1-.2-.1-.3-.2-.2-.1-.3-.2-.4-.3s-.1-.1-.2-.1h-.1s0 0-.1 0c0 0-.1-.1-.2-.1-.1-.1-.2-.2-.4-.3-.2-.2-.4-.3-.7-.5-.1-.4-.3-.6-.5-.7z" fill="url(#d)"/><path d="m413.7 700.7c-.4 0-.8 0-1.3-.1s-1-.1-1.5-.3c-.5-.1-1-.3-1.5-.5s-.9-.4-1.2-.7-.5-.5-.6-.8-.2-.5-.2-.8.1-.5.2-.8.3-.5.5-.8c.3-.4.7-.7 1.2-1.1s1-.8 1.6-1.2 1.1-.8 1.7-1.2 1.1-.8 1.6-1.1c.2-.1.4-.2.6-.2s.4 0 .6.1.4.2.6.3.4.2.5.3c.2.2.4.4.4.6s-.1.3-.2.5c-.1.1-.3.3-.6.5s-.6.4-.9.6-.7.5-1.1.7c-.4.3-.8.5-1.2.8s-.7.5-1.1.8c-.3.3-.6.6-.9.8-.2.3-.4.5-.4.7-.1.2 0 .4.2.5.2.2.5.3.9.4s.8.1 1.2.1h1.3s.8 0 1.1 0zm3.8-12.1c.1-.1.3-.3.5-.4s.4-.2.7-.2.5 0 .8.1.6.3.9.5c.2.2.4.4.5.6l.3.6v.6c-.1.2-.2.4-.4.6s-.4.4-.6.5-.5.2-.7.2c-.3 0-.5 0-.8-.1s-.6-.3-.9-.5c-.5-.4-.8-.9-.8-1.3s.1-.9.5-1.2z" fill="url(#e)"/><path d="m416.3 703.5c.6.5 1.2.9 1.7 1.2.6.3 1.1.5 1.7.7.6.1 1.1.2 1.6.2s1.1 0 1.6-.1l-1.6 2c-.4.1-.8.1-1.2.1s-.9-.1-1.3-.2-.9-.3-1.3-.5-.8-.4-1.1-.7l-.1-.1c-.1-.1-.1-.2-.3-.3-.1-.2-.3-.4-.5-.7s-.6-.7-1-1.2l-.1.2c-.9 1-1.8 1.9-2.7 2.6s-1.8 1.2-2.6 1.6-1.5.5-2.2.5-1.2-.2-1.6-.5c-.3-.3-.5-.6-.6-.9s-.1-.7 0-1.1.3-.8.6-1.2.6-.8.9-1.2c.2-.2.5-.5.8-.7s.7-.5 1.1-.7.8-.4 1.3-.6c.4-.2.9-.4 1.3-.6 1-.4 2.1-.8 3.3-1.1.4-.4.9-.8 1.4-1.2s.9-.8 1.4-1.1c.5-.4 1-.7 1.5-.9.5-.3 1-.4 1.5-.5s1-.1 1.5 0 1 .4 1.4.8c.3.3.6.6.9 1 .2.4.4.7.4 1.2 0 .4 0 .8-.2 1.3-.2.4-.4.9-.9 1.4-.3.4-.7.7-1.1 1s-.9.5-1.4.6-1.1.2-1.7.1c-.6 0-1.3-.2-2-.4zm-8.7 1.8s-.1.1-.2.2-.1.3-.2.4c0 .1-.1.3-.1.4s.1.3.2.4.2.1.4 0 .3-.1.5-.3c.2-.1.4-.3.6-.5s.4-.4.6-.6.4-.4.6-.7.4-.4.5-.6c.3-.3.5-.5.7-.8.2-.2.4-.4.5-.5.1-.2.3-.3.4-.4-.3.1-.6.2-.9.4s-.6.3-1 .5c-.3.2-.6.4-.9.6s-.6.4-.8.6c-.3.2-.5.3-.6.5s-.2.3-.3.4zm8.4-3.6c.5.1 1 .2 1.4.2s.8 0 1.2-.1.8-.2 1.1-.4.7-.3 1-.6c.1-.1.3-.2.4-.4.2-.2.3-.3.4-.5s.1-.4.1-.6-.1-.4-.3-.5c-.2-.2-.4-.3-.7-.3s-.5 0-.8.1-.6.3-.9.5-.6.4-1 .7c-.3.3-.6.6-1 .9-.3.3-.7.7-.9 1z" fill="url(#f)"/><path d="m421.4 704.8h1.4s.7 0 .9-.1c.3 0 .5-.1.8-.1.3-.1.5-.1.9-.2.3-.1.8-.2 1.3-.3s1.1-.2 1.9-.4c.2 0 .3-.1.5-.1s.4 0 .5 0c.2 0 .4.1.5.1.2.1.3.2.5.3.3.2.5.5.6.6.1.2.1.4.1.5s0 .3-.1.4-.1.2-.2.3-.3.2-.6.3-.5.1-.8.2c-.3 0-.5.1-.7.1s-.4.1-.5.1c-.2.2-.3.3-.4.5s-.2.3-.3.5-.2.4-.3.6-.2.4-.3.7c-.1.2-.3.5-.5.8s-.5.6-.8 1c.3 0 .7.1 1 .2s.7.2 1 .3c.4.1.7.2 1.1.3s.8.2 1.3.2l-1.7 1.9c-.6 0-1.2-.1-1.9-.3s-1.3-.4-2-.6c-.7-.3-1.3-.6-1.9-.9s-1.2-.7-1.6-1.1c-.3-.3-.6-.6-.9-.9-.2-.3-.4-.6-.5-1-.1-.3-.1-.7-.1-1 .1-.3.2-.7.4-1-.1-.1-.2-.1-.3-.2s-.2-.1-.2-.2c-.1-.1-.2-.2-.2-.2-.1-.1-.1-.2-.1-.2 0-.1 0-.2 0-.3s.1-.2.3-.4c.1-.1.3-.2.4-.3.2-.1.3-.1.5-.1s.3 0 .5 0zm.1 2.1c.1.1.1.2.1.3v.5s.1.4.1.6c.1.2.2.4.4.6s.4.3.6.4.4.1.6 0c.2 0 .4-.1.6-.3.2-.1.3-.3.5-.5.1-.2.3-.3.4-.5s.2-.4.3-.5c.1-.2.2-.3.3-.5s.1-.3.2-.4z" fill="url(#g)"/><path d="m435 719c-.8-.2-1.6-.3-2.2-.4s-1.2-.3-1.7-.4-.9-.3-1.2-.4-.6-.3-.8-.5c-.4-.4-.7-.8-.8-1.4s-.1-1.2.2-1.9c.2-.7.6-1.4 1.1-2.2s1.1-1.6 1.9-2.5c.3-.3.6-.7 1-1.1l1.1-1.1c-.2-.2-.3-.3-.3-.4-.1-.1-.2-.2-.2-.3-.1-.1-.2-.2-.3-.4s-.4-.4-.6-.7c-.1-.1-.2-.3-.2-.4s0-.2 0-.3.1-.2.1-.3c.1-.1.1-.1.2-.2s.2-.2.4-.1c.2 0 .3.1.5.2s.4.3.6.5.4.4.6.5c.2.2.4.3.5.5.1.1.3.2.3.3.8-.6 1.7-1.2 2.5-1.7.9-.5 1.7-.9 2.5-1.2s1.5-.5 2.1-.5 1.2.1 1.5.4c.2.2.4.5.5.8s.1.6 0 1-.2.7-.4 1.1-.4.7-.7 1.1c-.2.3-.5.5-.9.8s-.7.5-1.2.7c-.4.2-.9.4-1.3.6-.5.2-1 .3-1.4.5 0 .1.1.1.2.2s.3.2.4.4c.2.1.3.3.5.5s.3.3.5.5.3.3.5.4c.1.1.3.2.4.3s.1.2.1.4-.1.3-.3.5-.4.3-.6.3-.4 0-.5-.1l-3.3-2.9c-.4.1-.7.2-1.1.2-.4.1-.7.1-1 .2-.3.3-.7.7-1 1-.1.1-.3.3-.4.4-.1.2-.3.3-.4.5-.1.1-.3.3-.4.4s-.2.3-.3.4c-.3.3-.5.6-.6.9s-.2.5-.2.7 0 .4.1.6.3.4.4.5.3.2.5.3.5.2.8.3.6.2 1 .2c.4.1.7.1 1.1.2.4 0 .7.1 1.1.1s.7 0 1.1-.1zm6.7-13.2.2-.2c.1-.1.1-.2.1-.3s0-.2 0-.3-.1-.2-.2-.3-.4-.1-.8 0-.8.3-1.3.6-1 .6-1.6 1c-.5.4-1.1.8-1.6 1.1.1.1.2.2.2.3.1.1.2.2.2.3.4-.1.9-.3 1.4-.5s.9-.4 1.4-.6c.4-.2.8-.4 1.2-.6.4-.1.6-.3.8-.5z" fill="url(#h)"/><path d="m436 723.3c-.5-.5-.9-1-1.2-1.5-.2-.5-.3-1.1-.3-1.7s.1-1.1.4-1.7c.2-.5.6-1.1 1-1.5.3-.3.6-.6 1-.9s.8-.6 1.2-.8.9-.4 1.3-.6c.5-.1.9-.2 1.4-.2s.9.1 1.4.2c.4.1.9.4 1.3.7.3.3.6.6.8.9s.3.7.3 1.1 0 .7-.1 1.1-.3.7-.6 1c-.3.4-.7.6-1.2.8s-1 .3-1.6.4c-.6 0-1.2 0-1.8-.1s-1.3-.3-1.9-.6c0 .2-.1.4-.1.6v.5c0 .1.1.2.2.4l.3.3c.3.3.8.5 1.3.7s1 .3 1.6.4c.5.1 1.1.2 1.6.2s1 0 1.4 0l.1 2.1c-1 .1-1.9.1-2.8 0-.4 0-.8-.1-1.2-.2s-.9-.2-1.3-.3-.8-.3-1.2-.5c-.6-.3-1-.6-1.3-.8zm2.3-5.1c.2.2.5.3.8.4s.7.2 1 .2c.4 0 .7 0 1-.1s.5-.2.7-.4c.2-.3.4-.5.4-.8s0-.4-.1-.5c-.2-.2-.5-.3-.7-.4-.3-.1-.5-.1-.7 0-.2 0-.5.1-.7.3-.2.1-.4.3-.7.4-.2.2-.4.3-.5.5-.2.2-.4.3-.5.4z" fill="url(#i)"/><path d="m441.4 724.8c.2-.3.5-.5.8-.8s.7-.6 1-1 .8-.7 1.2-1 .8-.6 1.2-.9.7-.5 1.1-.8c.3-.2.6-.4.8-.5s.3-.1.4-.2h.3c.1 0 .2 0 .3.1s.2.2.3.3.3.2.3.3c.1.1.1.2.1.3s-.1.2-.1.3c-.1.1-.2.3-.4.4-.2.2-.4.5-.7.8s-.5.6-.8.9l.1.1c.3-.1.7-.3 1.1-.4.4-.2.8-.3 1.2-.4s.8-.1 1.2-.1.7.2 1.1.5l.3.3c.1.1.1.3.1.4v.4c0 .1-.1.3-.2.4s-.2.2-.4.4c-.2.1-.4.3-.6.5s-.4.3-.6.5-.3.3-.4.4c-.2.2-.3.4-.4.6s-.1.3-.1.5c0 .1 0 .3.1.4s.1.2.2.3c.3.2.6.4.9.5.4.1.7.2 1.1.3s.8.1 1.3.1l-1.9 1.9c-.2 0-.5-.1-.8-.1s-.6-.1-.9-.2-.6-.2-.9-.3-.6-.3-.8-.5c-.4-.4-.7-.8-.8-1.2s-.1-.8 0-1.2.3-.8.5-1.2.5-.8.7-1.2l-.1-.1-5.2 2.9c-.3.2-.5.3-.7.4s-.4.1-.5.2c-.2 0-.3 0-.4 0s-.2-.1-.3-.2c-.2-.2-.4-.4-.4-.6-.1-.2 0-.5 0-.7.1-.2.2-.5.3-.7 0-.6.2-.9.4-1.1z" fill="url(#j)"/><path d="m638.7 781s-176.3-27.6-228.3-54.7c-66.8-6.7-22.1 54.2-22.1 54.2l149 51.6s67.8 33.9 81.5 35.1c13.7 1.3 19.9-86.2 19.9-86.2z" fill="#eb9449"/><path d="m400.5 780.8s-61.6 12.8-74.9 5.1-35.9-20.1-35.3-35.1c.7-15 21.6-58.5 40.6-58.3s86 39.7 86 39.7z" fill="#fca65b"/><path d="m620.4 877.8s21.8-31.8 25.7-44c4-12.2 3.3-50.8 3.3-50.8l-66.8-15.2s-24.6 38.4-27.1 49.6c-2.6 11.2.6 43.4.6 43.4z" fill="#d31616"/><path d="m274.6 739.1s181.5-16.3 234.3-41.9c66.9-4.8 20.6 54.8 20.6 54.8l-150.5 47.4s-85.4 26.6-99.1 27.5c-13.6.8-5.3-87.8-5.3-87.8z" fill="#eb9449"/><path d="m493.1 758.6s61.4 17.7 74.6 10.4 35.6-18.9 34.8-34.8c-.7-15.8-21.9-63.2-40.7-64.3-18.8-1-84.7 38.3-84.7 38.3z" fill="#fca65b"/><path d="m246.1 746.8s-1.7 38.5 1.4 51 24 44.9 24 44.9l64.8-22.3s.6-45.5-3.1-56.4-23.4-36.6-23.4-36.6z" fill="#d31616"/><g fill="#333"><path d="m503.4 780.3c-.7-.5-1.2-.9-1.6-1.3s-.7-.7-.9-1-.3-.6-.4-.9c0-.3 0-.6.1-1 .1-.3.3-.6.5-.7.2-.2.5-.3.7-.3.3-.1.6-.1.9-.1s.7 0 1.1-.1h.4c.2 0 .5-.1.9-.1s.8-.1 1.2-.1c.5 0 .9-.1 1.4-.1.4 0 .9-.1 1.2-.1h.9c.1 0 .3 0 .4.1.2 0 .3.1.4.2s.1.2.2.3c0 .1.1.3.1.4v.4.3s0 .1 0 .1c-.1.2-.2.4-.3.5-.2.1-.3.1-.6.1l-7.6.1 5 3.8c.1.1.2.2.3.3s.2.3.3.4c.1.2.1.3.2.5v.6c-.1.2-.2.3-.4.4s-.4.1-.7 0c-.2-.1-.5-.2-.8-.4s-.6-.4-.8-.6c-.3-.2-.6-.5-.9-.7-.6-.5-.9-.8-1.2-1z"/><path d="m509.6 787.2c.2-.8.6-1.5 1.2-2.2.5-.7 1.2-1.4 2-1.9.8-.6 1.6-1 2.6-1.3.9-.3 1.9-.5 3-.5-.4-.5-.7-1.1-1-1.7s-.5-1.1-.7-1.7-.3-1.1-.3-1.6 0-1 .1-1.5c.2-.6.4-1.1.7-1.6s.6-.9 1-1.3.8-.7 1.2-1 .9-.5 1.3-.6.9-.2 1.3-.3c.4 0 .8 0 1.2.1.5.2 1 .4 1.4.9.4.4.7 1 .9 1.7s.3 1.5.2 2.5-.3 2.1-.7 3.4c-.3.9-.6 1.8-.9 2.6s-.7 1.6-1 2.3c.3.3.6.6.9 1 .3.3.6.6.9 1 .1.1.1.2.2.2l.3.3s.2.2.2.3c.1.1.1.2.1.2 0 .1-.1.1-.1.1-.1 0-.1.1-.2.1s-.2.1-.2.1c-.1 0-.1 0-.2 0s-.2 0-.4 0c-.3-.1-.7-.3-1.1-.5-.4-.3-.8-.6-1.3-.9-.6 1-1.2 1.9-1.8 2.6-.6.8-1.3 1.5-1.9 2-.6.6-1.3 1.1-1.9 1.4-.6.4-1.2.7-1.8.9s-1.1.3-1.7.3c-.5 0-1 0-1.4-.2-.5-.1-.8-.4-1.2-.7-.3-.3-.6-.7-.8-1.1-.2-.5-.3-1-.3-1.6-.1-.4 0-1.1.2-1.8zm2.1 1.2c-.2.6-.2 1.1-.1 1.4.1.4.4.6.8.7s.9.1 1.4-.1c.6-.2 1.2-.6 1.9-1.1.7-.6 1.4-1.3 2.2-2.2s1.5-2.1 2.3-3.5l-.3-.3c-.6-.1-1.2 0-1.9.1-.6.1-1.2.3-1.8.6s-1.1.6-1.6.9c-.5.4-1 .7-1.4 1.1s-.8.8-1 1.2c-.2.5-.4.9-.5 1.2zm7.1-13.5c-.1.5-.2.9-.1 1.5.1.5.2 1.1.4 1.6.2.6.5 1.1.9 1.7s.8 1.2 1.3 1.8c.3-.8.7-1.6 1-2.5s.6-1.8.9-2.8c.2-.7.3-1.3.4-1.8s.1-.9 0-1.3c-.1-.3-.2-.6-.3-.8-.2-.2-.3-.3-.6-.4-.2-.1-.4-.1-.7 0-.3 0-.5.1-.8.2s-.5.3-.8.5-.5.4-.7.6-.4.5-.6.7c-.1.4-.2.7-.3 1z"/><path d="m539.7 786.8c-.4.6-.8 1.3-1.1 1.8-.3.6-.5 1.1-.7 1.5-.1.4-.1.7 0 1s.3.5.7.6c.1 0 .3.1.6 0 .2 0 .5-.1.8-.2s.7-.2 1.1-.4.9-.4 1.4-.7v.3.6c0 .2 0 .6.1 1-.6.3-1.1.6-1.7.8-.5.2-1.1.4-1.5.5-.5.1-.9.2-1.3.2s-.8 0-1.1-.1c-.4-.1-.7-.3-.9-.5-.3-.2-.5-.5-.6-.8s-.2-.7-.3-1.1c0-.4 0-.9.2-1.4.1-.2.1-.4.2-.6s.2-.5.4-.8.4-.6.6-1 .4-.7.7-1.1c-.8-.2-1.6-.3-2.3-.4s-1.5-.3-2.2-.4c-.3.4-.6.9-.9 1.3s-.6.8-.9 1.2-.5.7-.7 1-.4.6-.6.8c-.5.5-.9.9-1.2 1-.3.2-.6.2-.8.2-.1 0-.3-.1-.4-.2s-.2-.2-.3-.3-.1-.2-.2-.4c0-.1 0-.3 0-.4s.1-.2.1-.3c.5-.8 1-1.6 1.6-2.3.5-.7 1.1-1.4 1.6-2.1-.3-.1-.6-.2-.9-.4-.3-.1-.5-.3-.7-.5s-.4-.4-.5-.7-.2-.6-.2-1c0-.1 0-.2 0-.3s0-.2.1-.2c.1-.3.2-.4.4-.3.1 0 .2.1.3.3s.2.4.3.7c.3.1.5.1.8.2l.9.3.8.3c.4-.5.7-.9 1.1-1.4.3-.4.7-.9 1-1.3.2-.3.4-.6.5-.8.2-.3.3-.6.4-.8s.1-.4.1-.6 0-.4-.1-.5c-.1-.2-.1-.3-.3-.4-.1-.1-.3-.2-.5-.3s-.4-.1-.6-.1-.5 0-.8.1c-.3 0-.7.1-1.1.2s-.8.3-1.3.5c-.2.1-.3.1-.4.1s-.2 0-.3 0c0 0-.1-.1 0-.3 0-.2.1-.4.1-.6.1-.3.2-.6.5-.8.2-.2.5-.4.8-.6s.6-.3 1-.4.7-.2 1.1-.2h1.1c.3 0 .7.1.9.2.4.1.8.3 1.1.5s.6.5.8.8.3.7.4 1.1c0 .4 0 .9-.2 1.5-.1.3-.2.6-.4.9-.2.4-.4.7-.6 1.2-.2.4-.5.9-.8 1.3-.3.5-.6.9-.9 1.4.6.1 1.3.3 2 .5.8.2 1.5.4 2.3.6.6-.9 1.2-1.8 1.9-2.7s1.3-1.8 2-2.7c.2-.3.5-.5.8-.6s.6-.2.9-.1c.1 0 .2.1.3.2s.2.2.2.3c.1.1.1.2.1.3s0 .3 0 .4-.1.3-.2.5-.2.3-.3.5c-.2.3-.5.7-.8 1-.3.4-.6.7-.8 1.1-.3.4-.6.8-.9 1.2s-.6.8-.8 1.2c.4.1.7.2 1 .2.3.1.5.1.6.1s.1 0 .2 0h.2c.2.1.3.1.4.2s.2.1.2.2.1.2.1.3 0 .2-.1.3c0 .1-.1.2-.2.3s-.2.1-.3.1-.2 0-.3 0-.2 0-.3 0c-.2 0-.3-.1-.4-.1s-.1 0-.2 0c0 0 0 0-.1 0 0 0 0 0-.1 0 0 0-.1 0-.2 0s-.2 0-.4-.1c-.2 0-.4-.1-.6-.1-.1-.4-.3-.4-.5-.5z"/><path d="m550.5 794.5c-.4 0-.8 0-1.1.1-.4 0-.8.1-1.1.1-.4 0-.7 0-1 0s-.6 0-.9-.1-.5-.2-.6-.4-.2-.4-.1-.5c.1-.2.1-.3.2-.5.1-.1.2-.3.3-.3.1-.1.2-.2.3-.2.1-.1.2-.1.3-.1l6.6-.4-5.7-3.7c-.2-.1-.3-.3-.4-.4s-.1-.3 0-.5c0 0 0 0 0-.1s.1-.2.1-.2c.1-.1.1-.2.2-.3l.3-.3s.2-.1.3-.2h.4c.1 0 .2.1.4.2s.4.3.7.5.6.4.9.7c.3.2.6.5.9.7s.6.5.8.7c.3.2.5.4.6.5s.2.2.3.2c.3.2.6.5.8.7.3.2.5.4.7.6s.3.4.4.7c.1.2.1.5 0 .8s-.3.6-.4.9c-.2.2-.5.4-.8.6-.3.1-.8.3-1.3.3-.6-.2-1.2-.1-2.1-.1z"/></g><ellipse cx="365.00674" cy="268.59839" fill="#fff" rx="23.677713" ry="23.107164" stroke-width="1.163297"/><path d="m373.36754 271.42775c-1.1 4.10001-5.6 6.4-10.1 5.2-3.3-.89999-5.6-3.5-6.1-6.39999.4.39999.9.69999 1.5.89999 1.8.5 3.7-.5 4.2-2.1.5-1.69999-.6-3.5-2.5-4-.7-.19999-1.5-.19999-2.2.1 1.8-2.7 5.5-4.1 9.1-3.1 4.5 1 7.2 5.30001 6.1 9.4z" fill="#333"/><ellipse cx="465.42307" cy="269.16895" fill="#fff" rx="23.677713" ry="23.107164" stroke-width="1.163297"/><path d="m473.78386 271.42775c-1.1 4.1-5.6 6.4-10.1 5.2-3.3-.9-5.6-3.5-6.1-6.4.4.4.9.7 1.5.9 1.8.5 3.7-.5 4.2-2.1.5-1.7-.6-3.5-2.5-4-.7-.2-1.5-.2-2.2.1 1.8-2.7 5.5-4.1 9.1-3.1 4.5 1 7.2 5.3 6.1 9.4z" fill="#333"/></svg> \ No newline at end of file diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_2_head-192.png b/borestop/src/main/webapp/content/images/jhipster_family_member_2_head-192.png new file mode 100755 index 0000000000000000000000000000000000000000..24baf78ce8326c3c2756f10ebed90829d0bddf30 Binary files /dev/null and b/borestop/src/main/webapp/content/images/jhipster_family_member_2_head-192.png differ diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_2_head-256.png b/borestop/src/main/webapp/content/images/jhipster_family_member_2_head-256.png new file mode 100755 index 0000000000000000000000000000000000000000..7b25f52f93d109da2df18f8442ef2104a6e14b8f Binary files /dev/null and b/borestop/src/main/webapp/content/images/jhipster_family_member_2_head-256.png differ diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_2_head-384.png b/borestop/src/main/webapp/content/images/jhipster_family_member_2_head-384.png new file mode 100755 index 0000000000000000000000000000000000000000..e89e120c2f015ccb140678ffff8ccbacb1ae1f20 Binary files /dev/null and b/borestop/src/main/webapp/content/images/jhipster_family_member_2_head-384.png differ diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_2_head-512.png b/borestop/src/main/webapp/content/images/jhipster_family_member_2_head-512.png new file mode 100755 index 0000000000000000000000000000000000000000..3c0e6cb9af31e2e46d9e9b6c8cec99c0d4c5e5c6 Binary files /dev/null and b/borestop/src/main/webapp/content/images/jhipster_family_member_2_head-512.png differ diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_3.svg b/borestop/src/main/webapp/content/images/jhipster_family_member_3.svg new file mode 100755 index 0000000000000000000000000000000000000000..cc0d01f1ea00f8c4b12b2318363f398766cf64d4 --- /dev/null +++ b/borestop/src/main/webapp/content/images/jhipster_family_member_3.svg @@ -0,0 +1 @@ +<svg enable-background="new 0 0 792 1135.9" viewBox="0 0 792 1135.9" xmlns="http://www.w3.org/2000/svg"><path d="m487.4 224.4s22.2 223.1-23.5 212.7c-27.6-6.3 8.8.1-69.6-41.2-64.6-34-129.8-110.9-146.5-141-10.1-18.2-8.5-87.6 48.5-127.4s127.3-65.3 201.3-25.8z" fill="#d4410d"/><path d="m471.5 172.3-54.6 207.7 108.9 56.4s37.7-8.4 36.4-35.4c-1.3-26.9-13.7-18.4 12.9-61.9 26-42.7 17.9-78 13.4-122.4-3.9-38.4-28.3-72.7-30.9-96.9-2.7-24.2-29.6-76.7-86.1-76z" fill="#d4410d"/><path d="m212.9 520.4c6.2-40.9 39.1-58.7 61.9-63 24.6-4.6 51.7-4.7 73.5-17.1 21.7-12.4 21.6-78.3 21.6-78.3h47 46.9s-3.5 62.1 18.3 74.5 56.1 14.7 76.8 20.9 55.7 22.1 61.9 63c5 32.8 9.8 104.5 9.8 104.5l-213.9 2.9-207.7 4.4s-1.1-79.1 3.9-111.8z" fill="#f2b181"/><path d="m468 412.5c-25.3-4.7-74.1-20.3-97.9-38.1 0-1.9 0-3.5 0-5.1 0-.1 0-.1 0-.1 0-.7 0-1.3 0-1.9 0-.1 0-.3 0-.4 0-.5 0-1 0-1.4 0-.1 0-.2 0-.3 0-.4 0-.8 0-1.1 0-.1 0-.2 0-.2 0-.3 0-.6 0-.9 0 0 0-.1 0-.2 0-.2 0-.4 0-.5 0-.2 0-.3 0-.3h47 46.9c-.1-.1-1.7 28.3 4 50.5z" fill="#eb9850"/><path d="m283.2 206.8s-20.1-31.2 3-78.3c24.8-50.7 59.9-84.7 128.3-84.7 68.3 0 107.8 34 132.7 84.7 23.1 47.1 3.4 78.3 3.4 78.3 31.1-6.2 25.3 27.8 15.5 43.1-8 12.7-8.2 14.1-13.1 28.1-6.9 20.2-23 6.2-23 6.2-9.3 25.9-15.9 32-53.1 66.3-32.4 29.8-43.7 29.5-60.1 29.5s-27.4.4-60.1-29.5c-37.3-34.1-43.8-40.4-53.1-66.3 0 0-16.1 14-23-6.2-4.9-14-5-15.4-13.1-28.1-9.6-15.4-15.4-49.3 15.7-43.1z" fill="#f2b181"/><path d="m212.9 520.4c6.2-40.9 37.1-58.7 61.9-63 13.7-2.4 32.9-4.7 50-10.9 7.6-2.7 29-13.7 29-13.7l23.6 34.4h78.7l23.7-34.4s21.5 11 29 13.7c17.2 6.2 36.7 6.9 50 10.9 20.7 6.2 55.7 22.1 61.9 63 5 32.8 45.8 223.2 45.8 223.2l-85.2 27.4-22.3-138.1s-10.4 81.7 9.4 186.9 41.3 123.4 14.6 131.6c-26.6 8.2-259.8 29.5-291.1 24.7-31.3-4.9-18.1-41.5-11.7-100s-18.8-266-18.8-266l-60.4 43.6s6.9-100.6 11.9-133.3z" fill="#f7f6f5"/><path d="m365.3 117.9s-1.3 22.6-21 42.3c-19.7 19.8-36 28.3-32.3 71.5s19.7 58 6.2 80.2c-13.6 22.2-24 28.4-16.3 48.1 7.7 19.8 5.1 27.2-3.5 40.7-8.5 13.6 0 32.1 0 32.1s-15.9-18.5-11-37-19.8-25.9-18.5-50.6c1.2-24.7 17.3-53 1.2-83.9-10.2-19.6-36.3-73.1-24.7-112.3 6.6-22.2 17.5-44.2 32.1-61.2 8.2-9.6 28.8-48 87-44z" fill="#e6511c"/><path d="m478 431.7c13.2 24.4 8.5 51.3-11.4 61.3-19.9 10.1-47.7-.4-63.7-23.4z" fill="#fff"/><path d="m358.9 423.8c-15 29.5-14.1 59.9 2.6 69.2 16.7 9.4 43.1-5.7 60.5-33.9z" fill="#fff"/><path d="m358.9 103.3s-9.3 37.4 43.7 73.2c0 0-7.9-20.1-10.4-39.2 0 0-7 23.2 42.7 34.9 0 0-9.3-3-9.3-15 0 0 77 5.5 90 40.6 13 35.2 17.9 54.5-5.2 79.5s-5.6 47.2.9 77.7c6.4 30.6-2.4 38.6-10.2 50-11.4 16.6 2.1 37.6 2.1 37.6s-12.3-17.3 10.9-32.4c9.7-6.3 24.9-15.4 19.3-46.9s.9-57.4 12.9-68.5c12.1-11.1 41.7-29.6 32.4-71.2-9.3-41.7-9.3-50-4.6-68.5 4.6-18.5-27.9-62-42.3-78.5-32.4-37.1-119-62.8-167.5-32.9z" fill="#e6511c"/><path d="m524.8 960.4 22.7-505.1-22.4-8-23.1 515.3z" fill="#4189c6"/><path d="m342 975.7 25.2-1.5-58-523.1-22.9 4.2z" fill="#4189c6"/><path d="m375.2 310.7c-2.5-1.4-1 .8-.6 1.3 3.4 3.6 19.8 16.6 43.2 16.2 24.1-.4 34.9-9.9 37.8-13 .4-.4.2-1.1-.4-1.3-4.4-1.1-19.9-4.6-32.8-4.6-6.5 0-13.3 2.9-21.8 4.1-6.8.9-15.6 2.7-25.4-2.7z" fill="#ea1818"/><path d="m365.3 203.9c12.8 0 23.2 10.4 23.2 23.2s-10.4 23.2-23.2 23.2-23.2-10.4-23.2-23.2 10.4-23.2 23.2-23.2z" fill="#fff"/><path d="m374.6 226.9c0 5.4-4.4 9.9-9.9 9.9-4 0-7.5-2.4-9-5.9.6.4 1.3.6 2 .6 2.3 0 4.1-1.8 4.1-4.1s-1.8-4.1-4.1-4.1c-.9 0-1.8.3-2.4.8 1.2-4 5-7 9.4-7 5.5-.1 9.9 4.3 9.9 9.8z" fill="#1c4911"/><path d="m470.3 203.9c12.8 0 23.2 10.4 23.2 23.2s-10.4 23.2-23.2 23.2-23.2-10.4-23.2-23.2 10.4-23.2 23.2-23.2z" fill="#fff"/><path d="m479.6 226.9c0 5.4-4.4 9.9-9.9 9.9-4 0-7.5-2.4-9-5.9.6.4 1.3.6 2 .6 2.3 0 4.1-1.8 4.1-4.1s-1.8-4.1-4.1-4.1c-.9 0-1.8.3-2.4.8 1.2-4 5-7 9.4-7 5.5-.1 9.9 4.3 9.9 9.8z" fill="#1c4911"/><path d="m373.2 84s28.6-7.8 44.6-9.1 35.1-2 35.1-2-11.8-4.3-35.8-1.5-43.9 12.6-43.9 12.6z" fill="#d4410d"/><path d="m378.3 100.2s26.3-4.8 57.6 3.4c31.3 8.1 40 33.3 40 33.3s-11.7-17.6-39.9-26.8c-28.1-9.2-57.7-9.9-57.7-9.9z" fill="#d4410d"/><path d="m364.9 174.8c-24.7.5-36.3 6.7-39.6 12.5-4.1 7.3 6.9 4 16.8.1 9.8-3.9 26.3-6.6 36.4-2.6 10 3.9 15.8 6.8 15.8 1.7-2.7-5.1-14.4-11.7-29.4-11.7z" fill="#e6511c"/><path d="m435 186.5c0 5.2 5.8 2.3 15.8-1.7 10.1-4 26.6-1.3 36.4 2.6s20.9 7.2 16.8-.1c-3.3-5.9-14.9-12-39.6-12.5-14.9 0-26.7 6.6-29.4 11.7z" fill="#e6511c"/><path d="m418.9 436.7c-.8-.1-1.5-.2-2.1-.3-.5-.1-1-.2-1.3-.4s-.6-.4-.8-.6-.3-.5-.4-.9c-.1-.3-.1-.6 0-.9.1-.2.3-.5.5-.7s.5-.4.8-.6.6-.4.9-.6c0 0 .1-.1.3-.2s.4-.3.7-.6c.3-.2.6-.5 1-.7.4-.3.7-.5 1.1-.8s.7-.5 1-.7.6-.4.8-.5c.1-.1.2-.1.4-.2h.4c.1 0 .2.1.3.2s.2.2.2.3c.1.1.1.2.2.3 0 .1.1.2.1.3v.1c.1.2 0 .4-.1.6-.1.1-.2.3-.4.4l-6.5 3.9 6.3.7c.1 0 .2 0 .4.1s.3.1.4.2.3.2.4.4c.1.1.2.3.3.5 0 .2 0 .4-.1.6s-.3.3-.6.4-.5.1-.9.1c-.3 0-.7-.1-1-.1-.4-.1-.7-.1-1.1-.2-.5-.1-.9-.1-1.2-.1z" fill="#333"/><path d="m427.7 439.5c-.2-.8-.2-1.6-.1-2.5s.4-1.8.7-2.6c.4-.9.9-1.7 1.5-2.4.6-.8 1.4-1.4 2.3-1.9-.6-.3-1.2-.6-1.7-.9s-1-.7-1.5-1.1c-.4-.4-.8-.8-1.1-1.2s-.5-.9-.6-1.3c-.1-.6-.2-1.2-.2-1.8s.1-1.1.2-1.6.3-1 .5-1.4.5-.8.8-1.2c.3-.3.6-.6 1-.9.4-.2.7-.4 1.1-.5.5-.1 1.1-.1 1.6 0 .6.2 1.1.5 1.6 1s1 1.2 1.5 2.1c.4.9.8 2 1.1 3.3.2 1 .4 1.9.5 2.7.1.9.2 1.7.3 2.5.4.1.8.3 1.2.4s.8.2 1.3.4c.1 0 .2.1.3.1s.3.1.4.1.2.1.3.2l.2.2v.2c0 .1-.1.1-.1.2-.1.1-.1.1-.2.2s-.1.1-.1.1c-.1.1-.2.1-.4.2-.3.1-.7.1-1.2.1s-1-.1-1.6-.2c0 1.1-.1 2.2-.2 3.2s-.4 1.9-.6 2.7c-.3.8-.6 1.5-.9 2.2-.4.6-.7 1.2-1.1 1.7s-.8.8-1.3 1.1c-.4.3-.9.5-1.3.6-.5.1-.9.1-1.4 0-.4-.1-.9-.3-1.2-.6-.4-.3-.7-.7-1-1.2-.2-.9-.4-1.5-.6-2.2zm2.4 0c.1.6.4 1 .7 1.3s.6.3 1 .2.8-.4 1.2-.8c.4-.5.8-1.1 1.1-1.9s.6-1.8.8-3 .3-2.6.2-4.2l-.4-.1c-.6.3-1.1.6-1.6 1s-.9.9-1.3 1.4-.7 1-1 1.6-.5 1.1-.6 1.7c-.2.5-.2 1.1-.3 1.6.1.4.1.8.2 1.2zm-.7-15.3c.1.5.3.9.6 1.3s.7.8 1.2 1.2 1 .7 1.6 1 1.3.6 2 .9c-.1-.8-.2-1.7-.4-2.6s-.4-1.9-.6-2.9c-.2-.7-.3-1.3-.5-1.7-.2-.5-.4-.8-.6-1.1s-.4-.4-.7-.5c-.2-.1-.5-.1-.7 0s-.4.2-.6.3c-.2.2-.4.4-.5.6-.2.2-.3.5-.4.8s-.2.6-.3.9-.1.6-.1.9c-.1.3 0 .6 0 .9z" fill="#333"/><path d="m453.5 424.1v2.1c0 .7.1 1.2.2 1.7.1.4.3.7.5.9s.5.2.9.1c.1 0 .3-.1.5-.3.2-.1.4-.3.6-.6.2-.2.5-.5.7-.9.3-.4.5-.8.8-1.3 0 0 .1.1.2.2s.2.3.3.5.3.5.6.8c-.3.6-.7 1.1-1 1.5-.4.5-.7.9-1.1 1.2s-.7.6-1.1.8-.7.4-1 .4c-.4.1-.7.1-1.1 0-.3-.1-.7-.2-1-.4s-.6-.5-.8-.8c-.2-.4-.4-.8-.5-1.3 0-.2-.1-.4-.1-.7s0-.6-.1-.9c0-.3 0-.7 0-1.1s0-.8 0-1.3c-.8.3-1.5.5-2.2.8s-1.4.5-2.1.7c0 .5-.1 1.1-.1 1.6s-.1 1-.2 1.4-.1.9-.1 1.2c0 .4-.1.7-.1 1-.1.7-.3 1.2-.5 1.5s-.4.5-.6.6c-.1 0-.3 0-.4 0s-.3-.1-.4-.1c-.1-.1-.2-.1-.3-.3-.1-.1-.2-.2-.2-.4 0-.1 0-.2 0-.3 0-1 .1-1.9.2-2.8s.2-1.8.3-2.6c-.3.1-.6.1-.9.1s-.6 0-.9-.1-.5-.2-.8-.4c-.2-.2-.5-.4-.7-.7 0-.1-.1-.2-.1-.3s-.1-.2-.1-.2c-.1-.3 0-.4.2-.5.1 0 .2 0 .4.1s.4.2.7.5c.3-.1.5-.2.8-.2.3-.1.6-.1.9-.2l.8-.2c.1-.6.2-1.2.2-1.7.1-.6.1-1.1.2-1.6 0-.3 0-.7 0-1s-.1-.6-.1-.9c-.1-.2-.1-.4-.2-.6s-.2-.3-.3-.4-.3-.2-.4-.2c-.2 0-.4 0-.6 0s-.4.1-.6.2-.5.3-.7.5c-.3.2-.5.4-.8.7s-.6.6-.9 1c-.1.1-.2.3-.3.3-.1.1-.2.1-.3.1 0 0-.1-.1-.2-.2s-.1-.3-.2-.6-.1-.6 0-.9.2-.6.4-.9.4-.6.7-.8c.3-.3.6-.5.9-.7s.6-.4.9-.5.6-.3.9-.3c.4-.1.8-.1 1.2-.1s.8.1 1.1.3.6.4.9.8.5.8.6 1.4c.1.3.1.6.1 1v1.3 1.5c0 .5-.1 1.1-.1 1.7.6-.2 1.3-.4 2-.6s1.5-.4 2.2-.7c.1-1 .2-2.1.3-3.3.1-1.1.3-2.2.4-3.4.1-.4.2-.7.3-.9.2-.3.4-.4.7-.5h.4c.1 0 .2 0 .3.1s.2.1.3.2.1.2.2.4c0 .1.1.3.1.5v.6c0 .4-.1.8-.2 1.3-.1.4-.1.9-.2 1.4s-.1 1-.1 1.5-.1 1-.1 1.5c.4-.1.7-.2 1-.3s.5-.2.6-.2.1 0 .2-.1h.2c.2 0 .3-.1.4 0 .1 0 .2 0 .3.1.1 0 .1.1.2.2 0 .1.1.2.1.3v.3c0 .1-.1.2-.2.2-.1.1-.1.1-.2.2-.1 0-.2.1-.2.1-.2.1-.3.1-.3.1-.1 0-.1 0-.1.1 0 0 0 0-.1 0 0 0 0 0-.1 0 0 0-.1 0-.2.1-.1 0-.2.1-.4.1-.2.1-.4.1-.6.2-.3.1-.5.2-.7.3z" fill="#333"/><path d="m466.7 425.2c-.3.2-.6.4-1 .6-.3.2-.6.4-.9.7-.3.2-.6.4-.9.6s-.6.3-.8.3c-.3.1-.5.1-.7 0s-.3-.2-.4-.4c0-.2-.1-.4 0-.5 0-.2.1-.3.1-.5.1-.1.1-.3.2-.4s.1-.2.2-.2l5.5-3.6-6.8-.3c-.2 0-.4-.1-.6-.1-.1-.1-.3-.2-.3-.5 0 0 0 0 0-.1s0-.2 0-.3 0-.2 0-.3 0-.2.1-.4c0-.1.1-.2.2-.3s.2-.2.4-.2h.4c.2 0 .5 0 .8.1.3 0 .7.1 1.1.1.4.1.8.1 1.2.2s.7.1 1.1.2c.3 0 .6.1.8.1s.3 0 .3.1c.4.1.7.1 1.1.1.3 0 .6.1.9.2s.5.2.7.3c.2.2.3.4.4.7.1.4.1.7.1 1s-.2.6-.4.9-.6.6-1 1c-.5.1-1.1.5-1.8.9z" fill="#333"/><path d="m432.1 484.9s-88.1-49.1-95.1-17.5-15.1 55.7 8.2 59.7c23.3 4.1 86.9-42.2 86.9-42.2z" fill="#3373aa"/><path d="m416.9 477.6c24.8-13.4 73.9-36.4 79.9-13 8.2 31.5 17.1 55.3-6 60.2-16.2 3.5-53.2-17.3-73.8-29.9-.3-15.3.1-2.2-.1-17.3z" fill="#4189c6"/><path d="m532.2 968.6h-34.7c-.6 0-1.1-.5-1.1-1.1v-49.1c0-.6.5-1.1 1.1-1.1h34.7c.6 0 1.1.5 1.1 1.1v49.1c0 .6-.5 1.1-1.1 1.1z" fill="#ccc"/><path d="m373.6 979.7-34.4 4.7c-.6.1-1.2-.4-1.3-1l-6.6-48.7c-.1-.6.4-1.2 1-1.3l34.4-4.7c.6-.1 1.2.4 1.3 1l6.6 48.7c0 .7-.4 1.3-1 1.3z" fill="#ccc"/><path d="m538.1 526.2c5.3 8.7 5.1 17.9 2.6 27.4-5.1-1.8-1.1-6.2-3.1-10.1-4.2 5.1-9.9 7.9-15.9 12.9 5.6.5 8.3-2.2 11.5-3.5 3.7-1.5 3.8-1.4 4.6 2.8-2.7 2.2-5.2 4.9-8.6 6-1.6.6-3.4.6-5.6 1.7 2.9-1.1 5.4-1.3 7.7-2.1.6 0 1.2.2 1.7.6.9 2.7 1.7 5.4 2.6 8.1.8 1.1 0 1.7-.8 2.2-4.7 5.6-8.4 11.9-12.7 17.9 4.3-1.7 6.4-6.1 10.4-8.1.6-.1 1.3 0 1.8.3 1.2 2.4-.2 4.1-1.4 5.8 1.4-.5 1.3-2.7 2.8-3.3 1.1.2 1.8.6 1.2 1.8-.7 5.9-5.2 11.5-1.5 17.8-.6 3.8-4.3 8 1.3 11.1.5 5.3-3.5 9.5-3.8 14.6.5 1.2.8 2.4-.5 3.4-3.7 2.2-3.9 6.9-7 9.6-.4 1.1-2.7 2.4.4 3.1 2.7.4 4.3-3.2 7.2-1.9.2.6.2 1.2-.2 1.7-.9 3.3-1.5 5.1 2.2 8.5 4.3 4 5.1 12.3 4.1 18.8-1.7 10.2-1.1 19.7 2.3 29.5 2.5 7.1.8 14.2-5.6 21.2-.2-3.7-.4-6-.5-8.8-2.7 2.1-1.6 6.2-5.1 7.8-.2-3.8-.4-7.5-.5-11.2-1-1.3-2.8-1.7-3.7-3.1-1.6-6.1-5.6-10.9-9-16.1-7.3-11.3-10.4-22.9-2.2-35.1 1.5-2.3.3-3.2-1-4.5-2.2-2.3-4-5.5-2.1-8 3.7-5 .6-8.7-1.2-12.8-.2-.6-.2-1.3 0-1.9.5-.4 1.2-.5 1.8-.4 1.9.6 3.1 2.4 5 3 .8.3 1.9.6 2.2-.5.2-.9-.7-1.5-1.3-2-2.3-2.6-6-3.3-8.5-5.7-3.3-3.5-1.2-8.3-3-12.1-4-4.9-4.6-10.5-3.9-16.5 5.5.6 3.9 5.9 5.8 8.9 1.3 1.9 2.7 3.7 5.1 4.3-2.1-1.3-4.9-2-4-5.5 3.3-1.4 5.9 1.6 9 1.4.1.9 0-.6.7 0 .5.5.9 0 .4-.3-2.7-1.5-5.2-3.3-8-4.8-2.9-2.4-6-4.7-7.8-8.2 4.1-7 3.6-13.4-.8-20.5-3.5-5.6-2.5-12.4-1.6-18.8.3-2 .7-3.8-1.4-5.5-9.9-7.8-11.4-18.2-8.6-29.7 1-3.9.7-6.6-2.1-9.8-6.8-7.6-8-16.9-5.1-26.4 1.7-5.5.9-9.2-3.3-13.8-9.5-10.1-10.3-23.1-8-36.1.7-3.9.3-6.4-2.2-9.2-3.7-4.1-6.4-8.9-8.2-14.2-2.8-8.3-.4-13.8 7.9-16.8 9.8-3.5 19.5-1.8 28.8 2 5.5 2.2 10.4 7.3 15.8 7.6 5 .3 9.3-5.8 14.8-7.7 9.2-3.2 18.3-4.1 27.5-.3 5.9 2.4 8.7 6.4 8.6 13.2-.2 15.1-2.4 29.2-13.9 40.3-2.1 2-1.1 4.2-1.2 6.4.7 1.1 0 1.7-.8 2.2-5.2 2.5-5.9 9.2-11 11.9-5.8 3.8-12 6.9-17.4 10.4 4-.9 7.4-5.8 12.8-3.7-2.7 7.9-10.1 7.5-15 9.7 7.7-1.5 15.1-6 22.3-10.9 2-1.3 5-6 8-5.2 1.8 5.2-4 9.9-6.7 12.9-2.3 2.5-5.2 4.2-8.3 5.6-4.3.4-8.1 2.8-11.1 3.4 3.4-1.2 8-2.8 12.7-4 2-1 3.8-2.6 6.2-2.6 1 .3 1.8.8 1.3 2.1 3.6 6.9 5.3 14.1 4 21.9-2.3.7-2.4-2-3.8-2.6-5.7 2.4-8.9 8.6-15.3 9.9 1.8-.2 3.8-2.2 5.1-.3 1.4 2.1-1 3.1-2.6 3.8s-3.2 1.3-4.1 1.8c3.9-1.1 7.7-3.9 11.7-6.4 3.9-2.4 4.9-.4 4.3 3.4-1.5 2.2-3.2 4.2-5.9 5.2-3 0-5.7 1.1-8.4 2.2-.9.3.1 1.2-.3.4 0-.1.1-.3.5-.3 2.5-.6 4.8-2.8 7.7-1.3.9 1.5.2 3.2 1.2 4.1z" fill="#d4410d"/><g fill="#e6511c"><path d="m536.8 555.1c1.2-2.5.1-2.7-1.8-1.7-3.4 1.8-6.7 3.8-10.2 5.5-1.4.7-3.4.9-4.2-.9-.7-1.6-.7-3.4 1.4-4.6 5.6-3.4 11.7-6.2 15.1-12.4.2-.4 1.5-.8 1.7-.6 1.2 1.1 1.8 2.6 1.9 4.2.2 3-2.7 6 0 9-.3 2.3-1.1 4.3-3.8 4.6-1.1-1-.9-2-.1-3.1z"/><path d="m507.9 605.9c-3.5-2.2-1.5-7.6-5.4-9.6-.3-1.6-.2-3 1.2-4 4.3.4 5.1 5.1 8.3 6.9.6 2.4 2.7 3.2 4.5 4.4 1.4.8 3.4 1.5 2.4 3.9-4 1.3-6.5-3.2-10.3-2.7.1.4-.1.9-.7 1.1z"/><path d="m536.8 520.8c2-1.5 4-3 6-4.4 1-4.5-1.2-9.6 2.5-13.6.8 1.4 1.6 2.8 2.5 4.2.4 5.7-2.6 9.9-6 13.9-1.4 1.7-3.8 2.6-3.6 5.4-1.3-.6-1.3-1.9-1.4-3.1-.8-.8-.8-1.6 0-2.4z"/><path d="m536.6 615.7c-1.1-.3-2.1-.9-3.2-.8-1.2.1-5.5.9-8.1 2.5-2.9 1.8 4.8-5.5 5.7-6.7 1.5-1.9 2.8-4.1 4.2-6.1 2 3.5 2.1 7.2 1.4 11.1z"/><path d="m536.9 586.8c-.4-.4-.8-.9-1.2-1.3-1.4-.5-.6-2.1-1.4-2.9-.5 0-.9.1-1.4.1-.9-3.9.7-7.6 1.3-11.3.4-.5.9-.9 1.3-1.4 2.6 5.5 3.8 11 1.4 16.8z"/><path d="m510.7 630.8c-.1.6-.2 1.2-.3 1.7-4.9-5.8-3.7-12.9-3.9-19.7 2.4 3.6 1.3 8.5 4.4 11.8-.5 2.1 1.8 4.1-.2 6.2z"/><path d="m549.2 454.8c.5-.5 1-1.1 1.5-1.6 2.6 5.4 3 11 1 16.7-.6.4-1.2.4-1.7-.1-.9-1-1.4-2.2-1.5-3.6.7-3.7-.6-7.7.7-11.4z"/><path d="m550.5 469.9h1.2c-1.4 5.7-3.4 11.1-7.9 15.2-.5-.5-1-1-1.5-1.5 1.5-5.3 4.9-9.5 8.2-13.7z"/><path d="m536.8 555.1c0 1 .1 2 .1 3.1-.8 1.8-1.9 3.3-4 3.8-.5 0-1.1 0-1.6 0-1.5.9-2.7 1.1-2.6-1.3 2.7-1.8 5.4-3.7 8.1-5.6z"/><path d="m532.8 646.1c-.1-.5-.1-.9-.2-1.4-2.6-3.6-2.6-7.4-1-11.4.4-1 .8-2 1.2-3 2.7 5.3 2.7 10.5 0 15.8z"/><path d="m525.9 708.9c1.8.4 4.3-.1 3.7 3.1-1.1.9-1.4 2.8-3.3 3.1-1.1-1.9-.5-4.1-.4-6.2z"/><path d="m497 457.4c6.1 4.4 13.2 6.9 19.6 10.7-14.5-2.4-27.3-8.2-37.6-19-3.5-4.5-4.7-9.5-3-14.9 1.1-5.6.3-4.9 2.5-1.7 3.1 4.5 7.4 8.8 10.2 12.6 2 1.4-4.4 3.4.3 4.7 2.7 2.6 6.4 4 8 7.6z"/><path d="m518.7 663.5c.4-1.3.3-3.1 1.9-3.2 1.6-.2 1.2 1.6 1.4 2.6.6 2.9.9 5.8 1.4 8.8 2-.5.3-2.8 2.1-3.8 1.1 8.8-2.2 16.9-2.5 26.4-6.8-10.2-14.6-18.9-6.8-30.9.8.9 1.2 1.9 1.2 3.1.3-1.2.5-2.2 1.3-3z"/><path d="m549.2 454.8c1.8 4.5 2.7 8.9-1 12.9-.1.3-.2.5-.3.8-7.7 10.1-18.7 13.7-30.3 16.4 5.1-4.4 12.5-5.2 16.7-10.9.2-1.4 1.1-2.6 2.3-3.1 2.5-1.1 4-2.3 1.6-4.9 3.1-2.9 5.7-6.1 7.8-9.9.7-1.4 1.1-3.3 3.2-1.3z"/><path d="m545.1 415.9c2.9-2.5 5.3-5.3 7.5-8.5 1-1.4 4.2-5.7 4.7-8.2 1.7-8.6 1.3 7.5 1.4 9.7.1 1.9.9 3.8-.3 5.6-1.2 2.2-1.7 4.9-4.5 5.8-6.9 8-19.1 14.2-29.1 14.3 4.8-2.6 8.9-4.9 13-7.1 1.7-3.7 5.5-5.2 8.2-7.8 2.2-1.8-2.7-2-.9-3.8z"/><path d="m545.2 502.9c-.2 4.2-.2 8.5-2 12.4-.2.4-.8.4-.9-.1-.2-1.4-.2-3.1-2.9-.7-4.2 3.7-9.4 5.4-15.6 7.4-.5.2-.9-.5-.5-.8 3-2.3 6.2-3.2 9-5.7.4-.4 0-1-.5-.8-2.5 1.1-4.6 2-7 3-.4.2-.8-.3-.6-.7 1.4-2.6 3.7-3.3 5.6-4.4 4.6-2.6 10.1-4.9 11.8-10.1 1.9-5.7 1.4-4.9 3.5.3.1 0 .1.1.1.2z"/><path d="m488.7 493.2c-.2-.1-.5-.2-.5-.4-1-4.2-4.8-9.6-.4-12.2 2.1-1.2 5.8 5.6 9.1 8.4 1.3 4.8 8 4.5 9.1 9.6 2.2 2.9 6.3 2.5 10.1 6.2-9.9-2.6-17.6-5.5-24.2-11.1-.7-.6-1.9-4.8-3.4-.4z"/><path d="m488.8 450.7c-2.7-.2-4.4-1.6-5.3-4.4 1.9-.3 4.4 2.3 5.2-1.2 10.3 5.9 21.1 11 31.2 18.7-8.2-1.2-14.6-5.3-21.5-7.8-3.8-.7-6.7-3.1-9.6-5.3z"/><path d="m513.6 542.5c1.1.6 2.2 1.3 5 2.9-9.4-.2-14.5-5.9-20.8-8.4-1.1.4-1.6-.3-2.1-1.1-2.1-4.2-3.9-8.5-.9-13.6 3.2 3.4 6.1 6.5 9 9.6.5 1.2.1 2.7 1.3 3.6 2.7 2.5 6.4 3.7 8.5 7z"/><path d="m534.2 571.4c2.5 4.1.2 7.7-1.3 11.3-2.3 3.7-5.7 6.5-9.1 9.3-.7.6-1.6 1.7-2.8.8 1.6-1.7-2.2-2.1-.8-3.9 4.5-5.9 9.6-11.3 12.4-18.4.5.3 1 .6 1.6.9z"/><path d="m506.5 570.2c-2.6-3.6-3.9-9.1-2.1-13.6 11.6 20 17.5 17.6 19.9 20-6.8-.6-11.2-4.6-16.6-6.4-.4.7-.8.7-1.2 0z"/><path d="m476.3 434.2c-.8 5.3.9 10.1 2.7 14.9 3.5 9.4 10.3 15.5 19.2 19.6.6 1.4-.1 2.1-1.3 2.6-14.6-4.5-25.4-23.9-20.6-37.1z"/><path d="m538.2 465.9c1.1 2.9 3 1.6 5.9-.4-2.3 5.7-7 5.9-9.8 8.4-5.6.7-9.9 5.3-16.4 5.6 6.1-6.4 13.4-9.7 20.3-13.6z"/><path d="m545.1 415.9c.5.4 1.1.9 1.6 1.3 1.2.8 3.3-1.4 3.6.5.3 2-1.8 2.5-3.6 2.6-3.3 2.2-6.4 4.9-10.5 5.8-4.9 1.8-9.5 4.6-15.9 5.5 8.7-6.1 16.4-11.5 24.8-15.7z"/><path d="m553.1 419.4c1.1-2 1.6-4.5 4.2-5.5-.1 10.1-4.4 17.6-13.7 22.1-1.6.2-3.7 2-4.1-1.4 5.8-2.7 10.7-6.5 13.9-12.2.7-1.1 1.7-2.2-.3-3z"/><path d="m531.6 633.3c1.6 3.7.7 7.6 1 11.4-2.5 0-3.2 5.3-6.8 2.4-.2-1.7-1-3-2.3-4 3.2-2.9 3.8-7.8 8.1-9.8z"/><path d="m531.1 698.3c-3.2-7.1-4.1-14 2.3-21.2 1.8 6.5-1.5 11.6-.9 16.9-1.2 1.2.3 3.3-1.4 4.3z"/><path d="m547.9 468.4c0-.3.1-.6.3-.8 1.9-.4 2 1 2.3 2.2-2.5 4.7-4.4 9.8-8.2 13.7-1.8 1-3.5 2-5.3 3-1.5.4-3.1 1.1-2.9-1.6 6.1-4.1 12.9-7.8 13.8-16.5z"/><path d="m506.1 498.6c-2.7-3.5-9.8-2.8-9.1-9.5 5 2.5 10.2 4.5 14.8 8.6-1.9 1.8-4 .2-5.7.9z"/><path d="m503.4 535.8c-4.8-1.7.2-2.6.3-3.9 5.6 2.7 11.3 5.4 16.2 9.8-2 1.7-3.4-.6-5-.4-4.3-.8-7.7-3.7-11.5-5.5z"/><path d="m495.6 535.8c.7.4 1.4.8 2.1 1.1 2.3 5.6 8.1 7.7 12.4 11.6-6.4.5-11.9-4.4-14.5-12.7z"/><path d="m518.9 629.4c1.7 1.2 4.9 2.2 3.2 4.9-1.6 2.6-4.5 1.6-6.7.2-1.3-.8-2.3-2.1-3.4-3.2-1-2.6.8-2.6 2.4-2.5 1.5 0 2.8 1.5 4.5.6z"/><path d="m488.8 492.9c5.8 6.5 7.8 9.2 13.6 11.4.1 2.6-1.2 2.2-2.8 1.4-5.4-2.6-9.9-6.9-11.4-12.9-.1-3.3.6.1.6.1z"/><path d="m518.9 607.4c-.8-2.2-2.8-2.4-4.6-3.2-2.1-.9-3.9-2.3-2.3-5 4 2.3 8.5 3.9 12.2 7.9-2.2 0-3.7.2-5.3.3z"/><path d="m477.4 402.7c-3.2-5-2.7-28.7-2.3-27.2 1.7 5.3 3.7 9.3 4.2 10.3 2.7 4.6 6.7 8 10.6 11.4.7 1.1 0 2.1-.3 3.1.5 2.9 2 2.3 4.6 6.3 7.3 5.4 15.9 8.3 23.6 12.9-13.1-2.5-25.3-7.1-35.6-15.8-.9-.8-1.5-3.4-3.5-1.1-.4.7-.8.7-1.3.1z"/><path d="m488.7 400.3c.4-1 .9-2 1.3-3.1 9.4 4.4 18.4 9.6 27.8 16.6-9.4-1.3-16.2-5.9-23.6-8.9-2.1-1.2-5.2-1.3-5.5-4.6z"/><path d="m477.4 402.7c.4 0 .8-.1 1.2-.1 4.7 7 10.7 12.6 18.2 16.7 1.1 1.6 1.1 2.6-1.3 2.5-9.1-3.4-15-9.8-18.1-19.1z"/><path d="m495.6 421.9c1-.5 1.3-1.4 1.3-2.5 5.4 1.2 10.5 3.4 15.3 6.5-5.6-1.3-11.1-2.7-16.6-4z"/><path d="m518.9 629.4c-.9 2.3-2.2 2.4-4 .9-1.3-1.1-2.4-.8-2.9.9-.4-.3-.8-.4-1.3-.5.4-2-2.5-4.1.1-6.1 2.9 1.3 5.7 2.6 8.1 4.8z"/><path d="m539.5 434.7c1 1.6 2.6 1.1 4.1 1.3-4.9 1.4-9.9 2.8-14.8 4.2-.2-.5-.4-1-.6-1.5 3.8-1.3 7.5-2.7 11.3-4z"/><path d="m534 485c.6 1.3 1.8 1.3 2.9 1.6-5.1 1.4-10.1 2.8-15.2 4.2 3.8-3.1 7.9-4.9 12.3-5.8z"/><path d="m531.1 698.3c.3-1.5-.2-3.2 1.4-4.3.6 4.7 4.9 7.2 6.7 11.3-3-2.2-6.9-3-8.1-7z"/><path d="m523.5 643.1c1.1-.1 2.7-.6 3-.1 1 1.4.9 3-.7 4.1-1.4.2-2.9 2.3-4.3.3-1.3-2.1.8-3.1 2-4.3z"/><path d="m518.7 663.5v9.1c-3.4-2.9-2.1-6.2-2.5-9.3 1-1.3 1.7.2 2.5.2z"/><path d="m536.8 520.8v2.4c-3.7.8-7.4 1.7-11.1 2.5 3.3-2.7 6.8-4.8 11.1-4.9z"/><path d="m499.6 505.7c1.1-.1 2.3-.1 2.8-1.4 3 .7 6.1 1.3 9.3 4-4.7-.3-8.5-.9-12.1-2.6z"/><path d="m503.4 535.8c4.3.8 8 2.9 11.5 5.4-.4.4-.8.8-1.2 1.2-4.1-1.3-7.4-3.6-10.3-6.6z"/><path d="m496.9 471.3c.4-.9.9-1.8 1.3-2.6 2.7 1 5.4 1.9 8.1 2.9.3 1.2.1 1.8-1.3 1.3-2.7-.5-5.4-1-8.1-1.6z"/><path d="m534.2 582.6c.5 1 1 1.9 1.4 2.9-1.1 2.9-2.6 5.5-7.1 7.1 2.4-4 5.5-6.3 5.7-10z"/><path d="m507.9 605.9c.3-.4.5-.9.8-1.3 2.2 2.7 5.2 4.2 9.4 6.8-5.7 0-8.2-2.3-10.2-5.5z"/><path d="m488.8 450.7c3.6 1 6.5 3.3 9.6 5.4-.5.4-.9.9-1.4 1.3-3-2-6.5-3.2-8.2-6.7z"/><path d="m506.5 570.2c.4 0 .8 0 1.2-.1 1.8 2.3 3.7 4.6 5.7 7.1-3.5-1-6-3-6.9-7z"/><path d="m505 472.9 1.3-1.3c2.5.9 5 1.7 9.1 3.2-5 .9-7.8-.3-10.4-1.9z"/><path d="m528.7 560.7c.5 1.3 1.6 1.1 2.6 1.3-2.8 2.2-6.5 1.2-10.8 3.6 2.8-4 5.9-3.7 8.2-4.9z"/><path d="m485.7 412.8c1.8 1.5 3.7 3.1 5.5 4.6 0 .6.1 1.1.1 1.7-2.4-1.7-5.1-3-7-5.1-1.6-1.7.5-1.2 1.4-1.2z"/><path d="m581.5 273.2s-6.7 28.9-13.1 43.6c-6.5 14.7-14.9 31.9-14.9 31.9s9.4-8.4 18.3-30.8c8.8-22.5 9.7-44.7 9.7-44.7z"/></g><path d="m262.7 616.1c-1.7 7.4 4.6 2.4 4.6 2.4l-13.3 184.4s-64.7-9.3-72-72.7c18-87.4 28.3-199.2 28.3-199.2s32.9-6.4 52.4 85.1z" fill="#f7f6f5"/><path d="m255.8 834.7s53.1-13.4 70.8-3.6 47.6 25.7 48.1 42.5-22.3 64.3-46.5 62.5-88.9-47.9-88.9-47.9z" fill="#f2b181"/><path d="m295 873.4c10.3-3.1 26.4-30.9 21.5-39.3-24.5 3.9-61.9-107-57.5-100 4.7 7.4-21.6-48.5-70-23.2-23.2 28 9.7 124.8 45.7 167.9 6.8 8.1 19.6 9.1 24.2 7.4 6.6-2.5 25.6-9.6 36.1-12.8z" fill="#f7f6f5"/><path d="m226.2 875.5s14.7-35.7 22.7-45.7 40.7-30.6 40.7-30.6l30.9 33.8s-18.6 41.6-26.6 49.9-36.6 23.3-36.6 23.3z" fill="#fff"/><path d="m576.7 826.7s-54.2-14.1-71.6-3.8c-17.5 10.2-47 26.7-46.8 44.3s25.1 67.1 49.4 65.3 87.8-49.9 87.8-49.9z" fill="#f2b181"/><path d="m536.9 857.7c-8.4-4.4-12.2-16.4-6.5-22.8.9-.8 73.9-111.9 69-106.6-5.3 5.6 26.6-24.2 64.5 5.4 15.5 27.8-37.2 107.4-75.5 138.4-7.2 5.8-18.5 4.6-22.2 2.4-5.4-3.2-20.7-12.4-29.3-16.8z" fill="#f7f6f5"/><path d="m610.7 876.3s-11.8-36.7-19-47.3-38.1-33.7-38.1-33.7l-37.6 27.2s15.3 42.9 22.6 51.8 34.7 26.1 34.7 26.1z" fill="#fff"/></svg> \ No newline at end of file diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_3_head-192.png b/borestop/src/main/webapp/content/images/jhipster_family_member_3_head-192.png new file mode 100755 index 0000000000000000000000000000000000000000..b1e4fb3c8654570012950a3c888f11cb92c23bdd Binary files /dev/null and b/borestop/src/main/webapp/content/images/jhipster_family_member_3_head-192.png differ diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_3_head-256.png b/borestop/src/main/webapp/content/images/jhipster_family_member_3_head-256.png new file mode 100755 index 0000000000000000000000000000000000000000..aa058c7a0aba654a4991c8bbd5d3e2d32517acd1 Binary files /dev/null and b/borestop/src/main/webapp/content/images/jhipster_family_member_3_head-256.png differ diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_3_head-384.png b/borestop/src/main/webapp/content/images/jhipster_family_member_3_head-384.png new file mode 100755 index 0000000000000000000000000000000000000000..1d10bd5da3d4d417aedfd3bf2e8515eff092c506 Binary files /dev/null and b/borestop/src/main/webapp/content/images/jhipster_family_member_3_head-384.png differ diff --git a/borestop/src/main/webapp/content/images/jhipster_family_member_3_head-512.png b/borestop/src/main/webapp/content/images/jhipster_family_member_3_head-512.png new file mode 100755 index 0000000000000000000000000000000000000000..e719f1df805db311c8e4c4e8e62a5b00d2cc90ed Binary files /dev/null and b/borestop/src/main/webapp/content/images/jhipster_family_member_3_head-512.png differ diff --git a/borestop/src/main/webapp/content/images/logo-jhipster.png b/borestop/src/main/webapp/content/images/logo-jhipster.png new file mode 100644 index 0000000000000000000000000000000000000000..6a005bf5e4b6d9d1cffd5aa688612a7a67be3809 Binary files /dev/null and b/borestop/src/main/webapp/content/images/logo-jhipster.png differ diff --git a/borestop/src/main/webapp/content/scss/_bootstrap-variables.scss b/borestop/src/main/webapp/content/scss/_bootstrap-variables.scss new file mode 100644 index 0000000000000000000000000000000000000000..a64158a6942a5ff6ab603f749e3f85cabc3ea4a4 --- /dev/null +++ b/borestop/src/main/webapp/content/scss/_bootstrap-variables.scss @@ -0,0 +1,45 @@ +/* +* Bootstrap overrides https://getbootstrap.com/docs/4.0/getting-started/theming/ +* All values defined in bootstrap source +* https://github.com/twbs/bootstrap/blob/v4-dev/scss/_variables.scss can be overwritten here +* Make sure not to add !default to values here +*/ + +// Colors: +// Grayscale and brand colors for use across Bootstrap. + +$primary: #3e8acc; +$success: #28a745; +$info: #17a2b8; +$warning: #ffc107; +$danger: #dc3545; + +// Options: +// Quickly modify global styling by enabling or disabling optional features. +$enable-rounded: true; +$enable-shadows: false; +$enable-gradients: false; +$enable-transitions: true; +$enable-hover-media-query: false; +$enable-grid-classes: true; +$enable-print-styles: true; + +// Components: +// Define common padding and border radius sizes and more. + +$border-radius: 0.15rem; +$border-radius-lg: 0.125rem; +$border-radius-sm: 0.1rem; + +// Body: +// Settings for the `<body>` element. + +$body-bg: #e4e5e6; + +// Typography: +// Font, line-height, and color for body text, headings, and more. + +$font-size-base: 1rem; + +$dropdown-link-hover-color: white; +$dropdown-link-hover-bg: #343a40; diff --git a/borestop/src/main/webapp/content/scss/global.scss b/borestop/src/main/webapp/content/scss/global.scss new file mode 100644 index 0000000000000000000000000000000000000000..543a62c1a8d47c6b637b0e68d654c38e45a5bb97 --- /dev/null +++ b/borestop/src/main/webapp/content/scss/global.scss @@ -0,0 +1,195 @@ +@import 'bootstrap-variables'; +@import '~bootstrap/scss/functions'; +@import '~bootstrap/scss/variables'; + +/* ============================================================== +Bootstrap tweaks +===============================================================*/ + +body, +h1, +h2, +h3, +h4 { + font-weight: 300; +} + +/* Increase contrast of links to get 100% on Lighthouse Accessability Audit. Override this color if you want to change the link color, or use a Bootswatch theme */ +a { + color: #533f03; + font-weight: bold; +} + +a:hover { + color: #533f03; +} + +/* override hover color for dropdown-item forced by bootstrap to all a:not([href]):not([tabindex]) elements in _reboot.scss */ +a:not([href]):not([tabindex]):hover.dropdown-item { + color: $dropdown-link-hover-color; +} + +/* override .dropdown-item.active background-color on hover */ +.dropdown-item.active:hover { + background-color: mix($dropdown-link-hover-bg, $dropdown-link-active-bg, 50%); +} + +a:hover { + /* make sure browsers use the pointer cursor for anchors, even with no href */ + cursor: pointer; +} + +.dropdown-item:hover { + color: $dropdown-link-hover-color; +} + +/* ========================================================================== +Browser Upgrade Prompt +========================================================================== */ +.browserupgrade { + margin: 0.2em 0; + background: #ccc; + color: #000; + padding: 0.2em 0; +} + +/* ========================================================================== +Generic styles +========================================================================== */ + +/* Error highlight on input fields */ +.ng-valid[required], +.ng-valid.required { + border-left: 5px solid green; +} + +.ng-invalid:not(form) { + border-left: 5px solid red; +} + +/* other generic styles */ + +.jh-card { + padding: 1.5%; + margin-top: 20px; + border: none; +} + +.error { + color: white; + background-color: red; +} + +.pad { + padding: 10px; +} + +.w-40 { + width: 40% !important; +} + +.w-60 { + width: 60% !important; +} + +.break { + white-space: normal; + word-break: break-all; +} + +.readonly { + background-color: #eee; + opacity: 1; +} + +.footer { + border-top: 1px solid rgba(0, 0, 0, 0.125); +} + +.hand, +[jhisortby] { + cursor: pointer; +} + +/* ========================================================================== +Custom alerts for notification +========================================================================== */ +.alerts { + .alert { + text-overflow: ellipsis; + pre { + background: none; + border: none; + font: inherit; + color: inherit; + padding: 0; + margin: 0; + } + .popover pre { + font-size: 10px; + } + } + .jhi-toast { + position: fixed; + width: 100%; + &.left { + left: 5px; + } + &.right { + right: 5px; + } + &.top { + top: 55px; + } + &.bottom { + bottom: 55px; + } + } +} + +@media screen and (min-width: 480px) { + .alerts .jhi-toast { + width: 50%; + } +} + +/* ========================================================================== +entity detail page css +========================================================================== */ +.row.jh-entity-details > { + dd { + margin-bottom: 15px; + } +} + +@media screen and (min-width: 768px) { + .row.jh-entity-details > { + dt { + margin-bottom: 15px; + } + dd { + border-bottom: 1px solid #eee; + padding-left: 180px; + margin-left: 0; + } + } +} + +/* ========================================================================== +ui bootstrap tweaks +========================================================================== */ +.nav, +.pagination, +.carousel, +.panel-title a { + cursor: pointer; +} + +.thread-dump-modal-lock { + max-width: 450px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +/* jhipster-needle-scss-add-main JHipster will add new css style */ diff --git a/borestop/src/main/webapp/content/scss/vendor.scss b/borestop/src/main/webapp/content/scss/vendor.scss new file mode 100644 index 0000000000000000000000000000000000000000..31688d043ce70644ed265a9f630c4cc11307fb70 --- /dev/null +++ b/borestop/src/main/webapp/content/scss/vendor.scss @@ -0,0 +1,12 @@ +/* after changing this file run 'npm run webpack:build' */ + +/*************************** +put Sass variables here: +eg $input-color: red; +****************************/ +// Override Bootstrap variables +@import 'bootstrap-variables'; +// Import Bootstrap source files from node_modules +@import '~bootstrap/scss/bootstrap'; + +/* jhipster-needle-scss-add-vendor JHipster will add new css style */ diff --git a/borestop/src/main/webapp/favicon.ico b/borestop/src/main/webapp/favicon.ico new file mode 100755 index 0000000000000000000000000000000000000000..4179874f53b3c3b0ba9e2a401412f814ab6296bd Binary files /dev/null and b/borestop/src/main/webapp/favicon.ico differ diff --git a/borestop/src/main/webapp/i18n/en/activate.json b/borestop/src/main/webapp/i18n/en/activate.json new file mode 100644 index 0000000000000000000000000000000000000000..058bd497fbebac324ac113e2517f7a7577c721b4 --- /dev/null +++ b/borestop/src/main/webapp/i18n/en/activate.json @@ -0,0 +1,9 @@ +{ + "activate": { + "title": "Activation", + "messages": { + "success": "<strong>Your user account has been activated.</strong> Please ", + "error": "<strong>Your user could not be activated.</strong> Please use the registration form to sign up." + } + } +} diff --git a/borestop/src/main/webapp/i18n/en/audits.json b/borestop/src/main/webapp/i18n/en/audits.json new file mode 100644 index 0000000000000000000000000000000000000000..8af22b200aec4b8c07435d685c24250924292d6c --- /dev/null +++ b/borestop/src/main/webapp/i18n/en/audits.json @@ -0,0 +1,28 @@ +{ + "audits": { + "title": "Audits", + "filter": { + "title": "Filter per date", + "from": "from", + "to": "to", + "button": { + "weeks": "Weeks", + "today": "today", + "clear": "clear", + "close": "close" + } + }, + "table": { + "header": { + "principal": "User", + "date": "Date", + "status": "State", + "data": "Extra data" + }, + "data": { + "remoteAddress": "Remote Address:" + } + }, + "notFound": "No audit found" + } +} diff --git a/borestop/src/main/webapp/i18n/en/configuration.json b/borestop/src/main/webapp/i18n/en/configuration.json new file mode 100644 index 0000000000000000000000000000000000000000..09c9a1af0f508ffcce441a2a27a51acc959d896a --- /dev/null +++ b/borestop/src/main/webapp/i18n/en/configuration.json @@ -0,0 +1,10 @@ +{ + "configuration": { + "title": "Configuration", + "filter": "Filter (by prefix)", + "table": { + "prefix": "Prefix", + "properties": "Properties" + } + } +} diff --git a/borestop/src/main/webapp/i18n/en/error.json b/borestop/src/main/webapp/i18n/en/error.json new file mode 100644 index 0000000000000000000000000000000000000000..d2575632769fbed14ae2ece28c1a599091450d4e --- /dev/null +++ b/borestop/src/main/webapp/i18n/en/error.json @@ -0,0 +1,14 @@ +{ + "error": { + "title": "Error page!", + "http": { + "400": "Bad request.", + "403": "You are not authorized to access this page.", + "404": "The page does not exist.", + "405": "The HTTP verb you used is not supported for this URL.", + "500": "Internal server error." + }, + "concurrencyFailure": "Another user modified this data at the same time as you. Your changes were rejected.", + "validation": "Validation error on the server." + } +} diff --git a/borestop/src/main/webapp/i18n/en/global.json b/borestop/src/main/webapp/i18n/en/global.json new file mode 100644 index 0000000000000000000000000000000000000000..8d7ada0739b084709f12733e3828adc0294678d7 --- /dev/null +++ b/borestop/src/main/webapp/i18n/en/global.json @@ -0,0 +1,140 @@ +{ + "global": { + "title": "Borestop", + "browsehappy": "You are using an <strong>outdated</strong> browser. Please <a href=\"http://browsehappy.com/?locale=en\">upgrade your browser</a> to improve your experience.", + "menu": { + "home": "Home", + "jhipster-needle-menu-add-element": "JHipster will add additional menu entries here (do not translate!)", + "entities": { + "main": "Entities", + "jhipster-needle-menu-add-entry": "JHipster will add additional entities here (do not translate!)" + }, + "account": { + "main": "Account", + "settings": "Settings", + "password": "Password", + "sessions": "Sessions", + "login": "Sign in", + "logout": "Sign out", + "register": "Register" + }, + "admin": { + "main": "Administration", + "userManagement": "User management", + "tracker": "User tracker", + "metrics": "Metrics", + "health": "Health", + "configuration": "Configuration", + "logs": "Logs", + "audits": "Audits", + "apidocs": "API", + "database": "Database", + "jhipster-needle-menu-add-admin-element": "JHipster will add additional menu entries here (do not translate!)" + }, + "language": "Language" + }, + "form": { + "username.label": "Username", + "username.placeholder": "Your username", + "currentpassword.label": "Current password", + "currentpassword.placeholder": "Current password", + "newpassword.label": "New password", + "newpassword.placeholder": "New password", + "confirmpassword.label": "New password confirmation", + "confirmpassword.placeholder": "Confirm the new password", + "email.label": "Email", + "email.placeholder": "Your email" + }, + "messages": { + "info": { + "authenticated": { + "prefix": "If you want to ", + "link": "sign in", + "suffix": ", you can try the default accounts:<br/>- Administrator (login=\"admin\" and password=\"admin\") <br/>- User (login=\"user\" and password=\"user\")." + }, + "register": { + "noaccount": "You don't have an account yet?", + "link": "Register a new account" + } + }, + "error": { + "dontmatch": "The password and its confirmation do not match!" + }, + "validate": { + "newpassword": { + "required": "Your password is required.", + "minlength": "Your password is required to be at least 4 characters.", + "maxlength": "Your password cannot be longer than 50 characters.", + "strength": "Password strength:" + }, + "confirmpassword": { + "required": "Your confirmation password is required.", + "minlength": "Your confirmation password is required to be at least 4 characters.", + "maxlength": "Your confirmation password cannot be longer than 50 characters." + }, + "email": { + "required": "Your email is required.", + "invalid": "Your email is invalid.", + "minlength": "Your email is required to be at least 5 characters.", + "maxlength": "Your email cannot be longer than 50 characters." + } + } + }, + "field": { + "id": "ID" + }, + "ribbon": { + "dev": "Development" + }, + "item-count": "Showing {{first}} - {{second}} of {{total}} items." + }, + "entity": { + "action": { + "addblob": "Add blob", + "addimage": "Add image", + "back": "Back", + "cancel": "Cancel", + "delete": "Delete", + "edit": "Edit", + "open": "Open", + "save": "Save", + "view": "View" + }, + "detail": { + "field": "Field", + "value": "Value" + }, + "delete": { + "title": "Confirm delete operation" + }, + "validation": { + "required": "This field is required.", + "minlength": "This field is required to be at least {{ min }} characters.", + "maxlength": "This field cannot be longer than {{ max }} characters.", + "min": "This field should be at least {{ min }}.", + "max": "This field cannot be more than {{ max }}.", + "minbytes": "This field should be at least {{ min }} bytes.", + "maxbytes": "This field cannot be more than {{ max }} bytes.", + "pattern": "This field should follow pattern for {{ pattern }}.", + "number": "This field should be a number.", + "datetimelocal": "This field should be a date and time.", + "patternLogin": "This field can only contain letters, digits and e-mail addresses." + } + }, + "error": { + "internalServerError": "Internal server error", + "server.not.reachable": "Server not reachable", + "url.not.found": "Not found", + "NotNull": "Field {{ fieldName }} cannot be empty!", + "Size": "Field {{ fieldName }} does not meet min/max size requirements!", + "userexists": "Login name already used!", + "emailexists": "Email is already in use!", + "idexists": "A new {{ entityName }} cannot already have an ID", + "idnull": "Invalid ID", + "file": { + "could.not.extract": "Could not extract file", + "not.image": "File was expected to be an image but was found to be \"{{ fileType }}\"" + } + }, + "footer": "This is your footer" +} diff --git a/borestop/src/main/webapp/i18n/en/health.json b/borestop/src/main/webapp/i18n/en/health.json new file mode 100644 index 0000000000000000000000000000000000000000..0cbff2660c9e3b1698ba16a22a99d70b9b60d881 --- /dev/null +++ b/borestop/src/main/webapp/i18n/en/health.json @@ -0,0 +1,29 @@ +{ + "health": { + "title": "Health Checks", + "refresh.button": "Refresh", + "stacktrace": "Stacktrace", + "details": { + "details": "Details", + "properties": "Properties", + "name": "Name", + "value": "Value", + "error": "Error" + }, + "indicator": { + "diskSpace": "Disk space", + "mail": "Email", + "ping": "Application", + "db": "Database" + }, + "table": { + "service": "Service name", + "status": "Status" + }, + "status": { + "UNKNOWN": "UNKNOWN", + "UP": "UP", + "DOWN": "DOWN" + } + } +} diff --git a/borestop/src/main/webapp/i18n/en/home.json b/borestop/src/main/webapp/i18n/en/home.json new file mode 100644 index 0000000000000000000000000000000000000000..d9fc499067e53a6b1d79b2cfb96ab30529bf2aae --- /dev/null +++ b/borestop/src/main/webapp/i18n/en/home.json @@ -0,0 +1,19 @@ +{ + "home": { + "title": "Welcome, Java Hipster!", + "subtitle": "This is your homepage", + "logged": { + "message": "You are logged in as user \"{{username}}\"." + }, + "question": "If you have any question on JHipster:", + "link": { + "homepage": "JHipster homepage", + "stackoverflow": "JHipster on Stack Overflow", + "bugtracker": "JHipster bug tracker", + "chat": "JHipster public chat room", + "follow": "follow @jhipster on Twitter" + }, + "like": "If you like JHipster, don't forget to give us a star on", + "github": "GitHub" + } +} diff --git a/borestop/src/main/webapp/i18n/en/login.json b/borestop/src/main/webapp/i18n/en/login.json new file mode 100644 index 0000000000000000000000000000000000000000..4667958802c9cecdfdf9c55144ab08567b5cc801 --- /dev/null +++ b/borestop/src/main/webapp/i18n/en/login.json @@ -0,0 +1,19 @@ +{ + "login": { + "title": "Sign in", + "form": { + "password": "Password", + "password.placeholder": "Your password", + "rememberme": "Remember me", + "button": "Sign in" + }, + "messages": { + "error": { + "authentication": "<strong>Failed to sign in!</strong> Please check your credentials and try again." + } + }, + "password": { + "forgot": "Did you forget your password?" + } + } +} diff --git a/borestop/src/main/webapp/i18n/en/logs.json b/borestop/src/main/webapp/i18n/en/logs.json new file mode 100644 index 0000000000000000000000000000000000000000..8ee0ba5a2a0c2b2bd34d561e8c2e5e2330e2438d --- /dev/null +++ b/borestop/src/main/webapp/i18n/en/logs.json @@ -0,0 +1,11 @@ +{ + "logs": { + "title": "Logs", + "nbloggers": "There are {{ total }} loggers.", + "filter": "Filter", + "table": { + "name": "Name", + "level": "Level" + } + } +} diff --git a/borestop/src/main/webapp/i18n/en/metrics.json b/borestop/src/main/webapp/i18n/en/metrics.json new file mode 100644 index 0000000000000000000000000000000000000000..c514dee72d6114d0353daa3f6737ba6cf60ea36f --- /dev/null +++ b/borestop/src/main/webapp/i18n/en/metrics.json @@ -0,0 +1,102 @@ +{ + "metrics": { + "title": "Application Metrics", + "refresh.button": "Refresh", + "updating": "Updating...", + "jvm": { + "title": "JVM Metrics", + "memory": { + "title": "Memory", + "total": "Total Memory", + "heap": "Heap Memory", + "nonheap": "Non-Heap Memory" + }, + "threads": { + "title": "Threads", + "all": "All", + "runnable": "Runnable", + "timedwaiting": "Timed waiting", + "waiting": "Waiting", + "blocked": "Blocked", + "dump": { + "title": "Threads dump", + "id": "Id: ", + "blockedtime": "Blocked Time", + "blockedcount": "Blocked Count", + "waitedtime": "Waited Time", + "waitedcount": "Waited Count", + "lockname": "Lock name", + "stacktrace": "Stacktrace", + "show": "Show Stacktrace", + "hide": "Hide Stacktrace" + } + }, + "gc": { + "title": "Garbage collections", + "marksweepcount": "Mark Sweep count", + "marksweeptime": "Mark Sweep time", + "scavengecount": "Scavenge count", + "scavengetime": "Scavenge time" + }, + "http": { + "title": "HTTP requests (time in millisecond)", + "active": "Active requests:", + "total": "Total requests:", + "table": { + "code": "Code", + "count": "Count", + "mean": "Mean", + "average": "Average", + "max": "Max" + }, + "code": { + "ok": "Ok", + "notfound": "Not found", + "servererror": "Server Error" + } + } + }, + "servicesstats": { + "title": "Services statistics (time in millisecond)", + "table": { + "name": "Service name", + "count": "Count", + "mean": "Mean", + "min": "Min", + "max": "Max", + "p50": "p50", + "p75": "p75", + "p95": "p95", + "p99": "p99" + } + }, + "cache": { + "title": "Cache statistics", + "cachename": "Cache name", + "hits": "Cache Hits", + "misses": "Cache Misses", + "gets": "Cache Gets", + "puts": "Cache Puts", + "removals": "Cache Removals", + "evictions": "Cache Evictions", + "hitPercent": "Cache Hit %", + "missPercent": "Cache Miss %", + "averageGetTime": "Average get time (µs)", + "averagePutTime": "Average put time (µs)", + "averageRemoveTime": "Average remove time (µs)" + }, + "datasource": { + "usage": "Connection Pool Usage", + "title": "DataSource statistics (time in millisecond)", + "name": "Pool usage", + "count": "Count", + "mean": "Mean", + "min": "Min", + "max": "Max", + "p50": "p50", + "p75": "p75", + "p95": "p95", + "p99": "p99" + } + } +} diff --git a/borestop/src/main/webapp/i18n/en/password.json b/borestop/src/main/webapp/i18n/en/password.json new file mode 100644 index 0000000000000000000000000000000000000000..fc9b6c946d51be66a8257e8945b9ddda9692a3f4 --- /dev/null +++ b/borestop/src/main/webapp/i18n/en/password.json @@ -0,0 +1,12 @@ +{ + "password": { + "title": "Password for [<strong>{{username}}</strong>]", + "form": { + "button": "Save" + }, + "messages": { + "error": "<strong>An error has occurred!</strong> The password could not be changed.", + "success": "<strong>Password changed!</strong>" + } + } +} diff --git a/borestop/src/main/webapp/i18n/en/register.json b/borestop/src/main/webapp/i18n/en/register.json new file mode 100644 index 0000000000000000000000000000000000000000..1a0aeecfcca6d62c5ae8362651c0943302858700 --- /dev/null +++ b/borestop/src/main/webapp/i18n/en/register.json @@ -0,0 +1,24 @@ +{ + "register": { + "title": "Registration", + "form": { + "button": "Register" + }, + "messages": { + "validate": { + "login": { + "required": "Your username is required.", + "minlength": "Your username is required to be at least 1 character.", + "maxlength": "Your username cannot be longer than 50 characters.", + "pattern": "Your username is invalid." + } + }, + "success": "<strong>Registration saved!</strong> Please check your email for confirmation.", + "error": { + "fail": "<strong>Registration failed!</strong> Please try again later.", + "userexists": "<strong>Login name already registered!</strong> Please choose another one.", + "emailexists": "<strong>Email is already in use!</strong> Please choose another one." + } + } + } +} diff --git a/borestop/src/main/webapp/i18n/en/reset.json b/borestop/src/main/webapp/i18n/en/reset.json new file mode 100644 index 0000000000000000000000000000000000000000..4c35e9a2c338108445acb78354998d192c7b5372 --- /dev/null +++ b/borestop/src/main/webapp/i18n/en/reset.json @@ -0,0 +1,26 @@ +{ + "reset": { + "request": { + "title": "Reset your password", + "form": { + "button": "Reset password" + }, + "messages": { + "info": "Enter the email address you used to register", + "success": "Check your emails for details on how to reset your password." + } + }, + "finish": { + "title": "Reset password", + "form": { + "button": "Validate new password" + }, + "messages": { + "info": "Choose a new password", + "success": "<strong>Your password has been reset.</strong> Please ", + "keymissing": "The reset key is missing.", + "error": "Your password couldn't be reset. Remember a password request is only valid for 24 hours." + } + } + } +} diff --git a/borestop/src/main/webapp/i18n/en/sessions.json b/borestop/src/main/webapp/i18n/en/sessions.json new file mode 100644 index 0000000000000000000000000000000000000000..38bf44f70afe212b8944dd1d7bc28debb3fd2885 --- /dev/null +++ b/borestop/src/main/webapp/i18n/en/sessions.json @@ -0,0 +1,15 @@ +{ + "sessions": { + "title": "Active sessions for [<strong>{{username}}</strong>]", + "table": { + "ipaddress": "IP address", + "useragent": "User Agent", + "date": "Date", + "button": "Invalidate" + }, + "messages": { + "success": "<strong>Session invalidated!</strong>", + "error": "<strong>An error has occurred!</strong> The session could not be invalidated." + } + } +} diff --git a/borestop/src/main/webapp/i18n/en/settings.json b/borestop/src/main/webapp/i18n/en/settings.json new file mode 100644 index 0000000000000000000000000000000000000000..508c037c3bce641047f8e5bdcb7c88e71f5f7e94 --- /dev/null +++ b/borestop/src/main/webapp/i18n/en/settings.json @@ -0,0 +1,32 @@ +{ + "settings": { + "title": "User settings for [<strong>{{username}}</strong>]", + "form": { + "firstname": "First Name", + "firstname.placeholder": "Your first name", + "lastname": "Last Name", + "lastname.placeholder": "Your last name", + "language": "Language", + "button": "Save" + }, + "messages": { + "error": { + "fail": "<strong>An error has occurred!</strong> Settings could not be saved.", + "emailexists": "<strong>Email is already in use!</strong> Please choose another one." + }, + "success": "<strong>Settings saved!</strong>", + "validate": { + "firstname": { + "required": "Your first name is required.", + "minlength": "Your first name is required to be at least 1 character", + "maxlength": "Your first name cannot be longer than 50 characters" + }, + "lastname": { + "required": "Your last name is required.", + "minlength": "Your last name is required to be at least 1 character", + "maxlength": "Your last name cannot be longer than 50 characters" + } + } + } + } +} diff --git a/borestop/src/main/webapp/i18n/en/user-management.json b/borestop/src/main/webapp/i18n/en/user-management.json new file mode 100644 index 0000000000000000000000000000000000000000..4923c0911836c00adda5086deff7ba83affbb25e --- /dev/null +++ b/borestop/src/main/webapp/i18n/en/user-management.json @@ -0,0 +1,30 @@ +{ + "userManagement": { + "home": { + "title": "Users", + "createLabel": "Create a new user", + "createOrEditLabel": "Create or edit a user" + }, + "created": "A new user is created with identifier {{ param }}", + "updated": "A user is updated with identifier {{ param }}", + "deleted": "A user is deleted with identifier {{ param }}", + "delete": { + "question": "Are you sure you want to delete user {{ login }}?" + }, + "detail": { + "title": "User" + }, + "login": "Login", + "firstName": "First name", + "lastName": "Last name", + "email": "Email", + "activated": "Activated", + "deactivated": "Deactivated", + "profiles": "Profiles", + "langKey": "Language", + "createdBy": "Created by", + "createdDate": "Created date", + "lastModifiedBy": "Modified by", + "lastModifiedDate": "Modified date" + } +} diff --git a/borestop/src/main/webapp/index.html b/borestop/src/main/webapp/index.html new file mode 100644 index 0000000000000000000000000000000000000000..6f64fe50a1e00aff7f09209d05a7fb491d0275b7 --- /dev/null +++ b/borestop/src/main/webapp/index.html @@ -0,0 +1,108 @@ +<!doctype html> +<html class="no-js" lang="en" dir="ltr"> +<head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>borestop</title> + <meta name="description" content="Description for borestop"> + <meta name="google" content="notranslate"> + <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> + <meta name="theme-color" content="#000000"> + <link rel="icon" href="favicon.ico" /> + <link rel="manifest" href="manifest.webapp" /> + <link rel="stylesheet" href="content/css/loading.css"> + <!-- jhipster-needle-add-resources-to-root - JHipster will add new resources here --> +</head> +<body> + <!--[if lt IE 9]> + <p class="browserupgrade">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p> + <![endif]--> + <jhi-main> + <div class="app-loading"> + <div class="lds-css ng-scope"> + <div class="lds-pacman"> + <div><div></div><div></div><div></div></div> + <div><div></div><div></div><div></div></div> + </div> + </div> + </div> + <div class="app-loading"> + <div id="jhipster-error" style="display:none"> + <!-- This content is for troubleshooting purpose and will be removed when app renders --> + <h1>An error has occurred :-(</h1> + <h2>Usual error causes</h2> + <ol> + <li>You started the application from an IDE and you didn't run <code style="color:red">npm start</code> or <code style="color:red">npm run webpack:build</code>.</li> + <li>You had a network error while running <code style="color:red">npm install</code>. If you are behind a corporate proxy, it is likely that this error was caused by your proxy. Have a look at the JHipster error logs, you will probably have the cause of the error.</li> + <li>You installed a Node.js version that doesn't work with JHipster: please use an LTS (long-term support) version, as it's the only version we support.</li> + </ol> + <h2>Building the client side code again</h2> + <p>If you want to go fast, run <code style="color:red">./mvnw</code> to build and run everything.</p> + <p>If you want to have more control, so you can debug your issue more easily, you should follow the following steps:</p> + <ol> + <li>Install npm dependencies with the command <code style="color:red">npm install</code></li> + <li>Build the client with the command <code style="color:red">npm run webpack:build</code> or <code style="color:red">npm start</code></li> + <li>Start the server with <code style="color:red">./mvnw</code> or using your IDE</li> + </ol> + + <h2>Getting more help</h2> + + <h3>If you have a question on how to use JHipster</h3> + <p> + Go to Stack Overflow with the <a href="http://stackoverflow.com/tags/jhipster" target="_blank" rel="noopener noreferrer">"jhipster"</a> tag. + </p> + + <h3>If you have a bug or a feature request</h3> + <p> + First read our <a href="https://github.com/jhipster/generator-jhipster/blob/master/CONTRIBUTING.md" target="_blank" rel="noopener noreferrer">contributing guidelines</a>. + </p> + <p> + Then, fill a ticket on our <a href="https://github.com/jhipster/generator-jhipster/issues/new/choose" target="_blank" rel="noopener noreferrer">bug tracker</a>, we'll be happy to resolve your issue! + </p> + + <h3>If you want to chat with contributors and other users</h3> + <p> + Join our chat room on <a href="https://gitter.im/jhipster/generator-jhipster" target="_blank" rel="noopener noreferrer">Gitter.im</a>. Please note that this is a public chat room, and that we expect you to respect other people and write in a correct English language! + </p> + <!-- end of troubleshooting content --> + </div> + </div> + </jhi-main> + <noscript> + <h1>You must enable javascript to view this page.</h1> + </noscript> + <script type="text/javascript" language="javascript"> + // show an error message if the app loading takes more than 5 sec + window.onload=function() { + setTimeout(showError, 4000); + } + function showError() { + var errorElm = document.getElementById("jhipster-error"); + if (errorElm && errorElm.style) { + errorElm.style.display = "block"; + } + } + </script> + <!-- uncomment this for adding service worker + <script> + if ('serviceWorker' in navigator) { + window.addEventListener('load', function() { + navigator.serviceWorker.register('/service-worker.js') + .then(function () { + console.log('Service Worker Registered'); + }); + }); + } + </script> + --> + <!-- Google Analytics: uncomment and change UA-XXXXX-X to be your site's ID. + <script> + (function(b,o,i,l,e,r){b.GoogleAnalyticsObject=l;b[l]||(b[l]= + function(){(b[l].q=b[l].q||[]).push(arguments)});b[l].l=+new Date; + e=o.createElement(i);r=o.getElementsByTagName(i)[0]; + e.src='//www.google-analytics.com/analytics.js'; + r.parentNode.insertBefore(e,r)}(window,document,'script','ga')); + ga('create','UA-XXXXX-X');ga('send','pageview'); + </script>--> +</body> +</html> diff --git a/borestop/src/main/webapp/manifest.webapp b/borestop/src/main/webapp/manifest.webapp new file mode 100644 index 0000000000000000000000000000000000000000..b74d738cf60de4994c1e6050b923371a3911fc08 --- /dev/null +++ b/borestop/src/main/webapp/manifest.webapp @@ -0,0 +1,31 @@ +{ + "name": "Borestop", + "short_name": "Borestop", + "icons": [ + { + "src": "./content/images/jhipster_family_member_2_head-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "./content/images/jhipster_family_member_2_head-256.png", + "sizes": "256x256", + "type": "image/png" + }, + { + "src": "./content/images/jhipster_family_member_2_head-384.png", + "sizes": "384x384", + "type": "image/png" + }, + { + "src": "./content/images/jhipster_family_member_2_head-512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#000000", + "background_color": "#e0e0e0", + "start_url": ".", + "display": "standalone", + "orientation": "portrait" +} diff --git a/borestop/src/main/webapp/robots.txt b/borestop/src/main/webapp/robots.txt new file mode 100644 index 0000000000000000000000000000000000000000..7cda27477dd9534369494774fae9cecac511c77a --- /dev/null +++ b/borestop/src/main/webapp/robots.txt @@ -0,0 +1,11 @@ +# robotstxt.org/ + +User-agent: * +Disallow: /api/account +Disallow: /api/account/change-password +Disallow: /api/account/sessions +Disallow: /api/audits/ +Disallow: /api/logs/ +Disallow: /api/users/ +Disallow: /management/ +Disallow: /v2/api-docs/ diff --git a/borestop/src/main/webapp/swagger-ui/dist/images/throbber.gif b/borestop/src/main/webapp/swagger-ui/dist/images/throbber.gif new file mode 100644 index 0000000000000000000000000000000000000000..06393889242fb3ea9e0205fa84369ec7bb66d15a Binary files /dev/null and b/borestop/src/main/webapp/swagger-ui/dist/images/throbber.gif differ diff --git a/borestop/src/main/webapp/swagger-ui/index.html b/borestop/src/main/webapp/swagger-ui/index.html new file mode 100644 index 0000000000000000000000000000000000000000..bdabf17ba19eca928e6a34b8e8b379fe9382b5fe --- /dev/null +++ b/borestop/src/main/webapp/swagger-ui/index.html @@ -0,0 +1,65 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>borestop - Swagger UI</title> + <link rel="stylesheet" type="text/css" href="./swagger-ui.css"> + <link rel="icon" type="image/png" href="./favicon-32x32.png" sizes="32x32"/> + <link rel="icon" type="image/png" href="./favicon-16x16.png" sizes="16x16"/> +</head> + +<body> +<div id="swagger-ui"></div> + +<script src="./swagger-ui-bundle.js"></script> +<script src="./swagger-ui-standalone-preset.js"></script> +<script src="./axios.min.js"></script> + + +<script type="text/javascript"> + window.onload = function () { + + + var urls = []; + axios.get("/swagger-resources").then(function (response) { + response.data.forEach(function (resource) { + urls.push({"name": resource.name, "url": resource.location}); + }); + + urls.sort(function (a, b) { + var x = a.name.toLowerCase(), y = b.name.toLowerCase(); + return x < y ? -1 : x > y ? 1 : 0; + }); + + // Build a system + var ui = SwaggerUIBundle({ + urls: urls, + dom_id: '#swagger-ui', + deepLinking: true, + filter: true, + layout: "StandaloneLayout", + withCredentials: true, + presets: [ + SwaggerUIBundle.presets.apis, + SwaggerUIStandalonePreset + ], + plugins: [ + SwaggerUIBundle.plugins.DownloadUrl + ], + requestInterceptor: function (req) { + var authToken = JSON.parse(localStorage.getItem("jhi-authenticationtoken") + || sessionStorage.getItem("jhi-authenticationtoken")); + if (authToken) { + req.headers['Authorization'] = "Bearer " + authToken; + } + return req; + } + }); + + window.ui = ui + }); + + }; +</script> +</body> +</html> diff --git a/borestop/src/test/java/com/ippon/borestop/ArchTest.java b/borestop/src/test/java/com/ippon/borestop/ArchTest.java new file mode 100644 index 0000000000000000000000000000000000000000..7a9744e82f50ee8fcf80381a3c97027c943d112f --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/ArchTest.java @@ -0,0 +1,29 @@ +package com.ippon.borestop; + +import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses; + +import com.tngtech.archunit.core.domain.JavaClasses; +import com.tngtech.archunit.core.importer.ClassFileImporter; +import com.tngtech.archunit.core.importer.ImportOption; +import org.junit.jupiter.api.Test; + +class ArchTest { + + @Test + void servicesAndRepositoriesShouldNotDependOnWebLayer() { + JavaClasses importedClasses = new ClassFileImporter() + .withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_TESTS) + .importPackages("com.ippon.borestop"); + + noClasses() + .that() + .resideInAnyPackage("com.ippon.borestop.service..") + .or() + .resideInAnyPackage("com.ippon.borestop.repository..") + .should() + .dependOnClassesThat() + .resideInAnyPackage("..com.ippon.borestop.web..") + .because("Services and repositories should not depend on web layer") + .check(importedClasses); + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/config/NoOpMailConfiguration.java b/borestop/src/test/java/com/ippon/borestop/config/NoOpMailConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..bfec6ca7a98d00f69bdf4e971279132de0642412 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/config/NoOpMailConfiguration.java @@ -0,0 +1,24 @@ +package com.ippon.borestop.config; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.mock; + +import com.ippon.borestop.service.MailService; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class NoOpMailConfiguration { + private final MailService mockMailService; + + public NoOpMailConfiguration() { + mockMailService = mock(MailService.class); + doNothing().when(mockMailService).sendActivationEmail(any()); + } + + @Bean + public MailService mailService() { + return mockMailService; + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/config/StaticResourcesWebConfigurerTest.java b/borestop/src/test/java/com/ippon/borestop/config/StaticResourcesWebConfigurerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..959eb67137ba14f38a8dc7b69478dbcee338b5d7 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/config/StaticResourcesWebConfigurerTest.java @@ -0,0 +1,75 @@ +package com.ippon.borestop.config; + +import static com.ippon.borestop.config.StaticResourcesWebConfiguration.*; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.*; + +import io.github.jhipster.config.JHipsterDefaults; +import io.github.jhipster.config.JHipsterProperties; +import java.util.concurrent.TimeUnit; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.http.CacheControl; +import org.springframework.mock.web.MockServletContext; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistration; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; + +public class StaticResourcesWebConfigurerTest { + public static final int MAX_AGE_TEST = 5; + public StaticResourcesWebConfiguration staticResourcesWebConfiguration; + private ResourceHandlerRegistry resourceHandlerRegistry; + private MockServletContext servletContext; + private WebApplicationContext applicationContext; + private JHipsterProperties props; + + @BeforeEach + void setUp() { + servletContext = spy(new MockServletContext()); + applicationContext = mock(WebApplicationContext.class); + resourceHandlerRegistry = spy(new ResourceHandlerRegistry(applicationContext, servletContext)); + props = new JHipsterProperties(); + staticResourcesWebConfiguration = spy(new StaticResourcesWebConfiguration(props)); + } + + @Test + public void shouldAppendResourceHandlerAndInitiliazeIt() { + staticResourcesWebConfiguration.addResourceHandlers(resourceHandlerRegistry); + + verify(resourceHandlerRegistry, times(1)).addResourceHandler(RESOURCE_PATHS); + verify(staticResourcesWebConfiguration, times(1)).initializeResourceHandler(any(ResourceHandlerRegistration.class)); + for (String testingPath : RESOURCE_PATHS) { + assertThat(resourceHandlerRegistry.hasMappingForPattern(testingPath)).isTrue(); + } + } + + @Test + public void shouldInitializeResourceHandlerWithCacheControlAndLocations() { + CacheControl ccExpected = CacheControl.maxAge(5, TimeUnit.DAYS).cachePublic(); + when(staticResourcesWebConfiguration.getCacheControl()).thenReturn(ccExpected); + ResourceHandlerRegistration resourceHandlerRegistration = spy(new ResourceHandlerRegistration(RESOURCE_PATHS)); + + staticResourcesWebConfiguration.initializeResourceHandler(resourceHandlerRegistration); + + verify(staticResourcesWebConfiguration, times(1)).getCacheControl(); + verify(resourceHandlerRegistration, times(1)).setCacheControl(ccExpected); + verify(resourceHandlerRegistration, times(1)).addResourceLocations(RESOURCE_LOCATIONS); + } + + @Test + public void shoudCreateCacheControlBasedOnJhipsterDefaultProperties() { + CacheControl cacheExpected = CacheControl.maxAge(JHipsterDefaults.Http.Cache.timeToLiveInDays, TimeUnit.DAYS).cachePublic(); + assertThat(staticResourcesWebConfiguration.getCacheControl()) + .extracting(CacheControl::getHeaderValue) + .isEqualTo(cacheExpected.getHeaderValue()); + } + + @Test + public void shoudCreateCacheControlWithSpecificConfigurationInProperties() { + props.getHttp().getCache().setTimeToLiveInDays(MAX_AGE_TEST); + CacheControl cacheExpected = CacheControl.maxAge(MAX_AGE_TEST, TimeUnit.DAYS).cachePublic(); + assertThat(staticResourcesWebConfiguration.getCacheControl()) + .extracting(CacheControl::getHeaderValue) + .isEqualTo(cacheExpected.getHeaderValue()); + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/config/WebConfigurerTest.java b/borestop/src/test/java/com/ippon/borestop/config/WebConfigurerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..dad507c5cff99e0740c8833306b2f5440480ff56 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/config/WebConfigurerTest.java @@ -0,0 +1,147 @@ +package com.ippon.borestop.config; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.options; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import io.github.jhipster.config.JHipsterConstants; +import io.github.jhipster.config.JHipsterProperties; +import io.github.jhipster.web.filter.CachingHttpHeadersFilter; +import java.io.File; +import java.util.*; +import javax.servlet.*; +import org.h2.server.web.WebServlet; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory; +import org.springframework.http.HttpHeaders; +import org.springframework.mock.env.MockEnvironment; +import org.springframework.mock.web.MockServletContext; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; + +/** + * Unit tests for the {@link WebConfigurer} class. + */ +public class WebConfigurerTest { + private WebConfigurer webConfigurer; + + private MockServletContext servletContext; + + private MockEnvironment env; + + private JHipsterProperties props; + + @BeforeEach + public void setup() { + servletContext = spy(new MockServletContext()); + doReturn(mock(FilterRegistration.Dynamic.class)).when(servletContext).addFilter(anyString(), any(Filter.class)); + doReturn(mock(ServletRegistration.Dynamic.class)).when(servletContext).addServlet(anyString(), any(Servlet.class)); + + env = new MockEnvironment(); + props = new JHipsterProperties(); + + webConfigurer = new WebConfigurer(env, props); + } + + @Test + public void testStartUpProdServletContext() throws ServletException { + env.setActiveProfiles(JHipsterConstants.SPRING_PROFILE_PRODUCTION); + webConfigurer.onStartup(servletContext); + + verify(servletContext, never()).addServlet(eq("H2Console"), any(WebServlet.class)); + } + + @Test + public void testStartUpDevServletContext() throws ServletException { + env.setActiveProfiles(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT); + webConfigurer.onStartup(servletContext); + + verify(servletContext).addServlet(eq("H2Console"), any(WebServlet.class)); + } + + @Test + public void testCustomizeServletContainer() { + env.setActiveProfiles(JHipsterConstants.SPRING_PROFILE_PRODUCTION); + UndertowServletWebServerFactory container = new UndertowServletWebServerFactory(); + webConfigurer.customize(container); + assertThat(container.getMimeMappings().get("abs")).isEqualTo("audio/x-mpeg"); + assertThat(container.getMimeMappings().get("html")).isEqualTo("text/html;charset=utf-8"); + assertThat(container.getMimeMappings().get("json")).isEqualTo("text/html;charset=utf-8"); + if (container.getDocumentRoot() != null) { + assertThat(container.getDocumentRoot()).isEqualTo(new File("target/classes/static/")); + } + } + + @Test + public void testCorsFilterOnApiPath() throws Exception { + props.getCors().setAllowedOrigins(Collections.singletonList("*")); + props.getCors().setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE")); + props.getCors().setAllowedHeaders(Collections.singletonList("*")); + props.getCors().setMaxAge(1800L); + props.getCors().setAllowCredentials(true); + + MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new WebConfigurerTestController()).addFilters(webConfigurer.corsFilter()).build(); + + mockMvc + .perform( + options("/api/test-cors").header(HttpHeaders.ORIGIN, "other.domain.com").header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "POST") + ) + .andExpect(status().isOk()) + .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "other.domain.com")) + .andExpect(header().string(HttpHeaders.VARY, "Origin")) + .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "GET,POST,PUT,DELETE")) + .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true")) + .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_MAX_AGE, "1800")); + + mockMvc + .perform(get("/api/test-cors").header(HttpHeaders.ORIGIN, "other.domain.com")) + .andExpect(status().isOk()) + .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "other.domain.com")); + } + + @Test + public void testCorsFilterOnOtherPath() throws Exception { + props.getCors().setAllowedOrigins(Collections.singletonList("*")); + props.getCors().setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE")); + props.getCors().setAllowedHeaders(Collections.singletonList("*")); + props.getCors().setMaxAge(1800L); + props.getCors().setAllowCredentials(true); + + MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new WebConfigurerTestController()).addFilters(webConfigurer.corsFilter()).build(); + + mockMvc + .perform(get("/test/test-cors").header(HttpHeaders.ORIGIN, "other.domain.com")) + .andExpect(status().isOk()) + .andExpect(header().doesNotExist(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN)); + } + + @Test + public void testCorsFilterDeactivated() throws Exception { + props.getCors().setAllowedOrigins(null); + + MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new WebConfigurerTestController()).addFilters(webConfigurer.corsFilter()).build(); + + mockMvc + .perform(get("/api/test-cors").header(HttpHeaders.ORIGIN, "other.domain.com")) + .andExpect(status().isOk()) + .andExpect(header().doesNotExist(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN)); + } + + @Test + public void testCorsFilterDeactivated2() throws Exception { + props.getCors().setAllowedOrigins(new ArrayList<>()); + + MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new WebConfigurerTestController()).addFilters(webConfigurer.corsFilter()).build(); + + mockMvc + .perform(get("/api/test-cors").header(HttpHeaders.ORIGIN, "other.domain.com")) + .andExpect(status().isOk()) + .andExpect(header().doesNotExist(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN)); + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/config/WebConfigurerTestController.java b/borestop/src/test/java/com/ippon/borestop/config/WebConfigurerTestController.java new file mode 100644 index 0000000000000000000000000000000000000000..6a9fdff2a73195b6571b5668d35d68506fef3319 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/config/WebConfigurerTestController.java @@ -0,0 +1,14 @@ +package com.ippon.borestop.config; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class WebConfigurerTestController { + + @GetMapping("/api/test-cors") + public void testCorsOnApiPath() {} + + @GetMapping("/test/test-cors") + public void testCorsOnOtherPath() {} +} diff --git a/borestop/src/test/java/com/ippon/borestop/config/timezone/HibernateTimeZoneIT.java b/borestop/src/test/java/com/ippon/borestop/config/timezone/HibernateTimeZoneIT.java new file mode 100644 index 0000000000000000000000000000000000000000..c1a9932729e1b7bcf350e5df6d88197cd965a27e --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/config/timezone/HibernateTimeZoneIT.java @@ -0,0 +1,162 @@ +package com.ippon.borestop.config.timezone; + +import static java.lang.String.format; +import static org.assertj.core.api.Assertions.assertThat; + +import com.ippon.borestop.BorestopApp; +import com.ippon.borestop.repository.timezone.DateTimeWrapper; +import com.ippon.borestop.repository.timezone.DateTimeWrapperRepository; +import java.time.*; +import java.time.format.DateTimeFormatter; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.support.rowset.SqlRowSet; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for the ZoneId Hibernate configuration. + */ +@SpringBootTest(classes = BorestopApp.class) +public class HibernateTimeZoneIT { + @Autowired + private DateTimeWrapperRepository dateTimeWrapperRepository; + + @Autowired + private JdbcTemplate jdbcTemplate; + + @Value("${spring.jpa.properties.hibernate.jdbc.time_zone:UTC}") + private String zoneId; + + private DateTimeWrapper dateTimeWrapper; + private DateTimeFormatter dateTimeFormatter; + private DateTimeFormatter timeFormatter; + private DateTimeFormatter dateFormatter; + + @BeforeEach + public void setup() { + dateTimeWrapper = new DateTimeWrapper(); + dateTimeWrapper.setInstant(Instant.parse("2014-11-12T05:50:00.0Z")); + dateTimeWrapper.setLocalDateTime(LocalDateTime.parse("2014-11-12T07:50:00.0")); + dateTimeWrapper.setOffsetDateTime(OffsetDateTime.parse("2011-12-14T08:30:00.0Z")); + dateTimeWrapper.setZonedDateTime(ZonedDateTime.parse("2011-12-14T08:30:00.0Z")); + dateTimeWrapper.setLocalTime(LocalTime.parse("14:30:00")); + dateTimeWrapper.setOffsetTime(OffsetTime.parse("14:30:00+02:00")); + dateTimeWrapper.setLocalDate(LocalDate.parse("2016-09-10")); + + dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S").withZone(ZoneId.of(zoneId)); + + timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss").withZone(ZoneId.of(zoneId)); + + dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + } + + @Test + @Transactional + public void storeInstantWithZoneIdConfigShouldBeStoredOnGMTTimeZone() { + dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); + + String request = generateSqlRequest("instant", dateTimeWrapper.getId()); + SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); + String expectedValue = dateTimeFormatter.format(dateTimeWrapper.getInstant()); + + assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); + } + + @Test + @Transactional + public void storeLocalDateTimeWithZoneIdConfigShouldBeStoredOnGMTTimeZone() { + dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); + + String request = generateSqlRequest("local_date_time", dateTimeWrapper.getId()); + SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); + String expectedValue = dateTimeWrapper.getLocalDateTime().atZone(ZoneId.systemDefault()).format(dateTimeFormatter); + + assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); + } + + @Test + @Transactional + public void storeOffsetDateTimeWithZoneIdConfigShouldBeStoredOnGMTTimeZone() { + dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); + + String request = generateSqlRequest("offset_date_time", dateTimeWrapper.getId()); + SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); + String expectedValue = dateTimeWrapper.getOffsetDateTime().format(dateTimeFormatter); + + assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); + } + + @Test + @Transactional + public void storeZoneDateTimeWithZoneIdConfigShouldBeStoredOnGMTTimeZone() { + dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); + + String request = generateSqlRequest("zoned_date_time", dateTimeWrapper.getId()); + SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); + String expectedValue = dateTimeWrapper.getZonedDateTime().format(dateTimeFormatter); + + assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); + } + + @Test + @Transactional + public void storeLocalTimeWithZoneIdConfigShouldBeStoredOnGMTTimeZoneAccordingToHis1stJan1970Value() { + dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); + + String request = generateSqlRequest("local_time", dateTimeWrapper.getId()); + SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); + String expectedValue = dateTimeWrapper + .getLocalTime() + .atDate(LocalDate.of(1970, Month.JANUARY, 1)) + .atZone(ZoneId.systemDefault()) + .format(timeFormatter); + + assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); + } + + @Test + @Transactional + public void storeOffsetTimeWithZoneIdConfigShouldBeStoredOnGMTTimeZoneAccordingToHis1stJan1970Value() { + dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); + + String request = generateSqlRequest("offset_time", dateTimeWrapper.getId()); + SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); + String expectedValue = dateTimeWrapper + .getOffsetTime() + .toLocalTime() + .atDate(LocalDate.of(1970, Month.JANUARY, 1)) + .atZone(ZoneId.systemDefault()) + .format(timeFormatter); + + assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); + } + + @Test + @Transactional + public void storeLocalDateWithZoneIdConfigShouldBeStoredWithoutTransformation() { + dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); + + String request = generateSqlRequest("local_date", dateTimeWrapper.getId()); + SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); + String expectedValue = dateTimeWrapper.getLocalDate().format(dateFormatter); + + assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); + } + + private String generateSqlRequest(String fieldName, long id) { + return format("SELECT %s FROM jhi_date_time_wrapper where id=%d", fieldName, id); + } + + private void assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(SqlRowSet sqlRowSet, String expectedValue) { + while (sqlRowSet.next()) { + String dbValue = sqlRowSet.getString(1); + + assertThat(dbValue).isNotNull(); + assertThat(dbValue).isEqualTo(expectedValue); + } + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/repository/CustomAuditEventRepositoryIT.java b/borestop/src/test/java/com/ippon/borestop/repository/CustomAuditEventRepositoryIT.java new file mode 100644 index 0000000000000000000000000000000000000000..22d84fe994995b3c9e2a6d2ab0bdbdfbe3922015 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/repository/CustomAuditEventRepositoryIT.java @@ -0,0 +1,154 @@ +package com.ippon.borestop.repository; + +import static com.ippon.borestop.repository.CustomAuditEventRepository.EVENT_DATA_COLUMN_MAX_LENGTH; +import static org.assertj.core.api.Assertions.assertThat; + +import com.ippon.borestop.BorestopApp; +import com.ippon.borestop.config.Constants; +import com.ippon.borestop.config.audit.AuditEventConverter; +import com.ippon.borestop.domain.PersistentAuditEvent; +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.servlet.http.HttpSession; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.actuate.audit.AuditEvent; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpSession; +import org.springframework.security.web.authentication.WebAuthenticationDetails; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for {@link CustomAuditEventRepository}. + */ +@SpringBootTest(classes = BorestopApp.class) +@Transactional +public class CustomAuditEventRepositoryIT { + @Autowired + private PersistenceAuditEventRepository persistenceAuditEventRepository; + + @Autowired + private AuditEventConverter auditEventConverter; + + private CustomAuditEventRepository customAuditEventRepository; + + @BeforeEach + public void setup() { + customAuditEventRepository = new CustomAuditEventRepository(persistenceAuditEventRepository, auditEventConverter); + persistenceAuditEventRepository.deleteAll(); + Instant oneHourAgo = Instant.now().minusSeconds(3600); + + PersistentAuditEvent testUserEvent = new PersistentAuditEvent(); + testUserEvent.setPrincipal("test-user"); + testUserEvent.setAuditEventType("test-type"); + testUserEvent.setAuditEventDate(oneHourAgo); + Map<String, String> data = new HashMap<>(); + data.put("test-key", "test-value"); + testUserEvent.setData(data); + + PersistentAuditEvent testOldUserEvent = new PersistentAuditEvent(); + testOldUserEvent.setPrincipal("test-user"); + testOldUserEvent.setAuditEventType("test-type"); + testOldUserEvent.setAuditEventDate(oneHourAgo.minusSeconds(10000)); + + PersistentAuditEvent testOtherUserEvent = new PersistentAuditEvent(); + testOtherUserEvent.setPrincipal("other-test-user"); + testOtherUserEvent.setAuditEventType("test-type"); + testOtherUserEvent.setAuditEventDate(oneHourAgo); + } + + @Test + public void addAuditEvent() { + Map<String, Object> data = new HashMap<>(); + data.put("test-key", "test-value"); + AuditEvent event = new AuditEvent("test-user", "test-type", data); + customAuditEventRepository.add(event); + List<PersistentAuditEvent> persistentAuditEvents = persistenceAuditEventRepository.findAll(); + assertThat(persistentAuditEvents).hasSize(1); + PersistentAuditEvent persistentAuditEvent = persistentAuditEvents.get(0); + assertThat(persistentAuditEvent.getPrincipal()).isEqualTo(event.getPrincipal()); + assertThat(persistentAuditEvent.getAuditEventType()).isEqualTo(event.getType()); + assertThat(persistentAuditEvent.getData()).containsKey("test-key"); + assertThat(persistentAuditEvent.getData().get("test-key")).isEqualTo("test-value"); + assertThat(persistentAuditEvent.getAuditEventDate().truncatedTo(ChronoUnit.MILLIS)) + .isEqualTo(event.getTimestamp().truncatedTo(ChronoUnit.MILLIS)); + } + + @Test + public void addAuditEventTruncateLargeData() { + Map<String, Object> data = new HashMap<>(); + StringBuilder largeData = new StringBuilder(); + for (int i = 0; i < EVENT_DATA_COLUMN_MAX_LENGTH + 10; i++) { + largeData.append("a"); + } + data.put("test-key", largeData); + AuditEvent event = new AuditEvent("test-user", "test-type", data); + customAuditEventRepository.add(event); + List<PersistentAuditEvent> persistentAuditEvents = persistenceAuditEventRepository.findAll(); + assertThat(persistentAuditEvents).hasSize(1); + PersistentAuditEvent persistentAuditEvent = persistentAuditEvents.get(0); + assertThat(persistentAuditEvent.getPrincipal()).isEqualTo(event.getPrincipal()); + assertThat(persistentAuditEvent.getAuditEventType()).isEqualTo(event.getType()); + assertThat(persistentAuditEvent.getData()).containsKey("test-key"); + String actualData = persistentAuditEvent.getData().get("test-key"); + assertThat(actualData.length()).isEqualTo(EVENT_DATA_COLUMN_MAX_LENGTH); + assertThat(actualData).isSubstringOf(largeData); + assertThat(persistentAuditEvent.getAuditEventDate().truncatedTo(ChronoUnit.MILLIS)) + .isEqualTo(event.getTimestamp().truncatedTo(ChronoUnit.MILLIS)); + } + + @Test + public void testAddEventWithWebAuthenticationDetails() { + HttpSession session = new MockHttpSession(null, "test-session-id"); + MockHttpServletRequest request = new MockHttpServletRequest(); + request.setSession(session); + request.setRemoteAddr("1.2.3.4"); + WebAuthenticationDetails details = new WebAuthenticationDetails(request); + Map<String, Object> data = new HashMap<>(); + data.put("test-key", details); + AuditEvent event = new AuditEvent("test-user", "test-type", data); + customAuditEventRepository.add(event); + List<PersistentAuditEvent> persistentAuditEvents = persistenceAuditEventRepository.findAll(); + assertThat(persistentAuditEvents).hasSize(1); + PersistentAuditEvent persistentAuditEvent = persistentAuditEvents.get(0); + assertThat(persistentAuditEvent.getData().get("remoteAddress")).isEqualTo("1.2.3.4"); + assertThat(persistentAuditEvent.getData().get("sessionId")).isEqualTo("test-session-id"); + } + + @Test + public void testAddEventWithNullData() { + Map<String, Object> data = new HashMap<>(); + data.put("test-key", null); + AuditEvent event = new AuditEvent("test-user", "test-type", data); + customAuditEventRepository.add(event); + List<PersistentAuditEvent> persistentAuditEvents = persistenceAuditEventRepository.findAll(); + assertThat(persistentAuditEvents).hasSize(1); + PersistentAuditEvent persistentAuditEvent = persistentAuditEvents.get(0); + assertThat(persistentAuditEvent.getData().get("test-key")).isEqualTo("null"); + } + + @Test + public void addAuditEventWithAnonymousUser() { + Map<String, Object> data = new HashMap<>(); + data.put("test-key", "test-value"); + AuditEvent event = new AuditEvent(Constants.ANONYMOUS_USER, "test-type", data); + customAuditEventRepository.add(event); + List<PersistentAuditEvent> persistentAuditEvents = persistenceAuditEventRepository.findAll(); + assertThat(persistentAuditEvents).hasSize(0); + } + + @Test + public void addAuditEventWithAuthorizationFailureType() { + Map<String, Object> data = new HashMap<>(); + data.put("test-key", "test-value"); + AuditEvent event = new AuditEvent("test-user", "AUTHORIZATION_FAILURE", data); + customAuditEventRepository.add(event); + List<PersistentAuditEvent> persistentAuditEvents = persistenceAuditEventRepository.findAll(); + assertThat(persistentAuditEvents).hasSize(0); + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/repository/timezone/DateTimeWrapper.java b/borestop/src/test/java/com/ippon/borestop/repository/timezone/DateTimeWrapper.java new file mode 100644 index 0000000000000000000000000000000000000000..625d95d307ef08d8597cd329e58c5956f86e1371 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/repository/timezone/DateTimeWrapper.java @@ -0,0 +1,132 @@ +package com.ippon.borestop.repository.timezone; + +import java.io.Serializable; +import java.time.*; +import java.util.Objects; +import javax.persistence.*; + +@Entity +@Table(name = "jhi_date_time_wrapper") +public class DateTimeWrapper implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") + @SequenceGenerator(name = "sequenceGenerator") + private Long id; + + @Column(name = "instant") + private Instant instant; + + @Column(name = "local_date_time") + private LocalDateTime localDateTime; + + @Column(name = "offset_date_time") + private OffsetDateTime offsetDateTime; + + @Column(name = "zoned_date_time") + private ZonedDateTime zonedDateTime; + + @Column(name = "local_time") + private LocalTime localTime; + + @Column(name = "offset_time") + private OffsetTime offsetTime; + + @Column(name = "local_date") + private LocalDate localDate; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Instant getInstant() { + return instant; + } + + public void setInstant(Instant instant) { + this.instant = instant; + } + + public LocalDateTime getLocalDateTime() { + return localDateTime; + } + + public void setLocalDateTime(LocalDateTime localDateTime) { + this.localDateTime = localDateTime; + } + + public OffsetDateTime getOffsetDateTime() { + return offsetDateTime; + } + + public void setOffsetDateTime(OffsetDateTime offsetDateTime) { + this.offsetDateTime = offsetDateTime; + } + + public ZonedDateTime getZonedDateTime() { + return zonedDateTime; + } + + public void setZonedDateTime(ZonedDateTime zonedDateTime) { + this.zonedDateTime = zonedDateTime; + } + + public LocalTime getLocalTime() { + return localTime; + } + + public void setLocalTime(LocalTime localTime) { + this.localTime = localTime; + } + + public OffsetTime getOffsetTime() { + return offsetTime; + } + + public void setOffsetTime(OffsetTime offsetTime) { + this.offsetTime = offsetTime; + } + + public LocalDate getLocalDate() { + return localDate; + } + + public void setLocalDate(LocalDate localDate) { + this.localDate = localDate; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + DateTimeWrapper dateTimeWrapper = (DateTimeWrapper) o; + return !(dateTimeWrapper.getId() == null || getId() == null) && Objects.equals(getId(), dateTimeWrapper.getId()); + } + + @Override + public int hashCode() { + return Objects.hashCode(getId()); + } + + // prettier-ignore + @Override + public String toString() { + return "TimeZoneTest{" + + "id=" + id + + ", instant=" + instant + + ", localDateTime=" + localDateTime + + ", offsetDateTime=" + offsetDateTime + + ", zonedDateTime=" + zonedDateTime + + '}'; + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/repository/timezone/DateTimeWrapperRepository.java b/borestop/src/test/java/com/ippon/borestop/repository/timezone/DateTimeWrapperRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..65e5603fdabd34529c2bc58f2003f31c28969850 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/repository/timezone/DateTimeWrapperRepository.java @@ -0,0 +1,10 @@ +package com.ippon.borestop.repository.timezone; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +/** + * Spring Data JPA repository for the {@link DateTimeWrapper} entity. + */ +@Repository +public interface DateTimeWrapperRepository extends JpaRepository<DateTimeWrapper, Long> {} diff --git a/borestop/src/test/java/com/ippon/borestop/security/DomainUserDetailsServiceIT.java b/borestop/src/test/java/com/ippon/borestop/security/DomainUserDetailsServiceIT.java new file mode 100644 index 0000000000000000000000000000000000000000..c922548b35063f9d038b68acd933eb967889511b --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/security/DomainUserDetailsServiceIT.java @@ -0,0 +1,111 @@ +package com.ippon.borestop.security; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +import com.ippon.borestop.BorestopApp; +import com.ippon.borestop.domain.User; +import com.ippon.borestop.repository.UserRepository; +import java.util.Locale; +import org.apache.commons.lang3.RandomStringUtils; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integrations tests for {@link DomainUserDetailsService}. + */ +@SpringBootTest(classes = BorestopApp.class) +@Transactional +public class DomainUserDetailsServiceIT { + private static final String USER_ONE_LOGIN = "test-user-one"; + private static final String USER_ONE_EMAIL = "test-user-one@localhost"; + private static final String USER_TWO_LOGIN = "test-user-two"; + private static final String USER_TWO_EMAIL = "test-user-two@localhost"; + private static final String USER_THREE_LOGIN = "test-user-three"; + private static final String USER_THREE_EMAIL = "test-user-three@localhost"; + + @Autowired + private UserRepository userRepository; + + @Autowired + private UserDetailsService domainUserDetailsService; + + @BeforeEach + public void init() { + User userOne = new User(); + userOne.setLogin(USER_ONE_LOGIN); + userOne.setPassword(RandomStringUtils.random(60)); + userOne.setActivated(true); + userOne.setEmail(USER_ONE_EMAIL); + userOne.setFirstName("userOne"); + userOne.setLastName("doe"); + userOne.setLangKey("en"); + userRepository.save(userOne); + + User userTwo = new User(); + userTwo.setLogin(USER_TWO_LOGIN); + userTwo.setPassword(RandomStringUtils.random(60)); + userTwo.setActivated(true); + userTwo.setEmail(USER_TWO_EMAIL); + userTwo.setFirstName("userTwo"); + userTwo.setLastName("doe"); + userTwo.setLangKey("en"); + userRepository.save(userTwo); + + User userThree = new User(); + userThree.setLogin(USER_THREE_LOGIN); + userThree.setPassword(RandomStringUtils.random(60)); + userThree.setActivated(false); + userThree.setEmail(USER_THREE_EMAIL); + userThree.setFirstName("userThree"); + userThree.setLastName("doe"); + userThree.setLangKey("en"); + userRepository.save(userThree); + } + + @Test + public void assertThatUserCanBeFoundByLogin() { + UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_ONE_LOGIN); + assertThat(userDetails).isNotNull(); + assertThat(userDetails.getUsername()).isEqualTo(USER_ONE_LOGIN); + } + + @Test + public void assertThatUserCanBeFoundByLoginIgnoreCase() { + UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_ONE_LOGIN.toUpperCase(Locale.ENGLISH)); + assertThat(userDetails).isNotNull(); + assertThat(userDetails.getUsername()).isEqualTo(USER_ONE_LOGIN); + } + + @Test + public void assertThatUserCanBeFoundByEmail() { + UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_TWO_EMAIL); + assertThat(userDetails).isNotNull(); + assertThat(userDetails.getUsername()).isEqualTo(USER_TWO_LOGIN); + } + + @Test + public void assertThatUserCanBeFoundByEmailIgnoreCase() { + UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_TWO_EMAIL.toUpperCase(Locale.ENGLISH)); + assertThat(userDetails).isNotNull(); + assertThat(userDetails.getUsername()).isEqualTo(USER_TWO_LOGIN); + } + + @Test + public void assertThatEmailIsPrioritizedOverLogin() { + UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_ONE_EMAIL); + assertThat(userDetails).isNotNull(); + assertThat(userDetails.getUsername()).isEqualTo(USER_ONE_LOGIN); + } + + @Test + public void assertThatUserNotActivatedExceptionIsThrownForNotActivatedUsers() { + assertThatExceptionOfType(UserNotActivatedException.class) + .isThrownBy(() -> domainUserDetailsService.loadUserByUsername(USER_THREE_LOGIN)); + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/security/SecurityUtilsUnitTest.java b/borestop/src/test/java/com/ippon/borestop/security/SecurityUtilsUnitTest.java new file mode 100644 index 0000000000000000000000000000000000000000..c69760720811d26ee2d6b029beffb210cb9095d8 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/security/SecurityUtilsUnitTest.java @@ -0,0 +1,69 @@ +package com.ippon.borestop.security; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Optional; +import org.junit.jupiter.api.Test; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; + +/** + * Test class for the {@link SecurityUtils} utility class. + */ +public class SecurityUtilsUnitTest { + + @Test + public void testGetCurrentUserLogin() { + SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); + securityContext.setAuthentication(new UsernamePasswordAuthenticationToken("admin", "admin")); + SecurityContextHolder.setContext(securityContext); + Optional<String> login = SecurityUtils.getCurrentUserLogin(); + assertThat(login).contains("admin"); + } + + @Test + public void testgetCurrentUserJWT() { + SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); + securityContext.setAuthentication(new UsernamePasswordAuthenticationToken("admin", "token")); + SecurityContextHolder.setContext(securityContext); + Optional<String> jwt = SecurityUtils.getCurrentUserJWT(); + assertThat(jwt).contains("token"); + } + + @Test + public void testIsAuthenticated() { + SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); + securityContext.setAuthentication(new UsernamePasswordAuthenticationToken("admin", "admin")); + SecurityContextHolder.setContext(securityContext); + boolean isAuthenticated = SecurityUtils.isAuthenticated(); + assertThat(isAuthenticated).isTrue(); + } + + @Test + public void testAnonymousIsNotAuthenticated() { + SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); + Collection<GrantedAuthority> authorities = new ArrayList<>(); + authorities.add(new SimpleGrantedAuthority(AuthoritiesConstants.ANONYMOUS)); + securityContext.setAuthentication(new UsernamePasswordAuthenticationToken("anonymous", "anonymous", authorities)); + SecurityContextHolder.setContext(securityContext); + boolean isAuthenticated = SecurityUtils.isAuthenticated(); + assertThat(isAuthenticated).isFalse(); + } + + @Test + public void testIsCurrentUserInRole() { + SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); + Collection<GrantedAuthority> authorities = new ArrayList<>(); + authorities.add(new SimpleGrantedAuthority(AuthoritiesConstants.USER)); + securityContext.setAuthentication(new UsernamePasswordAuthenticationToken("user", "user", authorities)); + SecurityContextHolder.setContext(securityContext); + + assertThat(SecurityUtils.isCurrentUserInRole(AuthoritiesConstants.USER)).isTrue(); + assertThat(SecurityUtils.isCurrentUserInRole(AuthoritiesConstants.ADMIN)).isFalse(); + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/security/jwt/JWTFilterTest.java b/borestop/src/test/java/com/ippon/borestop/security/jwt/JWTFilterTest.java new file mode 100644 index 0000000000000000000000000000000000000000..1ea6d0153dc7f786129acf762f1670ca9d510d05 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/security/jwt/JWTFilterTest.java @@ -0,0 +1,115 @@ +package com.ippon.borestop.security.jwt; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.ippon.borestop.security.AuthoritiesConstants; +import io.github.jhipster.config.JHipsterProperties; +import io.jsonwebtoken.io.Decoders; +import io.jsonwebtoken.security.Keys; +import java.util.Collections; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.http.HttpStatus; +import org.springframework.mock.web.MockFilterChain; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpServletResponse; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.test.util.ReflectionTestUtils; + +public class JWTFilterTest { + private TokenProvider tokenProvider; + + private JWTFilter jwtFilter; + + @BeforeEach + public void setup() { + JHipsterProperties jHipsterProperties = new JHipsterProperties(); + tokenProvider = new TokenProvider(jHipsterProperties); + ReflectionTestUtils.setField( + tokenProvider, + "key", + Keys.hmacShaKeyFor( + Decoders.BASE64.decode("fd54a45s65fds737b9aafcb3412e07ed99b267f33413274720ddbb7f6c5e64e9f14075f2d7ed041592f0b7657baf8") + ) + ); + + ReflectionTestUtils.setField(tokenProvider, "tokenValidityInMilliseconds", 60000); + jwtFilter = new JWTFilter(tokenProvider); + SecurityContextHolder.getContext().setAuthentication(null); + } + + @Test + public void testJWTFilter() throws Exception { + UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken( + "test-user", + "test-password", + Collections.singletonList(new SimpleGrantedAuthority(AuthoritiesConstants.USER)) + ); + String jwt = tokenProvider.createToken(authentication, false); + MockHttpServletRequest request = new MockHttpServletRequest(); + request.addHeader(JWTFilter.AUTHORIZATION_HEADER, "Bearer " + jwt); + request.setRequestURI("/api/test"); + MockHttpServletResponse response = new MockHttpServletResponse(); + MockFilterChain filterChain = new MockFilterChain(); + jwtFilter.doFilter(request, response, filterChain); + assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value()); + assertThat(SecurityContextHolder.getContext().getAuthentication().getName()).isEqualTo("test-user"); + assertThat(SecurityContextHolder.getContext().getAuthentication().getCredentials().toString()).isEqualTo(jwt); + } + + @Test + public void testJWTFilterInvalidToken() throws Exception { + String jwt = "wrong_jwt"; + MockHttpServletRequest request = new MockHttpServletRequest(); + request.addHeader(JWTFilter.AUTHORIZATION_HEADER, "Bearer " + jwt); + request.setRequestURI("/api/test"); + MockHttpServletResponse response = new MockHttpServletResponse(); + MockFilterChain filterChain = new MockFilterChain(); + jwtFilter.doFilter(request, response, filterChain); + assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value()); + assertThat(SecurityContextHolder.getContext().getAuthentication()).isNull(); + } + + @Test + public void testJWTFilterMissingAuthorization() throws Exception { + MockHttpServletRequest request = new MockHttpServletRequest(); + request.setRequestURI("/api/test"); + MockHttpServletResponse response = new MockHttpServletResponse(); + MockFilterChain filterChain = new MockFilterChain(); + jwtFilter.doFilter(request, response, filterChain); + assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value()); + assertThat(SecurityContextHolder.getContext().getAuthentication()).isNull(); + } + + @Test + public void testJWTFilterMissingToken() throws Exception { + MockHttpServletRequest request = new MockHttpServletRequest(); + request.addHeader(JWTFilter.AUTHORIZATION_HEADER, "Bearer "); + request.setRequestURI("/api/test"); + MockHttpServletResponse response = new MockHttpServletResponse(); + MockFilterChain filterChain = new MockFilterChain(); + jwtFilter.doFilter(request, response, filterChain); + assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value()); + assertThat(SecurityContextHolder.getContext().getAuthentication()).isNull(); + } + + @Test + public void testJWTFilterWrongScheme() throws Exception { + UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken( + "test-user", + "test-password", + Collections.singletonList(new SimpleGrantedAuthority(AuthoritiesConstants.USER)) + ); + String jwt = tokenProvider.createToken(authentication, false); + MockHttpServletRequest request = new MockHttpServletRequest(); + request.addHeader(JWTFilter.AUTHORIZATION_HEADER, "Basic " + jwt); + request.setRequestURI("/api/test"); + MockHttpServletResponse response = new MockHttpServletResponse(); + MockFilterChain filterChain = new MockFilterChain(); + jwtFilter.doFilter(request, response, filterChain); + assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value()); + assertThat(SecurityContextHolder.getContext().getAuthentication()).isNull(); + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/security/jwt/TokenProviderTest.java b/borestop/src/test/java/com/ippon/borestop/security/jwt/TokenProviderTest.java new file mode 100644 index 0000000000000000000000000000000000000000..72c5e1d38ecd49d2d5240b421d340a71dc8158bb --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/security/jwt/TokenProviderTest.java @@ -0,0 +1,106 @@ +package com.ippon.borestop.security.jwt; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.ippon.borestop.security.AuthoritiesConstants; +import io.github.jhipster.config.JHipsterProperties; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import io.jsonwebtoken.io.Decoders; +import io.jsonwebtoken.security.Keys; +import java.security.Key; +import java.util.*; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.test.util.ReflectionTestUtils; + +public class TokenProviderTest { + private static final long ONE_MINUTE = 60000; + + private Key key; + private TokenProvider tokenProvider; + + @BeforeEach + public void setup() { + tokenProvider = new TokenProvider(new JHipsterProperties()); + key = + Keys.hmacShaKeyFor( + Decoders.BASE64.decode("fd54a45s65fds737b9aafcb3412e07ed99b267f33413274720ddbb7f6c5e64e9f14075f2d7ed041592f0b7657baf8") + ); + + ReflectionTestUtils.setField(tokenProvider, "key", key); + ReflectionTestUtils.setField(tokenProvider, "tokenValidityInMilliseconds", ONE_MINUTE); + } + + @Test + public void testReturnFalseWhenJWThasInvalidSignature() { + boolean isTokenValid = tokenProvider.validateToken(createTokenWithDifferentSignature()); + + assertThat(isTokenValid).isEqualTo(false); + } + + @Test + public void testReturnFalseWhenJWTisMalformed() { + Authentication authentication = createAuthentication(); + String token = tokenProvider.createToken(authentication, false); + String invalidToken = token.substring(1); + boolean isTokenValid = tokenProvider.validateToken(invalidToken); + + assertThat(isTokenValid).isEqualTo(false); + } + + @Test + public void testReturnFalseWhenJWTisExpired() { + ReflectionTestUtils.setField(tokenProvider, "tokenValidityInMilliseconds", -ONE_MINUTE); + + Authentication authentication = createAuthentication(); + String token = tokenProvider.createToken(authentication, false); + + boolean isTokenValid = tokenProvider.validateToken(token); + + assertThat(isTokenValid).isEqualTo(false); + } + + @Test + public void testReturnFalseWhenJWTisUnsupported() { + String unsupportedToken = createUnsupportedToken(); + + boolean isTokenValid = tokenProvider.validateToken(unsupportedToken); + + assertThat(isTokenValid).isEqualTo(false); + } + + @Test + public void testReturnFalseWhenJWTisInvalid() { + boolean isTokenValid = tokenProvider.validateToken(""); + + assertThat(isTokenValid).isEqualTo(false); + } + + private Authentication createAuthentication() { + Collection<GrantedAuthority> authorities = new ArrayList<>(); + authorities.add(new SimpleGrantedAuthority(AuthoritiesConstants.ANONYMOUS)); + return new UsernamePasswordAuthenticationToken("anonymous", "anonymous", authorities); + } + + private String createUnsupportedToken() { + return Jwts.builder().setPayload("payload").signWith(key, SignatureAlgorithm.HS512).compact(); + } + + private String createTokenWithDifferentSignature() { + Key otherKey = Keys.hmacShaKeyFor( + Decoders.BASE64.decode("Xfd54a45s65fds737b9aafcb3412e07ed99b267f33413274720ddbb7f6c5e64e9f14075f2d7ed041592f0b7657baf8") + ); + + return Jwts + .builder() + .setSubject("anonymous") + .signWith(otherKey, SignatureAlgorithm.HS512) + .setExpiration(new Date(new Date().getTime() + ONE_MINUTE)) + .compact(); + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/service/AuditEventServiceIT.java b/borestop/src/test/java/com/ippon/borestop/service/AuditEventServiceIT.java new file mode 100644 index 0000000000000000000000000000000000000000..984cd63b798370e6776d0a2b68ad65188df68b77 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/service/AuditEventServiceIT.java @@ -0,0 +1,75 @@ +package com.ippon.borestop.service; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.ippon.borestop.BorestopApp; +import com.ippon.borestop.domain.PersistentAuditEvent; +import com.ippon.borestop.repository.PersistenceAuditEventRepository; +import io.github.jhipster.config.JHipsterProperties; +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for {@link AuditEventService}. + */ +@SpringBootTest(classes = BorestopApp.class) +@Transactional +public class AuditEventServiceIT { + @Autowired + private AuditEventService auditEventService; + + @Autowired + private PersistenceAuditEventRepository persistenceAuditEventRepository; + + @Autowired + private JHipsterProperties jHipsterProperties; + + private PersistentAuditEvent auditEventOld; + + private PersistentAuditEvent auditEventWithinRetention; + + private PersistentAuditEvent auditEventNew; + + @BeforeEach + public void init() { + auditEventOld = new PersistentAuditEvent(); + auditEventOld.setAuditEventDate(Instant.now().minus(jHipsterProperties.getAuditEvents().getRetentionPeriod() + 1, ChronoUnit.DAYS)); + auditEventOld.setPrincipal("test-user-old"); + auditEventOld.setAuditEventType("test-type"); + + auditEventWithinRetention = new PersistentAuditEvent(); + auditEventWithinRetention.setAuditEventDate( + Instant.now().minus(jHipsterProperties.getAuditEvents().getRetentionPeriod() - 1, ChronoUnit.DAYS) + ); + auditEventWithinRetention.setPrincipal("test-user-retention"); + auditEventWithinRetention.setAuditEventType("test-type"); + + auditEventNew = new PersistentAuditEvent(); + auditEventNew.setAuditEventDate(Instant.now()); + auditEventNew.setPrincipal("test-user-new"); + auditEventNew.setAuditEventType("test-type"); + } + + @Test + @Transactional + public void verifyOldAuditEventsAreDeleted() { + persistenceAuditEventRepository.deleteAll(); + persistenceAuditEventRepository.save(auditEventOld); + persistenceAuditEventRepository.save(auditEventWithinRetention); + persistenceAuditEventRepository.save(auditEventNew); + + persistenceAuditEventRepository.flush(); + auditEventService.removeOldAuditEvents(); + persistenceAuditEventRepository.flush(); + + assertThat(persistenceAuditEventRepository.findAll().size()).isEqualTo(2); + assertThat(persistenceAuditEventRepository.findByPrincipal("test-user-old")).isEmpty(); + assertThat(persistenceAuditEventRepository.findByPrincipal("test-user-retention")).isNotEmpty(); + assertThat(persistenceAuditEventRepository.findByPrincipal("test-user-new")).isNotEmpty(); + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/service/MailServiceIT.java b/borestop/src/test/java/com/ippon/borestop/service/MailServiceIT.java new file mode 100644 index 0000000000000000000000000000000000000000..8e9a8619244434f1742e089ae3eb3a4bbd9f6679 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/service/MailServiceIT.java @@ -0,0 +1,244 @@ +package com.ippon.borestop.service; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +import com.ippon.borestop.BorestopApp; +import com.ippon.borestop.config.Constants; +import com.ippon.borestop.domain.User; +import io.github.jhipster.config.JHipsterProperties; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStreamReader; +import java.net.URI; +import java.net.URL; +import java.nio.charset.Charset; +import java.util.Properties; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import javax.mail.Multipart; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.MockitoAnnotations; +import org.mockito.Spy; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.MessageSource; +import org.springframework.mail.MailSendException; +import org.springframework.mail.javamail.JavaMailSenderImpl; +import org.thymeleaf.spring5.SpringTemplateEngine; + +/** + * Integration tests for {@link MailService}. + */ +@SpringBootTest(classes = BorestopApp.class) +public class MailServiceIT { + private static final String[] languages = { + "en" + // jhipster-needle-i18n-language-constant - JHipster will add/remove languages in this array + }; + private static final Pattern PATTERN_LOCALE_3 = Pattern.compile("([a-z]{2})-([a-zA-Z]{4})-([a-z]{2})"); + private static final Pattern PATTERN_LOCALE_2 = Pattern.compile("([a-z]{2})-([a-z]{2})"); + + @Autowired + private JHipsterProperties jHipsterProperties; + + @Autowired + private MessageSource messageSource; + + @Autowired + private SpringTemplateEngine templateEngine; + + @Spy + private JavaMailSenderImpl javaMailSender; + + @Captor + private ArgumentCaptor<MimeMessage> messageCaptor; + + private MailService mailService; + + @BeforeEach + public void setup() { + MockitoAnnotations.initMocks(this); + doNothing().when(javaMailSender).send(any(MimeMessage.class)); + mailService = new MailService(jHipsterProperties, javaMailSender, messageSource, templateEngine); + } + + @Test + public void testSendEmail() throws Exception { + mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", false, false); + verify(javaMailSender).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + assertThat(message.getSubject()).isEqualTo("testSubject"); + assertThat(message.getAllRecipients()[0].toString()).isEqualTo("john.doe@example.com"); + assertThat(message.getFrom()[0].toString()).isEqualTo(jHipsterProperties.getMail().getFrom()); + assertThat(message.getContent()).isInstanceOf(String.class); + assertThat(message.getContent().toString()).isEqualTo("testContent"); + assertThat(message.getDataHandler().getContentType()).isEqualTo("text/plain; charset=UTF-8"); + } + + @Test + public void testSendHtmlEmail() throws Exception { + mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", false, true); + verify(javaMailSender).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + assertThat(message.getSubject()).isEqualTo("testSubject"); + assertThat(message.getAllRecipients()[0].toString()).isEqualTo("john.doe@example.com"); + assertThat(message.getFrom()[0].toString()).isEqualTo(jHipsterProperties.getMail().getFrom()); + assertThat(message.getContent()).isInstanceOf(String.class); + assertThat(message.getContent().toString()).isEqualTo("testContent"); + assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); + } + + @Test + public void testSendMultipartEmail() throws Exception { + mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", true, false); + verify(javaMailSender).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + MimeMultipart mp = (MimeMultipart) message.getContent(); + MimeBodyPart part = (MimeBodyPart) ((MimeMultipart) mp.getBodyPart(0).getContent()).getBodyPart(0); + ByteArrayOutputStream aos = new ByteArrayOutputStream(); + part.writeTo(aos); + assertThat(message.getSubject()).isEqualTo("testSubject"); + assertThat(message.getAllRecipients()[0].toString()).isEqualTo("john.doe@example.com"); + assertThat(message.getFrom()[0].toString()).isEqualTo(jHipsterProperties.getMail().getFrom()); + assertThat(message.getContent()).isInstanceOf(Multipart.class); + assertThat(aos.toString()).isEqualTo("\r\ntestContent"); + assertThat(part.getDataHandler().getContentType()).isEqualTo("text/plain; charset=UTF-8"); + } + + @Test + public void testSendMultipartHtmlEmail() throws Exception { + mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", true, true); + verify(javaMailSender).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + MimeMultipart mp = (MimeMultipart) message.getContent(); + MimeBodyPart part = (MimeBodyPart) ((MimeMultipart) mp.getBodyPart(0).getContent()).getBodyPart(0); + ByteArrayOutputStream aos = new ByteArrayOutputStream(); + part.writeTo(aos); + assertThat(message.getSubject()).isEqualTo("testSubject"); + assertThat(message.getAllRecipients()[0].toString()).isEqualTo("john.doe@example.com"); + assertThat(message.getFrom()[0].toString()).isEqualTo(jHipsterProperties.getMail().getFrom()); + assertThat(message.getContent()).isInstanceOf(Multipart.class); + assertThat(aos.toString()).isEqualTo("\r\ntestContent"); + assertThat(part.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); + } + + @Test + public void testSendEmailFromTemplate() throws Exception { + User user = new User(); + user.setLogin("john"); + user.setEmail("john.doe@example.com"); + user.setLangKey("en"); + mailService.sendEmailFromTemplate(user, "mail/testEmail", "email.test.title"); + verify(javaMailSender).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + assertThat(message.getSubject()).isEqualTo("test title"); + assertThat(message.getAllRecipients()[0].toString()).isEqualTo(user.getEmail()); + assertThat(message.getFrom()[0].toString()).isEqualTo(jHipsterProperties.getMail().getFrom()); + assertThat(message.getContent().toString()).isEqualToNormalizingNewlines("<html>test title, http://127.0.0.1:8080, john</html>\n"); + assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); + } + + @Test + public void testSendActivationEmail() throws Exception { + User user = new User(); + user.setLangKey(Constants.DEFAULT_LANGUAGE); + user.setLogin("john"); + user.setEmail("john.doe@example.com"); + mailService.sendActivationEmail(user); + verify(javaMailSender).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + assertThat(message.getAllRecipients()[0].toString()).isEqualTo(user.getEmail()); + assertThat(message.getFrom()[0].toString()).isEqualTo(jHipsterProperties.getMail().getFrom()); + assertThat(message.getContent().toString()).isNotEmpty(); + assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); + } + + @Test + public void testCreationEmail() throws Exception { + User user = new User(); + user.setLangKey(Constants.DEFAULT_LANGUAGE); + user.setLogin("john"); + user.setEmail("john.doe@example.com"); + mailService.sendCreationEmail(user); + verify(javaMailSender).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + assertThat(message.getAllRecipients()[0].toString()).isEqualTo(user.getEmail()); + assertThat(message.getFrom()[0].toString()).isEqualTo(jHipsterProperties.getMail().getFrom()); + assertThat(message.getContent().toString()).isNotEmpty(); + assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); + } + + @Test + public void testSendPasswordResetMail() throws Exception { + User user = new User(); + user.setLangKey(Constants.DEFAULT_LANGUAGE); + user.setLogin("john"); + user.setEmail("john.doe@example.com"); + mailService.sendPasswordResetMail(user); + verify(javaMailSender).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + assertThat(message.getAllRecipients()[0].toString()).isEqualTo(user.getEmail()); + assertThat(message.getFrom()[0].toString()).isEqualTo(jHipsterProperties.getMail().getFrom()); + assertThat(message.getContent().toString()).isNotEmpty(); + assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); + } + + @Test + public void testSendEmailWithException() { + doThrow(MailSendException.class).when(javaMailSender).send(any(MimeMessage.class)); + try { + mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", false, false); + } catch (Exception e) { + fail("Exception shouldn't have been thrown"); + } + } + + @Test + public void testSendLocalizedEmailForAllSupportedLanguages() throws Exception { + User user = new User(); + user.setLogin("john"); + user.setEmail("john.doe@example.com"); + for (String langKey : languages) { + user.setLangKey(langKey); + mailService.sendEmailFromTemplate(user, "mail/testEmail", "email.test.title"); + verify(javaMailSender, atLeastOnce()).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + + String propertyFilePath = "i18n/messages_" + getJavaLocale(langKey) + ".properties"; + URL resource = this.getClass().getClassLoader().getResource(propertyFilePath); + File file = new File(new URI(resource.getFile()).getPath()); + Properties properties = new Properties(); + properties.load(new InputStreamReader(new FileInputStream(file), Charset.forName("UTF-8"))); + + String emailTitle = (String) properties.get("email.test.title"); + assertThat(message.getSubject()).isEqualTo(emailTitle); + assertThat(message.getContent().toString()) + .isEqualToNormalizingNewlines("<html>" + emailTitle + ", http://127.0.0.1:8080, john</html>\n"); + } + } + + /** + * Convert a lang key to the Java locale. + */ + private String getJavaLocale(String langKey) { + String javaLangKey = langKey; + Matcher matcher2 = PATTERN_LOCALE_2.matcher(langKey); + if (matcher2.matches()) { + javaLangKey = matcher2.group(1) + "_" + matcher2.group(2).toUpperCase(); + } + Matcher matcher3 = PATTERN_LOCALE_3.matcher(langKey); + if (matcher3.matches()) { + javaLangKey = matcher3.group(1) + "_" + matcher3.group(2) + "_" + matcher3.group(3).toUpperCase(); + } + return javaLangKey; + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/service/UserServiceIT.java b/borestop/src/test/java/com/ippon/borestop/service/UserServiceIT.java new file mode 100644 index 0000000000000000000000000000000000000000..8d5c83d38c831bbbc3dc7fc951f0f566fc0faa16 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/service/UserServiceIT.java @@ -0,0 +1,197 @@ +package com.ippon.borestop.service; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; + +import com.ippon.borestop.BorestopApp; +import com.ippon.borestop.config.Constants; +import com.ippon.borestop.domain.User; +import com.ippon.borestop.repository.UserRepository; +import com.ippon.borestop.service.dto.UserDTO; +import io.github.jhipster.security.RandomUtil; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.List; +import java.util.Optional; +import org.apache.commons.lang3.RandomStringUtils; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.auditing.AuditingHandler; +import org.springframework.data.auditing.DateTimeProvider; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for {@link UserService}. + */ +@SpringBootTest(classes = BorestopApp.class) +@Transactional +public class UserServiceIT { + private static final String DEFAULT_LOGIN = "johndoe"; + + private static final String DEFAULT_EMAIL = "johndoe@localhost"; + + private static final String DEFAULT_FIRSTNAME = "john"; + + private static final String DEFAULT_LASTNAME = "doe"; + + private static final String DEFAULT_IMAGEURL = "http://placehold.it/50x50"; + + private static final String DEFAULT_LANGKEY = "dummy"; + + @Autowired + private UserRepository userRepository; + + @Autowired + private UserService userService; + + @Autowired + private AuditingHandler auditingHandler; + + @Mock + private DateTimeProvider dateTimeProvider; + + private User user; + + @BeforeEach + public void init() { + user = new User(); + user.setLogin(DEFAULT_LOGIN); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + user.setEmail(DEFAULT_EMAIL); + user.setFirstName(DEFAULT_FIRSTNAME); + user.setLastName(DEFAULT_LASTNAME); + user.setImageUrl(DEFAULT_IMAGEURL); + user.setLangKey(DEFAULT_LANGKEY); + + when(dateTimeProvider.getNow()).thenReturn(Optional.of(LocalDateTime.now())); + auditingHandler.setDateTimeProvider(dateTimeProvider); + } + + @Test + @Transactional + public void assertThatUserMustExistToResetPassword() { + userRepository.saveAndFlush(user); + Optional<User> maybeUser = userService.requestPasswordReset("invalid.login@localhost"); + assertThat(maybeUser).isNotPresent(); + + maybeUser = userService.requestPasswordReset(user.getEmail()); + assertThat(maybeUser).isPresent(); + assertThat(maybeUser.orElse(null).getEmail()).isEqualTo(user.getEmail()); + assertThat(maybeUser.orElse(null).getResetDate()).isNotNull(); + assertThat(maybeUser.orElse(null).getResetKey()).isNotNull(); + } + + @Test + @Transactional + public void assertThatOnlyActivatedUserCanRequestPasswordReset() { + user.setActivated(false); + userRepository.saveAndFlush(user); + + Optional<User> maybeUser = userService.requestPasswordReset(user.getLogin()); + assertThat(maybeUser).isNotPresent(); + userRepository.delete(user); + } + + @Test + @Transactional + public void assertThatResetKeyMustNotBeOlderThan24Hours() { + Instant daysAgo = Instant.now().minus(25, ChronoUnit.HOURS); + String resetKey = RandomUtil.generateResetKey(); + user.setActivated(true); + user.setResetDate(daysAgo); + user.setResetKey(resetKey); + userRepository.saveAndFlush(user); + + Optional<User> maybeUser = userService.completePasswordReset("johndoe2", user.getResetKey()); + assertThat(maybeUser).isNotPresent(); + userRepository.delete(user); + } + + @Test + @Transactional + public void assertThatResetKeyMustBeValid() { + Instant daysAgo = Instant.now().minus(25, ChronoUnit.HOURS); + user.setActivated(true); + user.setResetDate(daysAgo); + user.setResetKey("1234"); + userRepository.saveAndFlush(user); + + Optional<User> maybeUser = userService.completePasswordReset("johndoe2", user.getResetKey()); + assertThat(maybeUser).isNotPresent(); + userRepository.delete(user); + } + + @Test + @Transactional + public void assertThatUserCanResetPassword() { + String oldPassword = user.getPassword(); + Instant daysAgo = Instant.now().minus(2, ChronoUnit.HOURS); + String resetKey = RandomUtil.generateResetKey(); + user.setActivated(true); + user.setResetDate(daysAgo); + user.setResetKey(resetKey); + userRepository.saveAndFlush(user); + + Optional<User> maybeUser = userService.completePasswordReset("johndoe2", user.getResetKey()); + assertThat(maybeUser).isPresent(); + assertThat(maybeUser.orElse(null).getResetDate()).isNull(); + assertThat(maybeUser.orElse(null).getResetKey()).isNull(); + assertThat(maybeUser.orElse(null).getPassword()).isNotEqualTo(oldPassword); + + userRepository.delete(user); + } + + @Test + @Transactional + public void assertThatNotActivatedUsersWithNotNullActivationKeyCreatedBefore3DaysAreDeleted() { + Instant now = Instant.now(); + when(dateTimeProvider.getNow()).thenReturn(Optional.of(now.minus(4, ChronoUnit.DAYS))); + user.setActivated(false); + user.setActivationKey(RandomStringUtils.random(20)); + User dbUser = userRepository.saveAndFlush(user); + dbUser.setCreatedDate(now.minus(4, ChronoUnit.DAYS)); + userRepository.saveAndFlush(user); + Instant threeDaysAgo = now.minus(3, ChronoUnit.DAYS); + List<User> users = userRepository.findAllByActivatedIsFalseAndActivationKeyIsNotNullAndCreatedDateBefore(threeDaysAgo); + assertThat(users).isNotEmpty(); + userService.removeNotActivatedUsers(); + users = userRepository.findAllByActivatedIsFalseAndActivationKeyIsNotNullAndCreatedDateBefore(threeDaysAgo); + assertThat(users).isEmpty(); + } + + @Test + @Transactional + public void assertThatNotActivatedUsersWithNullActivationKeyCreatedBefore3DaysAreNotDeleted() { + Instant now = Instant.now(); + when(dateTimeProvider.getNow()).thenReturn(Optional.of(now.minus(4, ChronoUnit.DAYS))); + user.setActivated(false); + User dbUser = userRepository.saveAndFlush(user); + dbUser.setCreatedDate(now.minus(4, ChronoUnit.DAYS)); + userRepository.saveAndFlush(user); + Instant threeDaysAgo = now.minus(3, ChronoUnit.DAYS); + List<User> users = userRepository.findAllByActivatedIsFalseAndActivationKeyIsNotNullAndCreatedDateBefore(threeDaysAgo); + assertThat(users).isEmpty(); + userService.removeNotActivatedUsers(); + Optional<User> maybeDbUser = userRepository.findById(dbUser.getId()); + assertThat(maybeDbUser).contains(dbUser); + } + + @Test + @Transactional + public void assertThatAnonymousUserIsNotGet() { + user.setLogin(Constants.ANONYMOUS_USER); + if (!userRepository.findOneByLogin(Constants.ANONYMOUS_USER).isPresent()) { + userRepository.saveAndFlush(user); + } + final PageRequest pageable = PageRequest.of(0, (int) userRepository.count()); + final Page<UserDTO> allManagedUsers = userService.getAllManagedUsers(pageable); + assertThat(allManagedUsers.getContent().stream().noneMatch(user -> Constants.ANONYMOUS_USER.equals(user.getLogin()))).isTrue(); + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/service/mapper/UserMapperTest.java b/borestop/src/test/java/com/ippon/borestop/service/mapper/UserMapperTest.java new file mode 100644 index 0000000000000000000000000000000000000000..172ef840b744d87b13fb37013fb822f396b5bb27 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/service/mapper/UserMapperTest.java @@ -0,0 +1,134 @@ +package com.ippon.borestop.service.mapper; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.ippon.borestop.domain.User; +import com.ippon.borestop.service.dto.UserDTO; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.apache.commons.lang3.RandomStringUtils; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +/** + * Unit tests for {@link UserMapper}. + */ +public class UserMapperTest { + private static final String DEFAULT_LOGIN = "johndoe"; + private static final Long DEFAULT_ID = 1L; + + private UserMapper userMapper; + private User user; + private UserDTO userDto; + + @BeforeEach + public void init() { + userMapper = new UserMapper(); + user = new User(); + user.setLogin(DEFAULT_LOGIN); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + user.setEmail("johndoe@localhost"); + user.setFirstName("john"); + user.setLastName("doe"); + user.setImageUrl("image_url"); + user.setLangKey("en"); + + userDto = new UserDTO(user); + } + + @Test + public void usersToUserDTOsShouldMapOnlyNonNullUsers() { + List<User> users = new ArrayList<>(); + users.add(user); + users.add(null); + + List<UserDTO> userDTOS = userMapper.usersToUserDTOs(users); + + assertThat(userDTOS).isNotEmpty(); + assertThat(userDTOS).size().isEqualTo(1); + } + + @Test + public void userDTOsToUsersShouldMapOnlyNonNullUsers() { + List<UserDTO> usersDto = new ArrayList<>(); + usersDto.add(userDto); + usersDto.add(null); + + List<User> users = userMapper.userDTOsToUsers(usersDto); + + assertThat(users).isNotEmpty(); + assertThat(users).size().isEqualTo(1); + } + + @Test + public void userDTOsToUsersWithAuthoritiesStringShouldMapToUsersWithAuthoritiesDomain() { + Set<String> authoritiesAsString = new HashSet<>(); + authoritiesAsString.add("ADMIN"); + userDto.setAuthorities(authoritiesAsString); + + List<UserDTO> usersDto = new ArrayList<>(); + usersDto.add(userDto); + + List<User> users = userMapper.userDTOsToUsers(usersDto); + + assertThat(users).isNotEmpty(); + assertThat(users).size().isEqualTo(1); + assertThat(users.get(0).getAuthorities()).isNotNull(); + assertThat(users.get(0).getAuthorities()).isNotEmpty(); + assertThat(users.get(0).getAuthorities().iterator().next().getName()).isEqualTo("ADMIN"); + } + + @Test + public void userDTOsToUsersMapWithNullAuthoritiesStringShouldReturnUserWithEmptyAuthorities() { + userDto.setAuthorities(null); + + List<UserDTO> usersDto = new ArrayList<>(); + usersDto.add(userDto); + + List<User> users = userMapper.userDTOsToUsers(usersDto); + + assertThat(users).isNotEmpty(); + assertThat(users).size().isEqualTo(1); + assertThat(users.get(0).getAuthorities()).isNotNull(); + assertThat(users.get(0).getAuthorities()).isEmpty(); + } + + @Test + public void userDTOToUserMapWithAuthoritiesStringShouldReturnUserWithAuthorities() { + Set<String> authoritiesAsString = new HashSet<>(); + authoritiesAsString.add("ADMIN"); + userDto.setAuthorities(authoritiesAsString); + + User user = userMapper.userDTOToUser(userDto); + + assertThat(user).isNotNull(); + assertThat(user.getAuthorities()).isNotNull(); + assertThat(user.getAuthorities()).isNotEmpty(); + assertThat(user.getAuthorities().iterator().next().getName()).isEqualTo("ADMIN"); + } + + @Test + public void userDTOToUserMapWithNullAuthoritiesStringShouldReturnUserWithEmptyAuthorities() { + userDto.setAuthorities(null); + + User user = userMapper.userDTOToUser(userDto); + + assertThat(user).isNotNull(); + assertThat(user.getAuthorities()).isNotNull(); + assertThat(user.getAuthorities()).isEmpty(); + } + + @Test + public void userDTOToUserMapWithNullUserShouldReturnNull() { + assertThat(userMapper.userDTOToUser(null)).isNull(); + } + + @Test + public void testUserFromId() { + assertThat(userMapper.userFromId(DEFAULT_ID).getId()).isEqualTo(DEFAULT_ID); + assertThat(userMapper.userFromId(null)).isNull(); + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/web/rest/AccountResourceIT.java b/borestop/src/test/java/com/ippon/borestop/web/rest/AccountResourceIT.java new file mode 100644 index 0000000000000000000000000000000000000000..e4cab98ce711f2720988f20e8d03893562e8543e --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/web/rest/AccountResourceIT.java @@ -0,0 +1,755 @@ +package com.ippon.borestop.web.rest; + +import static com.ippon.borestop.web.rest.AccountResourceIT.TEST_USER_LOGIN; +import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import com.ippon.borestop.BorestopApp; +import com.ippon.borestop.config.Constants; +import com.ippon.borestop.domain.User; +import com.ippon.borestop.repository.AuthorityRepository; +import com.ippon.borestop.repository.UserRepository; +import com.ippon.borestop.security.AuthoritiesConstants; +import com.ippon.borestop.service.UserService; +import com.ippon.borestop.service.dto.PasswordChangeDTO; +import com.ippon.borestop.service.dto.UserDTO; +import com.ippon.borestop.web.rest.vm.KeyAndPasswordVM; +import com.ippon.borestop.web.rest.vm.ManagedUserVM; +import java.time.Instant; +import java.util.*; +import org.apache.commons.lang3.RandomStringUtils; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for the {@link AccountResource} REST controller. + */ +@AutoConfigureMockMvc +@WithMockUser(value = TEST_USER_LOGIN) +@SpringBootTest(classes = BorestopApp.class) +public class AccountResourceIT { + static final String TEST_USER_LOGIN = "test"; + + @Autowired + private UserRepository userRepository; + + @Autowired + private AuthorityRepository authorityRepository; + + @Autowired + private UserService userService; + + @Autowired + private PasswordEncoder passwordEncoder; + + @Autowired + private MockMvc restAccountMockMvc; + + @Test + @WithUnauthenticatedMockUser + public void testNonAuthenticatedUser() throws Exception { + restAccountMockMvc + .perform(get("/api/authenticate").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string("")); + } + + @Test + public void testAuthenticatedUser() throws Exception { + restAccountMockMvc + .perform( + get("/api/authenticate") + .with( + request -> { + request.setRemoteUser(TEST_USER_LOGIN); + return request; + } + ) + .accept(MediaType.APPLICATION_JSON) + ) + .andExpect(status().isOk()) + .andExpect(content().string(TEST_USER_LOGIN)); + } + + @Test + public void testGetExistingAccount() throws Exception { + Set<String> authorities = new HashSet<>(); + authorities.add(AuthoritiesConstants.ADMIN); + + UserDTO user = new UserDTO(); + user.setLogin(TEST_USER_LOGIN); + user.setFirstName("john"); + user.setLastName("doe"); + user.setEmail("john.doe@jhipster.com"); + user.setImageUrl("http://placehold.it/50x50"); + user.setLangKey("en"); + user.setAuthorities(authorities); + userService.createUser(user); + + restAccountMockMvc + .perform(get("/api/account").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.login").value(TEST_USER_LOGIN)) + .andExpect(jsonPath("$.firstName").value("john")) + .andExpect(jsonPath("$.lastName").value("doe")) + .andExpect(jsonPath("$.email").value("john.doe@jhipster.com")) + .andExpect(jsonPath("$.imageUrl").value("http://placehold.it/50x50")) + .andExpect(jsonPath("$.langKey").value("en")) + .andExpect(jsonPath("$.authorities").value(AuthoritiesConstants.ADMIN)); + } + + @Test + public void testGetUnknownAccount() throws Exception { + restAccountMockMvc.perform(get("/api/account").accept(MediaType.APPLICATION_PROBLEM_JSON)).andExpect(status().isInternalServerError()); + } + + @Test + @Transactional + public void testRegisterValid() throws Exception { + ManagedUserVM validUser = new ManagedUserVM(); + validUser.setLogin("test-register-valid"); + validUser.setPassword("password"); + validUser.setFirstName("Alice"); + validUser.setLastName("Test"); + validUser.setEmail("test-register-valid@example.com"); + validUser.setImageUrl("http://placehold.it/50x50"); + validUser.setLangKey(Constants.DEFAULT_LANGUAGE); + validUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + assertThat(userRepository.findOneByLogin("test-register-valid").isPresent()).isFalse(); + + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(validUser))) + .andExpect(status().isCreated()); + + assertThat(userRepository.findOneByLogin("test-register-valid").isPresent()).isTrue(); + } + + @Test + @Transactional + public void testRegisterInvalidLogin() throws Exception { + ManagedUserVM invalidUser = new ManagedUserVM(); + invalidUser.setLogin("funky-log(n"); // <-- invalid + invalidUser.setPassword("password"); + invalidUser.setFirstName("Funky"); + invalidUser.setLastName("One"); + invalidUser.setEmail("funky@example.com"); + invalidUser.setActivated(true); + invalidUser.setImageUrl("http://placehold.it/50x50"); + invalidUser.setLangKey(Constants.DEFAULT_LANGUAGE); + invalidUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(invalidUser))) + .andExpect(status().isBadRequest()); + + Optional<User> user = userRepository.findOneByEmailIgnoreCase("funky@example.com"); + assertThat(user.isPresent()).isFalse(); + } + + @Test + @Transactional + public void testRegisterInvalidEmail() throws Exception { + ManagedUserVM invalidUser = new ManagedUserVM(); + invalidUser.setLogin("bob"); + invalidUser.setPassword("password"); + invalidUser.setFirstName("Bob"); + invalidUser.setLastName("Green"); + invalidUser.setEmail("invalid"); // <-- invalid + invalidUser.setActivated(true); + invalidUser.setImageUrl("http://placehold.it/50x50"); + invalidUser.setLangKey(Constants.DEFAULT_LANGUAGE); + invalidUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(invalidUser))) + .andExpect(status().isBadRequest()); + + Optional<User> user = userRepository.findOneByLogin("bob"); + assertThat(user.isPresent()).isFalse(); + } + + @Test + @Transactional + public void testRegisterInvalidPassword() throws Exception { + ManagedUserVM invalidUser = new ManagedUserVM(); + invalidUser.setLogin("bob"); + invalidUser.setPassword("123"); // password with only 3 digits + invalidUser.setFirstName("Bob"); + invalidUser.setLastName("Green"); + invalidUser.setEmail("bob@example.com"); + invalidUser.setActivated(true); + invalidUser.setImageUrl("http://placehold.it/50x50"); + invalidUser.setLangKey(Constants.DEFAULT_LANGUAGE); + invalidUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(invalidUser))) + .andExpect(status().isBadRequest()); + + Optional<User> user = userRepository.findOneByLogin("bob"); + assertThat(user.isPresent()).isFalse(); + } + + @Test + @Transactional + public void testRegisterNullPassword() throws Exception { + ManagedUserVM invalidUser = new ManagedUserVM(); + invalidUser.setLogin("bob"); + invalidUser.setPassword(null); // invalid null password + invalidUser.setFirstName("Bob"); + invalidUser.setLastName("Green"); + invalidUser.setEmail("bob@example.com"); + invalidUser.setActivated(true); + invalidUser.setImageUrl("http://placehold.it/50x50"); + invalidUser.setLangKey(Constants.DEFAULT_LANGUAGE); + invalidUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(invalidUser))) + .andExpect(status().isBadRequest()); + + Optional<User> user = userRepository.findOneByLogin("bob"); + assertThat(user.isPresent()).isFalse(); + } + + @Test + @Transactional + public void testRegisterDuplicateLogin() throws Exception { + // First registration + ManagedUserVM firstUser = new ManagedUserVM(); + firstUser.setLogin("alice"); + firstUser.setPassword("password"); + firstUser.setFirstName("Alice"); + firstUser.setLastName("Something"); + firstUser.setEmail("alice@example.com"); + firstUser.setImageUrl("http://placehold.it/50x50"); + firstUser.setLangKey(Constants.DEFAULT_LANGUAGE); + firstUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + // Duplicate login, different email + ManagedUserVM secondUser = new ManagedUserVM(); + secondUser.setLogin(firstUser.getLogin()); + secondUser.setPassword(firstUser.getPassword()); + secondUser.setFirstName(firstUser.getFirstName()); + secondUser.setLastName(firstUser.getLastName()); + secondUser.setEmail("alice2@example.com"); + secondUser.setImageUrl(firstUser.getImageUrl()); + secondUser.setLangKey(firstUser.getLangKey()); + secondUser.setCreatedBy(firstUser.getCreatedBy()); + secondUser.setCreatedDate(firstUser.getCreatedDate()); + secondUser.setLastModifiedBy(firstUser.getLastModifiedBy()); + secondUser.setLastModifiedDate(firstUser.getLastModifiedDate()); + secondUser.setAuthorities(new HashSet<>(firstUser.getAuthorities())); + + // First user + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(firstUser))) + .andExpect(status().isCreated()); + + // Second (non activated) user + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(secondUser))) + .andExpect(status().isCreated()); + + Optional<User> testUser = userRepository.findOneByEmailIgnoreCase("alice2@example.com"); + assertThat(testUser.isPresent()).isTrue(); + testUser.get().setActivated(true); + userRepository.save(testUser.get()); + + // Second (already activated) user + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(secondUser))) + .andExpect(status().is4xxClientError()); + } + + @Test + @Transactional + public void testRegisterDuplicateEmail() throws Exception { + // First user + ManagedUserVM firstUser = new ManagedUserVM(); + firstUser.setLogin("test-register-duplicate-email"); + firstUser.setPassword("password"); + firstUser.setFirstName("Alice"); + firstUser.setLastName("Test"); + firstUser.setEmail("test-register-duplicate-email@example.com"); + firstUser.setImageUrl("http://placehold.it/50x50"); + firstUser.setLangKey(Constants.DEFAULT_LANGUAGE); + firstUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + // Register first user + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(firstUser))) + .andExpect(status().isCreated()); + + Optional<User> testUser1 = userRepository.findOneByLogin("test-register-duplicate-email"); + assertThat(testUser1.isPresent()).isTrue(); + + // Duplicate email, different login + ManagedUserVM secondUser = new ManagedUserVM(); + secondUser.setLogin("test-register-duplicate-email-2"); + secondUser.setPassword(firstUser.getPassword()); + secondUser.setFirstName(firstUser.getFirstName()); + secondUser.setLastName(firstUser.getLastName()); + secondUser.setEmail(firstUser.getEmail()); + secondUser.setImageUrl(firstUser.getImageUrl()); + secondUser.setLangKey(firstUser.getLangKey()); + secondUser.setAuthorities(new HashSet<>(firstUser.getAuthorities())); + + // Register second (non activated) user + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(secondUser))) + .andExpect(status().isCreated()); + + Optional<User> testUser2 = userRepository.findOneByLogin("test-register-duplicate-email"); + assertThat(testUser2.isPresent()).isFalse(); + + Optional<User> testUser3 = userRepository.findOneByLogin("test-register-duplicate-email-2"); + assertThat(testUser3.isPresent()).isTrue(); + + // Duplicate email - with uppercase email address + ManagedUserVM userWithUpperCaseEmail = new ManagedUserVM(); + userWithUpperCaseEmail.setId(firstUser.getId()); + userWithUpperCaseEmail.setLogin("test-register-duplicate-email-3"); + userWithUpperCaseEmail.setPassword(firstUser.getPassword()); + userWithUpperCaseEmail.setFirstName(firstUser.getFirstName()); + userWithUpperCaseEmail.setLastName(firstUser.getLastName()); + userWithUpperCaseEmail.setEmail("TEST-register-duplicate-email@example.com"); + userWithUpperCaseEmail.setImageUrl(firstUser.getImageUrl()); + userWithUpperCaseEmail.setLangKey(firstUser.getLangKey()); + userWithUpperCaseEmail.setAuthorities(new HashSet<>(firstUser.getAuthorities())); + + // Register third (not activated) user + restAccountMockMvc + .perform( + post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(userWithUpperCaseEmail)) + ) + .andExpect(status().isCreated()); + + Optional<User> testUser4 = userRepository.findOneByLogin("test-register-duplicate-email-3"); + assertThat(testUser4.isPresent()).isTrue(); + assertThat(testUser4.get().getEmail()).isEqualTo("test-register-duplicate-email@example.com"); + + testUser4.get().setActivated(true); + userService.updateUser((new UserDTO(testUser4.get()))); + + // Register 4th (already activated) user + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(secondUser))) + .andExpect(status().is4xxClientError()); + } + + @Test + @Transactional + public void testRegisterAdminIsIgnored() throws Exception { + ManagedUserVM validUser = new ManagedUserVM(); + validUser.setLogin("badguy"); + validUser.setPassword("password"); + validUser.setFirstName("Bad"); + validUser.setLastName("Guy"); + validUser.setEmail("badguy@example.com"); + validUser.setActivated(true); + validUser.setImageUrl("http://placehold.it/50x50"); + validUser.setLangKey(Constants.DEFAULT_LANGUAGE); + validUser.setAuthorities(Collections.singleton(AuthoritiesConstants.ADMIN)); + + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(validUser))) + .andExpect(status().isCreated()); + + Optional<User> userDup = userRepository.findOneWithAuthoritiesByLogin("badguy"); + assertThat(userDup.isPresent()).isTrue(); + assertThat(userDup.get().getAuthorities()).hasSize(1).containsExactly(authorityRepository.findById(AuthoritiesConstants.USER).get()); + } + + @Test + @Transactional + public void testActivateAccount() throws Exception { + final String activationKey = "some activation key"; + User user = new User(); + user.setLogin("activate-account"); + user.setEmail("activate-account@example.com"); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(false); + user.setActivationKey(activationKey); + + userRepository.saveAndFlush(user); + + restAccountMockMvc.perform(get("/api/activate?key={activationKey}", activationKey)).andExpect(status().isOk()); + + user = userRepository.findOneByLogin(user.getLogin()).orElse(null); + assertThat(user.getActivated()).isTrue(); + } + + @Test + @Transactional + public void testActivateAccountWithWrongKey() throws Exception { + restAccountMockMvc.perform(get("/api/activate?key=wrongActivationKey")).andExpect(status().isInternalServerError()); + } + + @Test + @Transactional + @WithMockUser("save-account") + public void testSaveAccount() throws Exception { + User user = new User(); + user.setLogin("save-account"); + user.setEmail("save-account@example.com"); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + userRepository.saveAndFlush(user); + + UserDTO userDTO = new UserDTO(); + userDTO.setLogin("not-used"); + userDTO.setFirstName("firstname"); + userDTO.setLastName("lastname"); + userDTO.setEmail("save-account@example.com"); + userDTO.setActivated(false); + userDTO.setImageUrl("http://placehold.it/50x50"); + userDTO.setLangKey(Constants.DEFAULT_LANGUAGE); + userDTO.setAuthorities(Collections.singleton(AuthoritiesConstants.ADMIN)); + + restAccountMockMvc + .perform(post("/api/account").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(userDTO))) + .andExpect(status().isOk()); + + User updatedUser = userRepository.findOneWithAuthoritiesByLogin(user.getLogin()).orElse(null); + assertThat(updatedUser.getFirstName()).isEqualTo(userDTO.getFirstName()); + assertThat(updatedUser.getLastName()).isEqualTo(userDTO.getLastName()); + assertThat(updatedUser.getEmail()).isEqualTo(userDTO.getEmail()); + assertThat(updatedUser.getLangKey()).isEqualTo(userDTO.getLangKey()); + assertThat(updatedUser.getPassword()).isEqualTo(user.getPassword()); + assertThat(updatedUser.getImageUrl()).isEqualTo(userDTO.getImageUrl()); + assertThat(updatedUser.getActivated()).isEqualTo(true); + assertThat(updatedUser.getAuthorities()).isEmpty(); + } + + @Test + @Transactional + @WithMockUser("save-invalid-email") + public void testSaveInvalidEmail() throws Exception { + User user = new User(); + user.setLogin("save-invalid-email"); + user.setEmail("save-invalid-email@example.com"); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + + userRepository.saveAndFlush(user); + + UserDTO userDTO = new UserDTO(); + userDTO.setLogin("not-used"); + userDTO.setFirstName("firstname"); + userDTO.setLastName("lastname"); + userDTO.setEmail("invalid email"); + userDTO.setActivated(false); + userDTO.setImageUrl("http://placehold.it/50x50"); + userDTO.setLangKey(Constants.DEFAULT_LANGUAGE); + userDTO.setAuthorities(Collections.singleton(AuthoritiesConstants.ADMIN)); + + restAccountMockMvc + .perform(post("/api/account").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(userDTO))) + .andExpect(status().isBadRequest()); + + assertThat(userRepository.findOneByEmailIgnoreCase("invalid email")).isNotPresent(); + } + + @Test + @Transactional + @WithMockUser("save-existing-email") + public void testSaveExistingEmail() throws Exception { + User user = new User(); + user.setLogin("save-existing-email"); + user.setEmail("save-existing-email@example.com"); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + userRepository.saveAndFlush(user); + + User anotherUser = new User(); + anotherUser.setLogin("save-existing-email2"); + anotherUser.setEmail("save-existing-email2@example.com"); + anotherUser.setPassword(RandomStringUtils.random(60)); + anotherUser.setActivated(true); + + userRepository.saveAndFlush(anotherUser); + + UserDTO userDTO = new UserDTO(); + userDTO.setLogin("not-used"); + userDTO.setFirstName("firstname"); + userDTO.setLastName("lastname"); + userDTO.setEmail("save-existing-email2@example.com"); + userDTO.setActivated(false); + userDTO.setImageUrl("http://placehold.it/50x50"); + userDTO.setLangKey(Constants.DEFAULT_LANGUAGE); + userDTO.setAuthorities(Collections.singleton(AuthoritiesConstants.ADMIN)); + + restAccountMockMvc + .perform(post("/api/account").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(userDTO))) + .andExpect(status().isBadRequest()); + + User updatedUser = userRepository.findOneByLogin("save-existing-email").orElse(null); + assertThat(updatedUser.getEmail()).isEqualTo("save-existing-email@example.com"); + } + + @Test + @Transactional + @WithMockUser("save-existing-email-and-login") + public void testSaveExistingEmailAndLogin() throws Exception { + User user = new User(); + user.setLogin("save-existing-email-and-login"); + user.setEmail("save-existing-email-and-login@example.com"); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + userRepository.saveAndFlush(user); + + UserDTO userDTO = new UserDTO(); + userDTO.setLogin("not-used"); + userDTO.setFirstName("firstname"); + userDTO.setLastName("lastname"); + userDTO.setEmail("save-existing-email-and-login@example.com"); + userDTO.setActivated(false); + userDTO.setImageUrl("http://placehold.it/50x50"); + userDTO.setLangKey(Constants.DEFAULT_LANGUAGE); + userDTO.setAuthorities(Collections.singleton(AuthoritiesConstants.ADMIN)); + + restAccountMockMvc + .perform(post("/api/account").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(userDTO))) + .andExpect(status().isOk()); + + User updatedUser = userRepository.findOneByLogin("save-existing-email-and-login").orElse(null); + assertThat(updatedUser.getEmail()).isEqualTo("save-existing-email-and-login@example.com"); + } + + @Test + @Transactional + @WithMockUser("change-password-wrong-existing-password") + public void testChangePasswordWrongExistingPassword() throws Exception { + User user = new User(); + String currentPassword = RandomStringUtils.random(60); + user.setPassword(passwordEncoder.encode(currentPassword)); + user.setLogin("change-password-wrong-existing-password"); + user.setEmail("change-password-wrong-existing-password@example.com"); + userRepository.saveAndFlush(user); + + restAccountMockMvc + .perform( + post("/api/account/change-password") + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(new PasswordChangeDTO("1" + currentPassword, "new password"))) + ) + .andExpect(status().isBadRequest()); + + User updatedUser = userRepository.findOneByLogin("change-password-wrong-existing-password").orElse(null); + assertThat(passwordEncoder.matches("new password", updatedUser.getPassword())).isFalse(); + assertThat(passwordEncoder.matches(currentPassword, updatedUser.getPassword())).isTrue(); + } + + @Test + @Transactional + @WithMockUser("change-password") + public void testChangePassword() throws Exception { + User user = new User(); + String currentPassword = RandomStringUtils.random(60); + user.setPassword(passwordEncoder.encode(currentPassword)); + user.setLogin("change-password"); + user.setEmail("change-password@example.com"); + userRepository.saveAndFlush(user); + + restAccountMockMvc + .perform( + post("/api/account/change-password") + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(new PasswordChangeDTO(currentPassword, "new password"))) + ) + .andExpect(status().isOk()); + + User updatedUser = userRepository.findOneByLogin("change-password").orElse(null); + assertThat(passwordEncoder.matches("new password", updatedUser.getPassword())).isTrue(); + } + + @Test + @Transactional + @WithMockUser("change-password-too-small") + public void testChangePasswordTooSmall() throws Exception { + User user = new User(); + String currentPassword = RandomStringUtils.random(60); + user.setPassword(passwordEncoder.encode(currentPassword)); + user.setLogin("change-password-too-small"); + user.setEmail("change-password-too-small@example.com"); + userRepository.saveAndFlush(user); + + String newPassword = RandomStringUtils.random(ManagedUserVM.PASSWORD_MIN_LENGTH - 1); + + restAccountMockMvc + .perform( + post("/api/account/change-password") + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(new PasswordChangeDTO(currentPassword, newPassword))) + ) + .andExpect(status().isBadRequest()); + + User updatedUser = userRepository.findOneByLogin("change-password-too-small").orElse(null); + assertThat(updatedUser.getPassword()).isEqualTo(user.getPassword()); + } + + @Test + @Transactional + @WithMockUser("change-password-too-long") + public void testChangePasswordTooLong() throws Exception { + User user = new User(); + String currentPassword = RandomStringUtils.random(60); + user.setPassword(passwordEncoder.encode(currentPassword)); + user.setLogin("change-password-too-long"); + user.setEmail("change-password-too-long@example.com"); + userRepository.saveAndFlush(user); + + String newPassword = RandomStringUtils.random(ManagedUserVM.PASSWORD_MAX_LENGTH + 1); + + restAccountMockMvc + .perform( + post("/api/account/change-password") + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(new PasswordChangeDTO(currentPassword, newPassword))) + ) + .andExpect(status().isBadRequest()); + + User updatedUser = userRepository.findOneByLogin("change-password-too-long").orElse(null); + assertThat(updatedUser.getPassword()).isEqualTo(user.getPassword()); + } + + @Test + @Transactional + @WithMockUser("change-password-empty") + public void testChangePasswordEmpty() throws Exception { + User user = new User(); + String currentPassword = RandomStringUtils.random(60); + user.setPassword(passwordEncoder.encode(currentPassword)); + user.setLogin("change-password-empty"); + user.setEmail("change-password-empty@example.com"); + userRepository.saveAndFlush(user); + + restAccountMockMvc + .perform( + post("/api/account/change-password") + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(new PasswordChangeDTO(currentPassword, ""))) + ) + .andExpect(status().isBadRequest()); + + User updatedUser = userRepository.findOneByLogin("change-password-empty").orElse(null); + assertThat(updatedUser.getPassword()).isEqualTo(user.getPassword()); + } + + @Test + @Transactional + public void testRequestPasswordReset() throws Exception { + User user = new User(); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + user.setLogin("password-reset"); + user.setEmail("password-reset@example.com"); + userRepository.saveAndFlush(user); + + restAccountMockMvc.perform(post("/api/account/reset-password/init").content("password-reset@example.com")).andExpect(status().isOk()); + } + + @Test + @Transactional + public void testRequestPasswordResetUpperCaseEmail() throws Exception { + User user = new User(); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + user.setLogin("password-reset-upper-case"); + user.setEmail("password-reset-upper-case@example.com"); + userRepository.saveAndFlush(user); + + restAccountMockMvc + .perform(post("/api/account/reset-password/init").content("password-reset-upper-case@EXAMPLE.COM")) + .andExpect(status().isOk()); + } + + @Test + public void testRequestPasswordResetWrongEmail() throws Exception { + restAccountMockMvc + .perform(post("/api/account/reset-password/init").content("password-reset-wrong-email@example.com")) + .andExpect(status().isOk()); + } + + @Test + @Transactional + public void testFinishPasswordReset() throws Exception { + User user = new User(); + user.setPassword(RandomStringUtils.random(60)); + user.setLogin("finish-password-reset"); + user.setEmail("finish-password-reset@example.com"); + user.setResetDate(Instant.now().plusSeconds(60)); + user.setResetKey("reset key"); + userRepository.saveAndFlush(user); + + KeyAndPasswordVM keyAndPassword = new KeyAndPasswordVM(); + keyAndPassword.setKey(user.getResetKey()); + keyAndPassword.setNewPassword("new password"); + + restAccountMockMvc + .perform( + post("/api/account/reset-password/finish") + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(keyAndPassword)) + ) + .andExpect(status().isOk()); + + User updatedUser = userRepository.findOneByLogin(user.getLogin()).orElse(null); + assertThat(passwordEncoder.matches(keyAndPassword.getNewPassword(), updatedUser.getPassword())).isTrue(); + } + + @Test + @Transactional + public void testFinishPasswordResetTooSmall() throws Exception { + User user = new User(); + user.setPassword(RandomStringUtils.random(60)); + user.setLogin("finish-password-reset-too-small"); + user.setEmail("finish-password-reset-too-small@example.com"); + user.setResetDate(Instant.now().plusSeconds(60)); + user.setResetKey("reset key too small"); + userRepository.saveAndFlush(user); + + KeyAndPasswordVM keyAndPassword = new KeyAndPasswordVM(); + keyAndPassword.setKey(user.getResetKey()); + keyAndPassword.setNewPassword("foo"); + + restAccountMockMvc + .perform( + post("/api/account/reset-password/finish") + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(keyAndPassword)) + ) + .andExpect(status().isBadRequest()); + + User updatedUser = userRepository.findOneByLogin(user.getLogin()).orElse(null); + assertThat(passwordEncoder.matches(keyAndPassword.getNewPassword(), updatedUser.getPassword())).isFalse(); + } + + @Test + @Transactional + public void testFinishPasswordResetWrongKey() throws Exception { + KeyAndPasswordVM keyAndPassword = new KeyAndPasswordVM(); + keyAndPassword.setKey("wrong reset key"); + keyAndPassword.setNewPassword("new password"); + + restAccountMockMvc + .perform( + post("/api/account/reset-password/finish") + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(keyAndPassword)) + ) + .andExpect(status().isInternalServerError()); + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/web/rest/AuditResourceIT.java b/borestop/src/test/java/com/ippon/borestop/web/rest/AuditResourceIT.java new file mode 100644 index 0000000000000000000000000000000000000000..ceccde2c73d1b0201478ae3488b9ce7ef2bbdcd7 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/web/rest/AuditResourceIT.java @@ -0,0 +1,135 @@ +package com.ippon.borestop.web.rest; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import com.ippon.borestop.BorestopApp; +import com.ippon.borestop.domain.PersistentAuditEvent; +import com.ippon.borestop.repository.PersistenceAuditEventRepository; +import com.ippon.borestop.security.AuthoritiesConstants; +import java.time.Instant; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.web.PageableHandlerMethodArgumentResolver; +import org.springframework.http.MediaType; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for the {@link AuditResource} REST controller. + */ +@AutoConfigureMockMvc +@WithMockUser(authorities = AuthoritiesConstants.ADMIN) +@SpringBootTest(classes = BorestopApp.class) +@Transactional +public class AuditResourceIT { + private static final String SAMPLE_PRINCIPAL = "SAMPLE_PRINCIPAL"; + private static final String SAMPLE_TYPE = "SAMPLE_TYPE"; + private static final Instant SAMPLE_TIMESTAMP = Instant.parse("2015-08-04T10:11:30Z"); + private static final long SECONDS_PER_DAY = 60 * 60 * 24; + + @Autowired + private PersistenceAuditEventRepository auditEventRepository; + + private PersistentAuditEvent auditEvent; + + @Autowired + private MockMvc restAuditMockMvc; + + @BeforeEach + public void initTest() { + auditEventRepository.deleteAll(); + auditEvent = new PersistentAuditEvent(); + auditEvent.setAuditEventType(SAMPLE_TYPE); + auditEvent.setPrincipal(SAMPLE_PRINCIPAL); + auditEvent.setAuditEventDate(SAMPLE_TIMESTAMP); + } + + @Test + public void getAllAudits() throws Exception { + // Initialize the database + auditEventRepository.save(auditEvent); + + // Get all the audits + restAuditMockMvc + .perform(get("/management/audits")) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].principal").value(hasItem(SAMPLE_PRINCIPAL))); + } + + @Test + public void getAudit() throws Exception { + // Initialize the database + auditEventRepository.save(auditEvent); + + // Get the audit + restAuditMockMvc + .perform(get("/management/audits/{id}", auditEvent.getId())) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.principal").value(SAMPLE_PRINCIPAL)); + } + + @Test + public void getAuditsByDate() throws Exception { + // Initialize the database + auditEventRepository.save(auditEvent); + + // Generate dates for selecting audits by date, making sure the period will contain the audit + String fromDate = SAMPLE_TIMESTAMP.minusSeconds(SECONDS_PER_DAY).toString().substring(0, 10); + String toDate = SAMPLE_TIMESTAMP.plusSeconds(SECONDS_PER_DAY).toString().substring(0, 10); + + // Get the audit + restAuditMockMvc + .perform(get("/management/audits?fromDate=" + fromDate + "&toDate=" + toDate)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].principal").value(hasItem(SAMPLE_PRINCIPAL))); + } + + @Test + public void getNonExistingAuditsByDate() throws Exception { + // Initialize the database + auditEventRepository.save(auditEvent); + + // Generate dates for selecting audits by date, making sure the period will not contain the sample audit + String fromDate = SAMPLE_TIMESTAMP.minusSeconds(2 * SECONDS_PER_DAY).toString().substring(0, 10); + String toDate = SAMPLE_TIMESTAMP.minusSeconds(SECONDS_PER_DAY).toString().substring(0, 10); + + // Query audits but expect no results + restAuditMockMvc + .perform(get("/management/audits?fromDate=" + fromDate + "&toDate=" + toDate)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(header().string("X-Total-Count", "0")); + } + + @Test + public void getNonExistingAudit() throws Exception { + // Get the audit + restAuditMockMvc.perform(get("/management/audits/{id}", Long.MAX_VALUE)).andExpect(status().isNotFound()); + } + + @Test + public void testPersistentAuditEventEquals() throws Exception { + TestUtil.equalsVerifier(PersistentAuditEvent.class); + PersistentAuditEvent auditEvent1 = new PersistentAuditEvent(); + auditEvent1.setId(1L); + PersistentAuditEvent auditEvent2 = new PersistentAuditEvent(); + auditEvent2.setId(auditEvent1.getId()); + assertThat(auditEvent1).isEqualTo(auditEvent2); + auditEvent2.setId(2L); + assertThat(auditEvent1).isNotEqualTo(auditEvent2); + auditEvent1.setId(null); + assertThat(auditEvent1).isNotEqualTo(auditEvent2); + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/web/rest/ClientForwardControllerTest.java b/borestop/src/test/java/com/ippon/borestop/web/rest/ClientForwardControllerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..d27571d218648139d71999752077adf0e857bf70 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/web/rest/ClientForwardControllerTest.java @@ -0,0 +1,57 @@ +package com.ippon.borestop.web.rest; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.forwardedUrl; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * Unit tests for the {@link ClientForwardController} REST controller. + */ +public class ClientForwardControllerTest { + private MockMvc restMockMvc; + + @BeforeEach + public void setup() { + ClientForwardController clientForwardController = new ClientForwardController(); + this.restMockMvc = MockMvcBuilders.standaloneSetup(clientForwardController, new TestController()).build(); + } + + @Test + public void getBackendEndpoint() throws Exception { + restMockMvc + .perform(get("/test")) + .andExpect(status().isOk()) + .andExpect(content().contentTypeCompatibleWith(MediaType.TEXT_PLAIN_VALUE)) + .andExpect(content().string("test")); + } + + @Test + public void getClientEndpoint() throws Exception { + ResultActions perform = restMockMvc.perform(get("/non-existant-mapping")); + perform.andExpect(status().isOk()).andExpect(forwardedUrl("/")); + } + + @Test + public void getNestedClientEndpoint() throws Exception { + restMockMvc.perform(get("/admin/user-management")).andExpect(status().isOk()).andExpect(forwardedUrl("/")); + } + + @RestController + public static class TestController { + + @RequestMapping(value = "/test") + public String test() { + return "test"; + } + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/web/rest/TestUtil.java b/borestop/src/test/java/com/ippon/borestop/web/rest/TestUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..da4ba50532e620022223f92389c9df9ce8c09223 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/web/rest/TestUtil.java @@ -0,0 +1,154 @@ +package com.ippon.borestop.web.rest; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import java.io.IOException; +import java.time.ZonedDateTime; +import java.time.format.DateTimeParseException; +import java.util.List; +import javax.persistence.EntityManager; +import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; +import org.hamcrest.Description; +import org.hamcrest.TypeSafeDiagnosingMatcher; +import org.springframework.format.datetime.standard.DateTimeFormatterRegistrar; +import org.springframework.format.support.DefaultFormattingConversionService; +import org.springframework.format.support.FormattingConversionService; + +/** + * Utility class for testing REST controllers. + */ +public final class TestUtil { + private static final ObjectMapper mapper = createObjectMapper(); + + private static ObjectMapper createObjectMapper() { + ObjectMapper mapper = new ObjectMapper(); + mapper.configure(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS, false); + mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY); + mapper.registerModule(new JavaTimeModule()); + return mapper; + } + + /** + * Convert an object to JSON byte array. + * + * @param object the object to convert. + * @return the JSON byte array. + * @throws IOException + */ + public static byte[] convertObjectToJsonBytes(Object object) throws IOException { + return mapper.writeValueAsBytes(object); + } + + /** + * Create a byte array with a specific size filled with specified data. + * + * @param size the size of the byte array. + * @param data the data to put in the byte array. + * @return the JSON byte array. + */ + public static byte[] createByteArray(int size, String data) { + byte[] byteArray = new byte[size]; + for (int i = 0; i < size; i++) { + byteArray[i] = Byte.parseByte(data, 2); + } + return byteArray; + } + + /** + * A matcher that tests that the examined string represents the same instant as the reference datetime. + */ + public static class ZonedDateTimeMatcher extends TypeSafeDiagnosingMatcher<String> { + private final ZonedDateTime date; + + public ZonedDateTimeMatcher(ZonedDateTime date) { + this.date = date; + } + + @Override + protected boolean matchesSafely(String item, Description mismatchDescription) { + try { + if (!date.isEqual(ZonedDateTime.parse(item))) { + mismatchDescription.appendText("was ").appendValue(item); + return false; + } + return true; + } catch (DateTimeParseException e) { + mismatchDescription.appendText("was ").appendValue(item).appendText(", which could not be parsed as a ZonedDateTime"); + return false; + } + } + + @Override + public void describeTo(Description description) { + description.appendText("a String representing the same Instant as ").appendValue(date); + } + } + + /** + * Creates a matcher that matches when the examined string represents the same instant as the reference datetime. + * + * @param date the reference datetime against which the examined string is checked. + */ + public static ZonedDateTimeMatcher sameInstant(ZonedDateTime date) { + return new ZonedDateTimeMatcher(date); + } + + /** + * Verifies the equals/hashcode contract on the domain object. + */ + public static <T> void equalsVerifier(Class<T> clazz) throws Exception { + T domainObject1 = clazz.getConstructor().newInstance(); + assertThat(domainObject1.toString()).isNotNull(); + assertThat(domainObject1).isEqualTo(domainObject1); + assertThat(domainObject1.hashCode()).isEqualTo(domainObject1.hashCode()); + + // Test with an instance of another class + Object testOtherObject = new Object(); + assertThat(domainObject1).isNotEqualTo(testOtherObject); + assertThat(domainObject1).isNotEqualTo(null); + + // Test with an instance of the same class + T domainObject2 = clazz.getConstructor().newInstance(); + assertThat(domainObject1).isNotEqualTo(domainObject2); + + // HashCodes are equals because the objects are not persisted yet + assertThat(domainObject1.hashCode()).isEqualTo(domainObject2.hashCode()); + } + + /** + * Create a {@link FormattingConversionService} which use ISO date format, instead of the localized one. + * @return the {@link FormattingConversionService}. + */ + public static FormattingConversionService createFormattingConversionService() { + DefaultFormattingConversionService dfcs = new DefaultFormattingConversionService(); + DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar(); + registrar.setUseIsoFormat(true); + registrar.registerFormatters(dfcs); + return dfcs; + } + + /** + * Makes a an executes a query to the EntityManager finding all stored objects. + * @param <T> The type of objects to be searched + * @param em The instance of the EntityManager + * @param clss The class type to be searched + * @return A list of all found objects + */ + public static <T> List<T> findAll(EntityManager em, Class<T> clss) { + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery<T> cq = cb.createQuery(clss); + Root<T> rootEntry = cq.from(clss); + CriteriaQuery<T> all = cq.select(rootEntry); + TypedQuery<T> allQuery = em.createQuery(all); + return allQuery.getResultList(); + } + + private TestUtil() {} +} diff --git a/borestop/src/test/java/com/ippon/borestop/web/rest/UserJWTControllerIT.java b/borestop/src/test/java/com/ippon/borestop/web/rest/UserJWTControllerIT.java new file mode 100644 index 0000000000000000000000000000000000000000..f7f1d3ff68fc06d40b938f719b34d34bf2d026fe --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/web/rest/UserJWTControllerIT.java @@ -0,0 +1,99 @@ +package com.ippon.borestop.web.rest; + +import static org.hamcrest.Matchers.emptyString; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.nullValue; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.ippon.borestop.BorestopApp; +import com.ippon.borestop.domain.User; +import com.ippon.borestop.repository.UserRepository; +import com.ippon.borestop.web.rest.vm.LoginVM; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for the {@link UserJWTController} REST controller. + */ +@AutoConfigureMockMvc +@SpringBootTest(classes = BorestopApp.class) +public class UserJWTControllerIT { + @Autowired + private UserRepository userRepository; + + @Autowired + private PasswordEncoder passwordEncoder; + + @Autowired + private MockMvc mockMvc; + + @Test + @Transactional + public void testAuthorize() throws Exception { + User user = new User(); + user.setLogin("user-jwt-controller"); + user.setEmail("user-jwt-controller@example.com"); + user.setActivated(true); + user.setPassword(passwordEncoder.encode("test")); + + userRepository.saveAndFlush(user); + + LoginVM login = new LoginVM(); + login.setUsername("user-jwt-controller"); + login.setPassword("test"); + mockMvc + .perform(post("/api/authenticate").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(login))) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.id_token").isString()) + .andExpect(jsonPath("$.id_token").isNotEmpty()) + .andExpect(header().string("Authorization", not(nullValue()))) + .andExpect(header().string("Authorization", not(is(emptyString())))); + } + + @Test + @Transactional + public void testAuthorizeWithRememberMe() throws Exception { + User user = new User(); + user.setLogin("user-jwt-controller-remember-me"); + user.setEmail("user-jwt-controller-remember-me@example.com"); + user.setActivated(true); + user.setPassword(passwordEncoder.encode("test")); + + userRepository.saveAndFlush(user); + + LoginVM login = new LoginVM(); + login.setUsername("user-jwt-controller-remember-me"); + login.setPassword("test"); + login.setRememberMe(true); + mockMvc + .perform(post("/api/authenticate").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(login))) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.id_token").isString()) + .andExpect(jsonPath("$.id_token").isNotEmpty()) + .andExpect(header().string("Authorization", not(nullValue()))) + .andExpect(header().string("Authorization", not(is(emptyString())))); + } + + @Test + public void testAuthorizeFails() throws Exception { + LoginVM login = new LoginVM(); + login.setUsername("wrong-user"); + login.setPassword("wrong password"); + mockMvc + .perform(post("/api/authenticate").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(login))) + .andExpect(status().isUnauthorized()) + .andExpect(jsonPath("$.id_token").doesNotExist()) + .andExpect(header().doesNotExist("Authorization")); + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/web/rest/UserResourceIT.java b/borestop/src/test/java/com/ippon/borestop/web/rest/UserResourceIT.java new file mode 100644 index 0000000000000000000000000000000000000000..53f246aedc66a89f9102c39883c401f14660169e --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/web/rest/UserResourceIT.java @@ -0,0 +1,562 @@ +package com.ippon.borestop.web.rest; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.hasItems; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import com.ippon.borestop.BorestopApp; +import com.ippon.borestop.domain.Authority; +import com.ippon.borestop.domain.User; +import com.ippon.borestop.repository.UserRepository; +import com.ippon.borestop.security.AuthoritiesConstants; +import com.ippon.borestop.service.dto.UserDTO; +import com.ippon.borestop.service.mapper.UserMapper; +import com.ippon.borestop.web.rest.vm.ManagedUserVM; +import java.time.Instant; +import java.util.*; +import java.util.function.Consumer; +import javax.persistence.EntityManager; +import org.apache.commons.lang3.RandomStringUtils; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for the {@link UserResource} REST controller. + */ +@AutoConfigureMockMvc +@WithMockUser(authorities = AuthoritiesConstants.ADMIN) +@SpringBootTest(classes = BorestopApp.class) +public class UserResourceIT { + private static final String DEFAULT_LOGIN = "johndoe"; + private static final String UPDATED_LOGIN = "jhipster"; + + private static final Long DEFAULT_ID = 1L; + + private static final String DEFAULT_PASSWORD = "passjohndoe"; + private static final String UPDATED_PASSWORD = "passjhipster"; + + private static final String DEFAULT_EMAIL = "johndoe@localhost"; + private static final String UPDATED_EMAIL = "jhipster@localhost"; + + private static final String DEFAULT_FIRSTNAME = "john"; + private static final String UPDATED_FIRSTNAME = "jhipsterFirstName"; + + private static final String DEFAULT_LASTNAME = "doe"; + private static final String UPDATED_LASTNAME = "jhipsterLastName"; + + private static final String DEFAULT_IMAGEURL = "http://placehold.it/50x50"; + private static final String UPDATED_IMAGEURL = "http://placehold.it/40x40"; + + private static final String DEFAULT_LANGKEY = "en"; + private static final String UPDATED_LANGKEY = "fr"; + + @Autowired + private UserRepository userRepository; + + @Autowired + private UserMapper userMapper; + + @Autowired + private EntityManager em; + + @Autowired + private MockMvc restUserMockMvc; + + private User user; + + /** + * Create a User. + * + * This is a static method, as tests for other entities might also need it, + * if they test an entity which has a required relationship to the User entity. + */ + public static User createEntity(EntityManager em) { + User user = new User(); + user.setLogin(DEFAULT_LOGIN + RandomStringUtils.randomAlphabetic(5)); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + user.setEmail(RandomStringUtils.randomAlphabetic(5) + DEFAULT_EMAIL); + user.setFirstName(DEFAULT_FIRSTNAME); + user.setLastName(DEFAULT_LASTNAME); + user.setImageUrl(DEFAULT_IMAGEURL); + user.setLangKey(DEFAULT_LANGKEY); + return user; + } + + @BeforeEach + public void initTest() { + user = createEntity(em); + user.setLogin(DEFAULT_LOGIN); + user.setEmail(DEFAULT_EMAIL); + } + + @Test + @Transactional + public void createUser() throws Exception { + int databaseSizeBeforeCreate = userRepository.findAll().size(); + + // Create the User + ManagedUserVM managedUserVM = new ManagedUserVM(); + managedUserVM.setLogin(DEFAULT_LOGIN); + managedUserVM.setPassword(DEFAULT_PASSWORD); + managedUserVM.setFirstName(DEFAULT_FIRSTNAME); + managedUserVM.setLastName(DEFAULT_LASTNAME); + managedUserVM.setEmail(DEFAULT_EMAIL); + managedUserVM.setActivated(true); + managedUserVM.setImageUrl(DEFAULT_IMAGEURL); + managedUserVM.setLangKey(DEFAULT_LANGKEY); + managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restUserMockMvc + .perform(post("/api/users").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(managedUserVM))) + .andExpect(status().isCreated()); + + // Validate the User in the database + assertPersistedUsers( + users -> { + assertThat(users).hasSize(databaseSizeBeforeCreate + 1); + User testUser = users.get(users.size() - 1); + assertThat(testUser.getLogin()).isEqualTo(DEFAULT_LOGIN); + assertThat(testUser.getFirstName()).isEqualTo(DEFAULT_FIRSTNAME); + assertThat(testUser.getLastName()).isEqualTo(DEFAULT_LASTNAME); + assertThat(testUser.getEmail()).isEqualTo(DEFAULT_EMAIL); + assertThat(testUser.getImageUrl()).isEqualTo(DEFAULT_IMAGEURL); + assertThat(testUser.getLangKey()).isEqualTo(DEFAULT_LANGKEY); + } + ); + } + + @Test + @Transactional + public void createUserWithExistingId() throws Exception { + int databaseSizeBeforeCreate = userRepository.findAll().size(); + + ManagedUserVM managedUserVM = new ManagedUserVM(); + managedUserVM.setId(1L); + managedUserVM.setLogin(DEFAULT_LOGIN); + managedUserVM.setPassword(DEFAULT_PASSWORD); + managedUserVM.setFirstName(DEFAULT_FIRSTNAME); + managedUserVM.setLastName(DEFAULT_LASTNAME); + managedUserVM.setEmail(DEFAULT_EMAIL); + managedUserVM.setActivated(true); + managedUserVM.setImageUrl(DEFAULT_IMAGEURL); + managedUserVM.setLangKey(DEFAULT_LANGKEY); + managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + // An entity with an existing ID cannot be created, so this API call must fail + restUserMockMvc + .perform(post("/api/users").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(managedUserVM))) + .andExpect(status().isBadRequest()); + + // Validate the User in the database + assertPersistedUsers(users -> assertThat(users).hasSize(databaseSizeBeforeCreate)); + } + + @Test + @Transactional + public void createUserWithExistingLogin() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + int databaseSizeBeforeCreate = userRepository.findAll().size(); + + ManagedUserVM managedUserVM = new ManagedUserVM(); + managedUserVM.setLogin(DEFAULT_LOGIN); // this login should already be used + managedUserVM.setPassword(DEFAULT_PASSWORD); + managedUserVM.setFirstName(DEFAULT_FIRSTNAME); + managedUserVM.setLastName(DEFAULT_LASTNAME); + managedUserVM.setEmail("anothermail@localhost"); + managedUserVM.setActivated(true); + managedUserVM.setImageUrl(DEFAULT_IMAGEURL); + managedUserVM.setLangKey(DEFAULT_LANGKEY); + managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + // Create the User + restUserMockMvc + .perform(post("/api/users").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(managedUserVM))) + .andExpect(status().isBadRequest()); + + // Validate the User in the database + assertPersistedUsers(users -> assertThat(users).hasSize(databaseSizeBeforeCreate)); + } + + @Test + @Transactional + public void createUserWithExistingEmail() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + int databaseSizeBeforeCreate = userRepository.findAll().size(); + + ManagedUserVM managedUserVM = new ManagedUserVM(); + managedUserVM.setLogin("anotherlogin"); + managedUserVM.setPassword(DEFAULT_PASSWORD); + managedUserVM.setFirstName(DEFAULT_FIRSTNAME); + managedUserVM.setLastName(DEFAULT_LASTNAME); + managedUserVM.setEmail(DEFAULT_EMAIL); // this email should already be used + managedUserVM.setActivated(true); + managedUserVM.setImageUrl(DEFAULT_IMAGEURL); + managedUserVM.setLangKey(DEFAULT_LANGKEY); + managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + // Create the User + restUserMockMvc + .perform(post("/api/users").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(managedUserVM))) + .andExpect(status().isBadRequest()); + + // Validate the User in the database + assertPersistedUsers(users -> assertThat(users).hasSize(databaseSizeBeforeCreate)); + } + + @Test + @Transactional + public void getAllUsers() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + + // Get all the users + restUserMockMvc + .perform(get("/api/users?sort=id,desc").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].login").value(hasItem(DEFAULT_LOGIN))) + .andExpect(jsonPath("$.[*].firstName").value(hasItem(DEFAULT_FIRSTNAME))) + .andExpect(jsonPath("$.[*].lastName").value(hasItem(DEFAULT_LASTNAME))) + .andExpect(jsonPath("$.[*].email").value(hasItem(DEFAULT_EMAIL))) + .andExpect(jsonPath("$.[*].imageUrl").value(hasItem(DEFAULT_IMAGEURL))) + .andExpect(jsonPath("$.[*].langKey").value(hasItem(DEFAULT_LANGKEY))); + } + + @Test + @Transactional + public void getUser() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + + // Get the user + restUserMockMvc + .perform(get("/api/users/{login}", user.getLogin())) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.login").value(user.getLogin())) + .andExpect(jsonPath("$.firstName").value(DEFAULT_FIRSTNAME)) + .andExpect(jsonPath("$.lastName").value(DEFAULT_LASTNAME)) + .andExpect(jsonPath("$.email").value(DEFAULT_EMAIL)) + .andExpect(jsonPath("$.imageUrl").value(DEFAULT_IMAGEURL)) + .andExpect(jsonPath("$.langKey").value(DEFAULT_LANGKEY)); + } + + @Test + @Transactional + public void getNonExistingUser() throws Exception { + restUserMockMvc.perform(get("/api/users/unknown")).andExpect(status().isNotFound()); + } + + @Test + @Transactional + public void updateUser() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + int databaseSizeBeforeUpdate = userRepository.findAll().size(); + + // Update the user + User updatedUser = userRepository.findById(user.getId()).get(); + + ManagedUserVM managedUserVM = new ManagedUserVM(); + managedUserVM.setId(updatedUser.getId()); + managedUserVM.setLogin(updatedUser.getLogin()); + managedUserVM.setPassword(UPDATED_PASSWORD); + managedUserVM.setFirstName(UPDATED_FIRSTNAME); + managedUserVM.setLastName(UPDATED_LASTNAME); + managedUserVM.setEmail(UPDATED_EMAIL); + managedUserVM.setActivated(updatedUser.getActivated()); + managedUserVM.setImageUrl(UPDATED_IMAGEURL); + managedUserVM.setLangKey(UPDATED_LANGKEY); + managedUserVM.setCreatedBy(updatedUser.getCreatedBy()); + managedUserVM.setCreatedDate(updatedUser.getCreatedDate()); + managedUserVM.setLastModifiedBy(updatedUser.getLastModifiedBy()); + managedUserVM.setLastModifiedDate(updatedUser.getLastModifiedDate()); + managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restUserMockMvc + .perform(put("/api/users").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(managedUserVM))) + .andExpect(status().isOk()); + + // Validate the User in the database + assertPersistedUsers( + users -> { + assertThat(users).hasSize(databaseSizeBeforeUpdate); + User testUser = users.get(users.size() - 1); + assertThat(testUser.getFirstName()).isEqualTo(UPDATED_FIRSTNAME); + assertThat(testUser.getLastName()).isEqualTo(UPDATED_LASTNAME); + assertThat(testUser.getEmail()).isEqualTo(UPDATED_EMAIL); + assertThat(testUser.getImageUrl()).isEqualTo(UPDATED_IMAGEURL); + assertThat(testUser.getLangKey()).isEqualTo(UPDATED_LANGKEY); + } + ); + } + + @Test + @Transactional + public void updateUserLogin() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + int databaseSizeBeforeUpdate = userRepository.findAll().size(); + + // Update the user + User updatedUser = userRepository.findById(user.getId()).get(); + + ManagedUserVM managedUserVM = new ManagedUserVM(); + managedUserVM.setId(updatedUser.getId()); + managedUserVM.setLogin(UPDATED_LOGIN); + managedUserVM.setPassword(UPDATED_PASSWORD); + managedUserVM.setFirstName(UPDATED_FIRSTNAME); + managedUserVM.setLastName(UPDATED_LASTNAME); + managedUserVM.setEmail(UPDATED_EMAIL); + managedUserVM.setActivated(updatedUser.getActivated()); + managedUserVM.setImageUrl(UPDATED_IMAGEURL); + managedUserVM.setLangKey(UPDATED_LANGKEY); + managedUserVM.setCreatedBy(updatedUser.getCreatedBy()); + managedUserVM.setCreatedDate(updatedUser.getCreatedDate()); + managedUserVM.setLastModifiedBy(updatedUser.getLastModifiedBy()); + managedUserVM.setLastModifiedDate(updatedUser.getLastModifiedDate()); + managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restUserMockMvc + .perform(put("/api/users").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(managedUserVM))) + .andExpect(status().isOk()); + + // Validate the User in the database + assertPersistedUsers( + users -> { + assertThat(users).hasSize(databaseSizeBeforeUpdate); + User testUser = users.get(users.size() - 1); + assertThat(testUser.getLogin()).isEqualTo(UPDATED_LOGIN); + assertThat(testUser.getFirstName()).isEqualTo(UPDATED_FIRSTNAME); + assertThat(testUser.getLastName()).isEqualTo(UPDATED_LASTNAME); + assertThat(testUser.getEmail()).isEqualTo(UPDATED_EMAIL); + assertThat(testUser.getImageUrl()).isEqualTo(UPDATED_IMAGEURL); + assertThat(testUser.getLangKey()).isEqualTo(UPDATED_LANGKEY); + } + ); + } + + @Test + @Transactional + public void updateUserExistingEmail() throws Exception { + // Initialize the database with 2 users + userRepository.saveAndFlush(user); + + User anotherUser = new User(); + anotherUser.setLogin("jhipster"); + anotherUser.setPassword(RandomStringUtils.random(60)); + anotherUser.setActivated(true); + anotherUser.setEmail("jhipster@localhost"); + anotherUser.setFirstName("java"); + anotherUser.setLastName("hipster"); + anotherUser.setImageUrl(""); + anotherUser.setLangKey("en"); + userRepository.saveAndFlush(anotherUser); + + // Update the user + User updatedUser = userRepository.findById(user.getId()).get(); + + ManagedUserVM managedUserVM = new ManagedUserVM(); + managedUserVM.setId(updatedUser.getId()); + managedUserVM.setLogin(updatedUser.getLogin()); + managedUserVM.setPassword(updatedUser.getPassword()); + managedUserVM.setFirstName(updatedUser.getFirstName()); + managedUserVM.setLastName(updatedUser.getLastName()); + managedUserVM.setEmail("jhipster@localhost"); // this email should already be used by anotherUser + managedUserVM.setActivated(updatedUser.getActivated()); + managedUserVM.setImageUrl(updatedUser.getImageUrl()); + managedUserVM.setLangKey(updatedUser.getLangKey()); + managedUserVM.setCreatedBy(updatedUser.getCreatedBy()); + managedUserVM.setCreatedDate(updatedUser.getCreatedDate()); + managedUserVM.setLastModifiedBy(updatedUser.getLastModifiedBy()); + managedUserVM.setLastModifiedDate(updatedUser.getLastModifiedDate()); + managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restUserMockMvc + .perform(put("/api/users").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(managedUserVM))) + .andExpect(status().isBadRequest()); + } + + @Test + @Transactional + public void updateUserExistingLogin() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + + User anotherUser = new User(); + anotherUser.setLogin("jhipster"); + anotherUser.setPassword(RandomStringUtils.random(60)); + anotherUser.setActivated(true); + anotherUser.setEmail("jhipster@localhost"); + anotherUser.setFirstName("java"); + anotherUser.setLastName("hipster"); + anotherUser.setImageUrl(""); + anotherUser.setLangKey("en"); + userRepository.saveAndFlush(anotherUser); + + // Update the user + User updatedUser = userRepository.findById(user.getId()).get(); + + ManagedUserVM managedUserVM = new ManagedUserVM(); + managedUserVM.setId(updatedUser.getId()); + managedUserVM.setLogin("jhipster"); // this login should already be used by anotherUser + managedUserVM.setPassword(updatedUser.getPassword()); + managedUserVM.setFirstName(updatedUser.getFirstName()); + managedUserVM.setLastName(updatedUser.getLastName()); + managedUserVM.setEmail(updatedUser.getEmail()); + managedUserVM.setActivated(updatedUser.getActivated()); + managedUserVM.setImageUrl(updatedUser.getImageUrl()); + managedUserVM.setLangKey(updatedUser.getLangKey()); + managedUserVM.setCreatedBy(updatedUser.getCreatedBy()); + managedUserVM.setCreatedDate(updatedUser.getCreatedDate()); + managedUserVM.setLastModifiedBy(updatedUser.getLastModifiedBy()); + managedUserVM.setLastModifiedDate(updatedUser.getLastModifiedDate()); + managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restUserMockMvc + .perform(put("/api/users").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(managedUserVM))) + .andExpect(status().isBadRequest()); + } + + @Test + @Transactional + public void deleteUser() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + int databaseSizeBeforeDelete = userRepository.findAll().size(); + + // Delete the user + restUserMockMvc + .perform(delete("/api/users/{login}", user.getLogin()).accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isNoContent()); + + // Validate the database is empty + assertPersistedUsers(users -> assertThat(users).hasSize(databaseSizeBeforeDelete - 1)); + } + + @Test + @Transactional + public void getAllAuthorities() throws Exception { + restUserMockMvc + .perform(get("/api/users/authorities").accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$").isArray()) + .andExpect(jsonPath("$").value(hasItems(AuthoritiesConstants.USER, AuthoritiesConstants.ADMIN))); + } + + @Test + public void testUserEquals() throws Exception { + TestUtil.equalsVerifier(User.class); + User user1 = new User(); + user1.setId(1L); + User user2 = new User(); + user2.setId(user1.getId()); + assertThat(user1).isEqualTo(user2); + user2.setId(2L); + assertThat(user1).isNotEqualTo(user2); + user1.setId(null); + assertThat(user1).isNotEqualTo(user2); + } + + @Test + public void testUserDTOtoUser() { + UserDTO userDTO = new UserDTO(); + userDTO.setId(DEFAULT_ID); + userDTO.setLogin(DEFAULT_LOGIN); + userDTO.setFirstName(DEFAULT_FIRSTNAME); + userDTO.setLastName(DEFAULT_LASTNAME); + userDTO.setEmail(DEFAULT_EMAIL); + userDTO.setActivated(true); + userDTO.setImageUrl(DEFAULT_IMAGEURL); + userDTO.setLangKey(DEFAULT_LANGKEY); + userDTO.setCreatedBy(DEFAULT_LOGIN); + userDTO.setLastModifiedBy(DEFAULT_LOGIN); + userDTO.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + User user = userMapper.userDTOToUser(userDTO); + assertThat(user.getId()).isEqualTo(DEFAULT_ID); + assertThat(user.getLogin()).isEqualTo(DEFAULT_LOGIN); + assertThat(user.getFirstName()).isEqualTo(DEFAULT_FIRSTNAME); + assertThat(user.getLastName()).isEqualTo(DEFAULT_LASTNAME); + assertThat(user.getEmail()).isEqualTo(DEFAULT_EMAIL); + assertThat(user.getActivated()).isEqualTo(true); + assertThat(user.getImageUrl()).isEqualTo(DEFAULT_IMAGEURL); + assertThat(user.getLangKey()).isEqualTo(DEFAULT_LANGKEY); + assertThat(user.getCreatedBy()).isNull(); + assertThat(user.getCreatedDate()).isNotNull(); + assertThat(user.getLastModifiedBy()).isNull(); + assertThat(user.getLastModifiedDate()).isNotNull(); + assertThat(user.getAuthorities()).extracting("name").containsExactly(AuthoritiesConstants.USER); + } + + @Test + public void testUserToUserDTO() { + user.setId(DEFAULT_ID); + user.setCreatedBy(DEFAULT_LOGIN); + user.setCreatedDate(Instant.now()); + user.setLastModifiedBy(DEFAULT_LOGIN); + user.setLastModifiedDate(Instant.now()); + Set<Authority> authorities = new HashSet<>(); + Authority authority = new Authority(); + authority.setName(AuthoritiesConstants.USER); + authorities.add(authority); + user.setAuthorities(authorities); + + UserDTO userDTO = userMapper.userToUserDTO(user); + + assertThat(userDTO.getId()).isEqualTo(DEFAULT_ID); + assertThat(userDTO.getLogin()).isEqualTo(DEFAULT_LOGIN); + assertThat(userDTO.getFirstName()).isEqualTo(DEFAULT_FIRSTNAME); + assertThat(userDTO.getLastName()).isEqualTo(DEFAULT_LASTNAME); + assertThat(userDTO.getEmail()).isEqualTo(DEFAULT_EMAIL); + assertThat(userDTO.isActivated()).isEqualTo(true); + assertThat(userDTO.getImageUrl()).isEqualTo(DEFAULT_IMAGEURL); + assertThat(userDTO.getLangKey()).isEqualTo(DEFAULT_LANGKEY); + assertThat(userDTO.getCreatedBy()).isEqualTo(DEFAULT_LOGIN); + assertThat(userDTO.getCreatedDate()).isEqualTo(user.getCreatedDate()); + assertThat(userDTO.getLastModifiedBy()).isEqualTo(DEFAULT_LOGIN); + assertThat(userDTO.getLastModifiedDate()).isEqualTo(user.getLastModifiedDate()); + assertThat(userDTO.getAuthorities()).containsExactly(AuthoritiesConstants.USER); + assertThat(userDTO.toString()).isNotNull(); + } + + @Test + public void testAuthorityEquals() { + Authority authorityA = new Authority(); + assertThat(authorityA).isEqualTo(authorityA); + assertThat(authorityA).isNotEqualTo(null); + assertThat(authorityA).isNotEqualTo(new Object()); + assertThat(authorityA.hashCode()).isEqualTo(0); + assertThat(authorityA.toString()).isNotNull(); + + Authority authorityB = new Authority(); + assertThat(authorityA).isEqualTo(authorityB); + + authorityB.setName(AuthoritiesConstants.ADMIN); + assertThat(authorityA).isNotEqualTo(authorityB); + + authorityA.setName(AuthoritiesConstants.USER); + assertThat(authorityA).isNotEqualTo(authorityB); + + authorityB.setName(AuthoritiesConstants.USER); + assertThat(authorityA).isEqualTo(authorityB); + assertThat(authorityA.hashCode()).isEqualTo(authorityB.hashCode()); + } + + private void assertPersistedUsers(Consumer<List<User>> userAssertion) { + userAssertion.accept(userRepository.findAll()); + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/web/rest/WithUnauthenticatedMockUser.java b/borestop/src/test/java/com/ippon/borestop/web/rest/WithUnauthenticatedMockUser.java new file mode 100644 index 0000000000000000000000000000000000000000..35024207a98f7c36e001bbb9a6a5a49e1e6bf6ab --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/web/rest/WithUnauthenticatedMockUser.java @@ -0,0 +1,23 @@ +package com.ippon.borestop.web.rest; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.test.context.support.WithSecurityContext; +import org.springframework.security.test.context.support.WithSecurityContextFactory; + +@Target({ ElementType.METHOD, ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@WithSecurityContext(factory = WithUnauthenticatedMockUser.Factory.class) +public @interface WithUnauthenticatedMockUser { + class Factory implements WithSecurityContextFactory<WithUnauthenticatedMockUser> { + + @Override + public SecurityContext createSecurityContext(WithUnauthenticatedMockUser annotation) { + return SecurityContextHolder.createEmptyContext(); + } + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/web/rest/errors/ExceptionTranslatorIT.java b/borestop/src/test/java/com/ippon/borestop/web/rest/errors/ExceptionTranslatorIT.java new file mode 100644 index 0000000000000000000000000000000000000000..853322e552dcbe143868997903b20f7df54ca2cc --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/web/rest/errors/ExceptionTranslatorIT.java @@ -0,0 +1,117 @@ +package com.ippon.borestop.web.rest.errors; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.ippon.borestop.BorestopApp; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; + +/** + * Integration tests {@link ExceptionTranslator} controller advice. + */ +@WithMockUser +@AutoConfigureMockMvc +@SpringBootTest(classes = BorestopApp.class) +public class ExceptionTranslatorIT { + @Autowired + private MockMvc mockMvc; + + @Test + public void testConcurrencyFailure() throws Exception { + mockMvc + .perform(get("/api/exception-translator-test/concurrency-failure")) + .andExpect(status().isConflict()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value(ErrorConstants.ERR_CONCURRENCY_FAILURE)); + } + + @Test + public void testMethodArgumentNotValid() throws Exception { + mockMvc + .perform(post("/api/exception-translator-test/method-argument").content("{}").contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value(ErrorConstants.ERR_VALIDATION)) + .andExpect(jsonPath("$.fieldErrors.[0].objectName").value("test")) + .andExpect(jsonPath("$.fieldErrors.[0].field").value("test")) + .andExpect(jsonPath("$.fieldErrors.[0].message").value("NotNull")); + } + + @Test + public void testMissingServletRequestPartException() throws Exception { + mockMvc + .perform(get("/api/exception-translator-test/missing-servlet-request-part")) + .andExpect(status().isBadRequest()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value("error.http.400")); + } + + @Test + public void testMissingServletRequestParameterException() throws Exception { + mockMvc + .perform(get("/api/exception-translator-test/missing-servlet-request-parameter")) + .andExpect(status().isBadRequest()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value("error.http.400")); + } + + @Test + public void testAccessDenied() throws Exception { + mockMvc + .perform(get("/api/exception-translator-test/access-denied")) + .andExpect(status().isForbidden()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value("error.http.403")) + .andExpect(jsonPath("$.detail").value("test access denied!")); + } + + @Test + public void testUnauthorized() throws Exception { + mockMvc + .perform(get("/api/exception-translator-test/unauthorized")) + .andExpect(status().isUnauthorized()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value("error.http.401")) + .andExpect(jsonPath("$.path").value("/api/exception-translator-test/unauthorized")) + .andExpect(jsonPath("$.detail").value("test authentication failed!")); + } + + @Test + public void testMethodNotSupported() throws Exception { + mockMvc + .perform(post("/api/exception-translator-test/access-denied")) + .andExpect(status().isMethodNotAllowed()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value("error.http.405")) + .andExpect(jsonPath("$.detail").value("Request method 'POST' not supported")); + } + + @Test + public void testExceptionWithResponseStatus() throws Exception { + mockMvc + .perform(get("/api/exception-translator-test/response-status")) + .andExpect(status().isBadRequest()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value("error.http.400")) + .andExpect(jsonPath("$.title").value("test response status")); + } + + @Test + public void testInternalServerError() throws Exception { + mockMvc + .perform(get("/api/exception-translator-test/internal-server-error")) + .andExpect(status().isInternalServerError()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value("error.http.500")) + .andExpect(jsonPath("$.title").value("Internal Server Error")); + } +} diff --git a/borestop/src/test/java/com/ippon/borestop/web/rest/errors/ExceptionTranslatorTestController.java b/borestop/src/test/java/com/ippon/borestop/web/rest/errors/ExceptionTranslatorTestController.java new file mode 100644 index 0000000000000000000000000000000000000000..c3effbbedc6d8f84a1a2802656123dd03a1971c4 --- /dev/null +++ b/borestop/src/test/java/com/ippon/borestop/web/rest/errors/ExceptionTranslatorTestController.java @@ -0,0 +1,65 @@ +package com.ippon.borestop.web.rest.errors; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import org.springframework.dao.ConcurrencyFailureException; +import org.springframework.http.HttpStatus; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/exception-translator-test") +public class ExceptionTranslatorTestController { + + @GetMapping("/concurrency-failure") + public void concurrencyFailure() { + throw new ConcurrencyFailureException("test concurrency failure"); + } + + @PostMapping("/method-argument") + public void methodArgument(@Valid @RequestBody TestDTO testDTO) {} + + @GetMapping("/missing-servlet-request-part") + public void missingServletRequestPartException(@RequestPart String part) {} + + @GetMapping("/missing-servlet-request-parameter") + public void missingServletRequestParameterException(@RequestParam String param) {} + + @GetMapping("/access-denied") + public void accessdenied() { + throw new AccessDeniedException("test access denied!"); + } + + @GetMapping("/unauthorized") + public void unauthorized() { + throw new BadCredentialsException("test authentication failed!"); + } + + @GetMapping("/response-status") + public void exceptionWithResponseStatus() { + throw new TestResponseStatusException(); + } + + @GetMapping("/internal-server-error") + public void internalServerError() { + throw new RuntimeException(); + } + + public static class TestDTO { + @NotNull + private String test; + + public String getTest() { + return test; + } + + public void setTest(String test) { + this.test = test; + } + } + + @ResponseStatus(value = HttpStatus.BAD_REQUEST, reason = "test response status") + @SuppressWarnings("serial") + public static class TestResponseStatusException extends RuntimeException {} +} diff --git a/borestop/src/test/javascript/jest-global-mocks.ts b/borestop/src/test/javascript/jest-global-mocks.ts new file mode 100644 index 0000000000000000000000000000000000000000..a802d1b3774cc9b6d7f3b2d6b92a53486e34c38d --- /dev/null +++ b/borestop/src/test/javascript/jest-global-mocks.ts @@ -0,0 +1,3 @@ +Object.defineProperty(window, 'getComputedStyle', { + value: () => ['-webkit-appearance'] +}); diff --git a/borestop/src/test/javascript/jest.conf.js b/borestop/src/test/javascript/jest.conf.js new file mode 100644 index 0000000000000000000000000000000000000000..17293489ba23bc1c822e864484063711a9995ea9 --- /dev/null +++ b/borestop/src/test/javascript/jest.conf.js @@ -0,0 +1,53 @@ +const tsconfig = require('../../../tsconfig.base.json'); + +module.exports = { + preset: 'jest-preset-angular', + setupFiles: ['jest-date-mock'], + setupFilesAfterEnv: ['<rootDir>/src/test/javascript/jest.ts'], + cacheDirectory: '<rootDir>/target/jest-cache', + coverageDirectory: '<rootDir>/target/test-results/', + globals: { + 'ts-jest': { + stringifyContentPathRegex: '\\.html$', + tsConfig: '<rootDir>/tsconfig.base.json', + astTransformers: ['jest-preset-angular/build/InlineFilesTransformer', 'jest-preset-angular/build/StripStylesTransformer'] + } + }, + coveragePathIgnorePatterns: ['<rootDir>/src/test/javascript'], + moduleNameMapper: mapTypescriptAliasToJestAlias(), + reporters: ['default', ['jest-junit', { outputDirectory: './target/test-results/', outputName: 'TESTS-results-jest.xml' }]], + testResultsProcessor: 'jest-sonar-reporter', + transformIgnorePatterns: ['node_modules/'], + testMatch: ['<rootDir>/src/test/javascript/spec/**/@(*.)@(spec.ts)'], + rootDir: '../../../', + testURL: 'http://localhost/' +}; + +function mapTypescriptAliasToJestAlias(alias = {}) { + const jestAliases = { ...alias }; + if (!tsconfig.compilerOptions.paths) { + return jestAliases; + } + Object.entries(tsconfig.compilerOptions.paths) + .filter(([key, value]) => { + // use Typescript alias in Jest only if this has value + if (value.length) { + return true; + } + return false; + }) + .map(([key, value]) => { + // if Typescript alias ends with /* then in Jest: + // - alias key must end with /(.*) + // - alias value must end with /$1 + const regexToReplace = /(.*)\/\*$/; + const aliasKey = key.replace(regexToReplace, '$1/(.*)'); + const aliasValue = value[0].replace(regexToReplace, '$1/$$1'); + return [aliasKey, `<rootDir>/${aliasValue}`]; + }) + .reduce((aliases, [key, value]) => { + aliases[key] = value; + return aliases; + }, jestAliases); + return jestAliases; +} diff --git a/borestop/src/test/javascript/jest.ts b/borestop/src/test/javascript/jest.ts new file mode 100644 index 0000000000000000000000000000000000000000..904329f538cb2dcbe482f21f47c834e35d4ef957 --- /dev/null +++ b/borestop/src/test/javascript/jest.ts @@ -0,0 +1,2 @@ +import 'jest-preset-angular'; +import './jest-global-mocks'; diff --git a/borestop/src/test/javascript/spec/app/account/activate/activate.component.spec.ts b/borestop/src/test/javascript/spec/app/account/activate/activate.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..89ef80ecbfa3c5ca33fb59b8758d4a12826cc8bd --- /dev/null +++ b/borestop/src/test/javascript/spec/app/account/activate/activate.component.spec.ts @@ -0,0 +1,72 @@ +import { TestBed, async, tick, fakeAsync, inject } from '@angular/core/testing'; +import { ActivatedRoute } from '@angular/router'; +import { of, throwError } from 'rxjs'; + +import { BorestopTestModule } from '../../../test.module'; +import { MockActivatedRoute } from '../../../helpers/mock-route.service'; +import { ActivateService } from 'app/account/activate/activate.service'; +import { ActivateComponent } from 'app/account/activate/activate.component'; + +describe('Component Tests', () => { + describe('ActivateComponent', () => { + let comp: ActivateComponent; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [ActivateComponent], + providers: [ + { + provide: ActivatedRoute, + useValue: new MockActivatedRoute({ key: 'ABC123' }) + } + ] + }) + .overrideTemplate(ActivateComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + const fixture = TestBed.createComponent(ActivateComponent); + comp = fixture.componentInstance; + }); + + it('calls activate.get with the key from params', inject( + [ActivateService], + fakeAsync((service: ActivateService) => { + spyOn(service, 'get').and.returnValue(of()); + + comp.ngOnInit(); + tick(); + + expect(service.get).toHaveBeenCalledWith('ABC123'); + }) + )); + + it('should set set success to true upon successful activation', inject( + [ActivateService], + fakeAsync((service: ActivateService) => { + spyOn(service, 'get').and.returnValue(of({})); + + comp.ngOnInit(); + tick(); + + expect(comp.error).toBe(false); + expect(comp.success).toBe(true); + }) + )); + + it('should set set error to true upon activation failure', inject( + [ActivateService], + fakeAsync((service: ActivateService) => { + spyOn(service, 'get').and.returnValue(throwError('ERROR')); + + comp.ngOnInit(); + tick(); + + expect(comp.error).toBe(true); + expect(comp.success).toBe(false); + }) + )); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/account/password-reset/finish/password-reset-finish.component.spec.ts b/borestop/src/test/javascript/spec/app/account/password-reset/finish/password-reset-finish.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..005fe2db21c443aa298aed10bdc688ac5ade1e90 --- /dev/null +++ b/borestop/src/test/javascript/spec/app/account/password-reset/finish/password-reset-finish.component.spec.ts @@ -0,0 +1,102 @@ +import { ElementRef } from '@angular/core'; +import { ComponentFixture, TestBed, inject, tick, fakeAsync } from '@angular/core/testing'; +import { FormBuilder } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { of, throwError } from 'rxjs'; + +import { BorestopTestModule } from '../../../../test.module'; +import { PasswordResetFinishComponent } from 'app/account/password-reset/finish/password-reset-finish.component'; +import { PasswordResetFinishService } from 'app/account/password-reset/finish/password-reset-finish.service'; +import { MockActivatedRoute } from '../../../../helpers/mock-route.service'; + +describe('Component Tests', () => { + describe('PasswordResetFinishComponent', () => { + let fixture: ComponentFixture<PasswordResetFinishComponent>; + let comp: PasswordResetFinishComponent; + + beforeEach(() => { + fixture = TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [PasswordResetFinishComponent], + providers: [ + FormBuilder, + { + provide: ActivatedRoute, + useValue: new MockActivatedRoute({ key: 'XYZPDQ' }) + } + ] + }) + .overrideTemplate(PasswordResetFinishComponent, '') + .createComponent(PasswordResetFinishComponent); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(PasswordResetFinishComponent); + comp = fixture.componentInstance; + comp.ngOnInit(); + }); + + it('should define its initial state', () => { + expect(comp.initialized).toBe(true); + expect(comp.key).toEqual('XYZPDQ'); + }); + + it('sets focus after the view has been initialized', () => { + const node = { + focus(): void {} + }; + comp.newPassword = new ElementRef(node); + spyOn(node, 'focus'); + + comp.ngAfterViewInit(); + + expect(node.focus).toHaveBeenCalled(); + }); + + it('should ensure the two passwords entered match', () => { + comp.passwordForm.patchValue({ + newPassword: 'password', + confirmPassword: 'non-matching' + }); + + comp.finishReset(); + + expect(comp.doNotMatch).toBe(true); + }); + + it('should update success to true after resetting password', inject( + [PasswordResetFinishService], + fakeAsync((service: PasswordResetFinishService) => { + spyOn(service, 'save').and.returnValue(of({})); + comp.passwordForm.patchValue({ + newPassword: 'password', + confirmPassword: 'password' + }); + + comp.finishReset(); + tick(); + + expect(service.save).toHaveBeenCalledWith('XYZPDQ', 'password'); + expect(comp.success).toBe(true); + }) + )); + + it('should notify of generic error', inject( + [PasswordResetFinishService], + fakeAsync((service: PasswordResetFinishService) => { + spyOn(service, 'save').and.returnValue(throwError('ERROR')); + comp.passwordForm.patchValue({ + newPassword: 'password', + confirmPassword: 'password' + }); + + comp.finishReset(); + tick(); + + expect(service.save).toHaveBeenCalledWith('XYZPDQ', 'password'); + expect(comp.success).toBe(false); + expect(comp.error).toBe(true); + }) + )); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/account/password-reset/init/password-reset-init.component.spec.ts b/borestop/src/test/javascript/spec/app/account/password-reset/init/password-reset-init.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..abbe693c1fd0eebc978ab9de29347e4d0ad1d0ad --- /dev/null +++ b/borestop/src/test/javascript/spec/app/account/password-reset/init/password-reset-init.component.spec.ts @@ -0,0 +1,66 @@ +import { ElementRef } from '@angular/core'; +import { ComponentFixture, TestBed, inject } from '@angular/core/testing'; +import { FormBuilder } from '@angular/forms'; +import { of, throwError } from 'rxjs'; + +import { BorestopTestModule } from '../../../../test.module'; +import { PasswordResetInitComponent } from 'app/account/password-reset/init/password-reset-init.component'; +import { PasswordResetInitService } from 'app/account/password-reset/init/password-reset-init.service'; + +describe('Component Tests', () => { + describe('PasswordResetInitComponent', () => { + let fixture: ComponentFixture<PasswordResetInitComponent>; + let comp: PasswordResetInitComponent; + + beforeEach(() => { + fixture = TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [PasswordResetInitComponent], + providers: [FormBuilder] + }) + .overrideTemplate(PasswordResetInitComponent, '') + .createComponent(PasswordResetInitComponent); + comp = fixture.componentInstance; + }); + + it('sets focus after the view has been initialized', () => { + const node = { + focus(): void {} + }; + comp.email = new ElementRef(node); + spyOn(node, 'focus'); + + comp.ngAfterViewInit(); + + expect(node.focus).toHaveBeenCalled(); + }); + + it('notifies of success upon successful requestReset', inject([PasswordResetInitService], (service: PasswordResetInitService) => { + spyOn(service, 'save').and.returnValue(of({})); + comp.resetRequestForm.patchValue({ + email: 'user@domain.com' + }); + + comp.requestReset(); + + expect(service.save).toHaveBeenCalledWith('user@domain.com'); + expect(comp.success).toBe(true); + })); + + it('no notification of success upon error response', inject([PasswordResetInitService], (service: PasswordResetInitService) => { + spyOn(service, 'save').and.returnValue( + throwError({ + status: 503, + data: 'something else' + }) + ); + comp.resetRequestForm.patchValue({ + email: 'user@domain.com' + }); + comp.requestReset(); + + expect(service.save).toHaveBeenCalledWith('user@domain.com'); + expect(comp.success).toBe(false); + })); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/account/password/password-strength-bar.component.spec.ts b/borestop/src/test/javascript/spec/app/account/password/password-strength-bar.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..ff1297e12b4cbc3ff65f457e99562abf23d42ca7 --- /dev/null +++ b/borestop/src/test/javascript/spec/app/account/password/password-strength-bar.component.spec.ts @@ -0,0 +1,48 @@ +import { ComponentFixture, TestBed, async } from '@angular/core/testing'; + +import { PasswordStrengthBarComponent } from 'app/account/password/password-strength-bar.component'; + +describe('Component Tests', () => { + describe('PasswordStrengthBarComponent', () => { + let comp: PasswordStrengthBarComponent; + let fixture: ComponentFixture<PasswordStrengthBarComponent>; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [PasswordStrengthBarComponent] + }) + .overrideTemplate(PasswordStrengthBarComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PasswordStrengthBarComponent); + comp = fixture.componentInstance; + }); + + describe('PasswordStrengthBarComponents', () => { + it('should initialize with default values', () => { + expect(comp.measureStrength('')).toBe(0); + expect(comp.colors).toEqual(['#F00', '#F90', '#FF0', '#9F0', '#0F0']); + expect(comp.getColor(0).idx).toBe(1); + expect(comp.getColor(0).color).toBe(comp.colors[0]); + }); + + it('should increase strength upon password value change', () => { + expect(comp.measureStrength('')).toBe(0); + expect(comp.measureStrength('aa')).toBeGreaterThanOrEqual(comp.measureStrength('')); + expect(comp.measureStrength('aa^6')).toBeGreaterThanOrEqual(comp.measureStrength('aa')); + expect(comp.measureStrength('Aa090(**)')).toBeGreaterThanOrEqual(comp.measureStrength('aa^6')); + expect(comp.measureStrength('Aa090(**)+-07365')).toBeGreaterThanOrEqual(comp.measureStrength('Aa090(**)')); + }); + + it('should change the color based on strength', () => { + expect(comp.getColor(0).color).toBe(comp.colors[0]); + expect(comp.getColor(11).color).toBe(comp.colors[1]); + expect(comp.getColor(22).color).toBe(comp.colors[2]); + expect(comp.getColor(33).color).toBe(comp.colors[3]); + expect(comp.getColor(44).color).toBe(comp.colors[4]); + }); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/account/password/password.component.spec.ts b/borestop/src/test/javascript/spec/app/account/password/password.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..f367d7883a368bcdb3d05926ad0e3df74a8540f3 --- /dev/null +++ b/borestop/src/test/javascript/spec/app/account/password/password.component.spec.ts @@ -0,0 +1,102 @@ +import { ComponentFixture, TestBed, async } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { FormBuilder } from '@angular/forms'; +import { of, throwError } from 'rxjs'; + +import { BorestopTestModule } from '../../../test.module'; +import { PasswordComponent } from 'app/account/password/password.component'; +import { PasswordService } from 'app/account/password/password.service'; + +describe('Component Tests', () => { + describe('PasswordComponent', () => { + let comp: PasswordComponent; + let fixture: ComponentFixture<PasswordComponent>; + let service: PasswordService; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [PasswordComponent], + providers: [FormBuilder] + }) + .overrideTemplate(PasswordComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PasswordComponent); + comp = fixture.componentInstance; + service = fixture.debugElement.injector.get(PasswordService); + }); + + it('should show error if passwords do not match', () => { + // GIVEN + comp.passwordForm.patchValue({ + newPassword: 'password1', + confirmPassword: 'password2' + }); + // WHEN + comp.changePassword(); + // THEN + expect(comp.doNotMatch).toBe(true); + expect(comp.error).toBe(false); + expect(comp.success).toBe(false); + }); + + it('should call Auth.changePassword when passwords match', () => { + // GIVEN + const passwordValues = { + currentPassword: 'oldPassword', + newPassword: 'myPassword' + }; + + spyOn(service, 'save').and.returnValue(of(new HttpResponse({ body: true }))); + + comp.passwordForm.patchValue({ + currentPassword: passwordValues.currentPassword, + newPassword: passwordValues.newPassword, + confirmPassword: passwordValues.newPassword + }); + + // WHEN + comp.changePassword(); + + // THEN + expect(service.save).toHaveBeenCalledWith(passwordValues.newPassword, passwordValues.currentPassword); + }); + + it('should set success to true upon success', () => { + // GIVEN + spyOn(service, 'save').and.returnValue(of(new HttpResponse({ body: true }))); + comp.passwordForm.patchValue({ + newPassword: 'myPassword', + confirmPassword: 'myPassword' + }); + + // WHEN + comp.changePassword(); + + // THEN + expect(comp.doNotMatch).toBe(false); + expect(comp.error).toBe(false); + expect(comp.success).toBe(true); + }); + + it('should notify of error if change password fails', () => { + // GIVEN + spyOn(service, 'save').and.returnValue(throwError('ERROR')); + comp.passwordForm.patchValue({ + newPassword: 'myPassword', + confirmPassword: 'myPassword' + }); + + // WHEN + comp.changePassword(); + + // THEN + expect(comp.doNotMatch).toBe(false); + expect(comp.success).toBe(false); + expect(comp.error).toBe(true); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/account/register/register.component.spec.ts b/borestop/src/test/javascript/spec/app/account/register/register.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..da8c51fc2e9dd8f882c11b8e080555e7b24d068b --- /dev/null +++ b/borestop/src/test/javascript/spec/app/account/register/register.component.spec.ts @@ -0,0 +1,137 @@ +import { ComponentFixture, TestBed, async, inject, tick, fakeAsync } from '@angular/core/testing'; +import { FormBuilder } from '@angular/forms'; +import { of, throwError } from 'rxjs'; +import { JhiLanguageService } from 'ng-jhipster'; + +import { MockLanguageService } from '../../../helpers/mock-language.service'; +import { BorestopTestModule } from '../../../test.module'; +import { EMAIL_ALREADY_USED_TYPE, LOGIN_ALREADY_USED_TYPE } from 'app/shared/constants/error.constants'; +import { RegisterService } from 'app/account/register/register.service'; +import { RegisterComponent } from 'app/account/register/register.component'; + +describe('Component Tests', () => { + describe('RegisterComponent', () => { + let fixture: ComponentFixture<RegisterComponent>; + let comp: RegisterComponent; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [RegisterComponent], + providers: [FormBuilder] + }) + .overrideTemplate(RegisterComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(RegisterComponent); + comp = fixture.componentInstance; + }); + + it('should ensure the two passwords entered match', () => { + comp.registerForm.patchValue({ + password: 'password', + confirmPassword: 'non-matching' + }); + + comp.register(); + + expect(comp.doNotMatch).toBe(true); + }); + + it('should update success to true after creating an account', inject( + [RegisterService, JhiLanguageService], + fakeAsync((service: RegisterService, mockTranslate: MockLanguageService) => { + spyOn(service, 'save').and.returnValue(of({})); + comp.registerForm.patchValue({ + password: 'password', + confirmPassword: 'password' + }); + + comp.register(); + tick(); + + expect(service.save).toHaveBeenCalledWith({ + email: '', + password: 'password', + login: '', + langKey: 'en' + }); + expect(comp.success).toBe(true); + expect(mockTranslate.getCurrentLanguageSpy).toHaveBeenCalled(); + expect(comp.errorUserExists).toBe(false); + expect(comp.errorEmailExists).toBe(false); + expect(comp.error).toBe(false); + }) + )); + + it('should notify of user existence upon 400/login already in use', inject( + [RegisterService], + fakeAsync((service: RegisterService) => { + spyOn(service, 'save').and.returnValue( + throwError({ + status: 400, + error: { type: LOGIN_ALREADY_USED_TYPE } + }) + ); + comp.registerForm.patchValue({ + password: 'password', + confirmPassword: 'password' + }); + + comp.register(); + tick(); + + expect(comp.errorUserExists).toBe(true); + expect(comp.errorEmailExists).toBe(false); + expect(comp.error).toBe(false); + }) + )); + + it('should notify of email existence upon 400/email address already in use', inject( + [RegisterService], + fakeAsync((service: RegisterService) => { + spyOn(service, 'save').and.returnValue( + throwError({ + status: 400, + error: { type: EMAIL_ALREADY_USED_TYPE } + }) + ); + comp.registerForm.patchValue({ + password: 'password', + confirmPassword: 'password' + }); + + comp.register(); + tick(); + + expect(comp.errorEmailExists).toBe(true); + expect(comp.errorUserExists).toBe(false); + expect(comp.error).toBe(false); + }) + )); + + it('should notify of generic error', inject( + [RegisterService], + fakeAsync((service: RegisterService) => { + spyOn(service, 'save').and.returnValue( + throwError({ + status: 503 + }) + ); + comp.registerForm.patchValue({ + password: 'password', + confirmPassword: 'password' + }); + + comp.register(); + tick(); + + expect(comp.errorUserExists).toBe(false); + expect(comp.errorEmailExists).toBe(false); + expect(comp.error).toBe(true); + }) + )); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/account/settings/settings.component.spec.ts b/borestop/src/test/javascript/spec/app/account/settings/settings.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..a6dd52ac92a4a2f5d68121471ad44c838204cee0 --- /dev/null +++ b/borestop/src/test/javascript/spec/app/account/settings/settings.component.spec.ts @@ -0,0 +1,89 @@ +import { ComponentFixture, TestBed, async } from '@angular/core/testing'; +import { FormBuilder } from '@angular/forms'; +import { throwError, of } from 'rxjs'; + +import { BorestopTestModule } from '../../../test.module'; +import { AccountService } from 'app/core/auth/account.service'; +import { Account } from 'app/core/user/account.model'; +import { SettingsComponent } from 'app/account/settings/settings.component'; +import { MockAccountService } from '../../../helpers/mock-account.service'; + +describe('Component Tests', () => { + describe('SettingsComponent', () => { + let comp: SettingsComponent; + let fixture: ComponentFixture<SettingsComponent>; + let mockAuth: MockAccountService; + const accountValues: Account = { + firstName: 'John', + lastName: 'Doe', + activated: true, + email: 'john.doe@mail.com', + langKey: 'en', + login: 'john', + authorities: [], + imageUrl: '' + }; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [SettingsComponent], + providers: [FormBuilder] + }) + .overrideTemplate(SettingsComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SettingsComponent); + comp = fixture.componentInstance; + mockAuth = TestBed.get(AccountService); + mockAuth.setIdentityResponse(accountValues); + }); + + it('should send the current identity upon save', () => { + // GIVEN + mockAuth.saveSpy.and.returnValue(of({})); + const settingsFormValues = { + firstName: 'John', + lastName: 'Doe', + email: 'john.doe@mail.com', + langKey: 'en' + }; + + // WHEN + comp.ngOnInit(); + comp.save(); + + // THEN + expect(mockAuth.identitySpy).toHaveBeenCalled(); + expect(mockAuth.saveSpy).toHaveBeenCalledWith(accountValues); + expect(mockAuth.authenticateSpy).toHaveBeenCalledWith(accountValues); + expect(comp.settingsForm.value).toEqual(settingsFormValues); + }); + + it('should notify of success upon successful save', () => { + // GIVEN + mockAuth.saveSpy.and.returnValue(of({})); + + // WHEN + comp.ngOnInit(); + comp.save(); + + // THEN + expect(comp.success).toBe(true); + }); + + it('should notify of error upon failed save', () => { + // GIVEN + mockAuth.saveSpy.and.returnValue(throwError('ERROR')); + + // WHEN + comp.ngOnInit(); + comp.save(); + + // THEN + expect(comp.success).toBe(false); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/admin/audits/audits.component.spec.ts b/borestop/src/test/javascript/spec/app/admin/audits/audits.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..56197a0a60d17534016a79a49dbae7e26914abff --- /dev/null +++ b/borestop/src/test/javascript/spec/app/admin/audits/audits.component.spec.ts @@ -0,0 +1,204 @@ +import { ComponentFixture, TestBed, async } from '@angular/core/testing'; +import { HttpHeaders, HttpResponse } from '@angular/common/http'; +import { Router, ActivatedRoute } from '@angular/router'; +import { of } from 'rxjs'; +import { advanceTo } from 'jest-date-mock'; + +import { BorestopTestModule } from '../../../test.module'; +import { AuditsComponent } from 'app/admin/audits/audits.component'; +import { AuditsService } from 'app/admin/audits/audits.service'; +import { Audit } from 'app/admin/audits/audit.model'; +import { ITEMS_PER_PAGE } from 'app/shared/constants/pagination.constants'; +import { MockRouter, MockActivatedRoute } from '../../../helpers/mock-route.service'; + +function build2DigitsDatePart(datePart: number): string { + return `0${datePart}`.slice(-2); +} + +function getDate(isToday = true): string { + let date: Date = new Date(); + if (isToday) { + // Today + 1 day - needed if the current day must be included + date.setDate(date.getDate() + 1); + } else { + // get last month + if (date.getMonth() === 0) { + date = new Date(date.getFullYear() - 1, 11, date.getDate()); + } else { + date = new Date(date.getFullYear(), date.getMonth() - 1, date.getDate()); + } + } + const monthString = build2DigitsDatePart(date.getMonth() + 1); + const dateString = build2DigitsDatePart(date.getDate()); + return `${date.getFullYear()}-${monthString}-${dateString}`; +} + +describe('Component Tests', () => { + describe('AuditsComponent', () => { + let comp: AuditsComponent; + let fixture: ComponentFixture<AuditsComponent>; + let service: AuditsService; + let mockRouter: MockRouter; + let mockActivatedRoute: MockActivatedRoute; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [AuditsComponent], + providers: [AuditsService] + }) + .overrideTemplate(AuditsComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AuditsComponent); + comp = fixture.componentInstance; + service = fixture.debugElement.injector.get(AuditsService); + mockRouter = TestBed.get(Router); + mockActivatedRoute = TestBed.get(ActivatedRoute); + }); + + describe('today function', () => { + it('should set toDate to current date', () => { + comp.ngOnInit(); + expect(comp.toDate).toBe(getDate()); + }); + + it('if current day is last day of month then should set toDate to first day of next month', () => { + advanceTo(new Date(2019, 0, 31, 0, 0, 0)); + comp.ngOnInit(); + expect(comp.toDate).toBe('2019-02-01'); + }); + + it('if current day is not last day of month then should set toDate to next day of current month', () => { + advanceTo(new Date(2019, 0, 27, 0, 0, 0)); + comp.ngOnInit(); + expect(comp.toDate).toBe('2019-01-28'); + }); + }); + + describe('previousMonth function', () => { + it('should set fromDate to previous month', () => { + comp.ngOnInit(); + expect(comp.fromDate).toBe(getDate(false)); + }); + + it('if current month is January then should set fromDate to previous year last month', () => { + advanceTo(new Date(2019, 0, 20, 0, 0, 0)); + comp.ngOnInit(); + expect(comp.fromDate).toBe('2018-12-20'); + }); + + it('if current month is not January then should set fromDate to current year previous month', () => { + advanceTo(new Date(2019, 1, 20, 0, 0, 0)); + comp.ngOnInit(); + expect(comp.fromDate).toBe('2019-01-20'); + }); + }); + + describe('By default, on init', () => { + it('should set all default values correctly', () => { + fixture.detectChanges(); + expect(comp.toDate).toBe(getDate()); + expect(comp.fromDate).toBe(getDate(false)); + expect(comp.itemsPerPage).toBe(ITEMS_PER_PAGE); + expect(comp.page).toBe(1); + expect(comp.ascending).toBe(false); + expect(comp.predicate).toBe('id'); + }); + }); + + describe('OnInit', () => { + it('Should call load all on init', () => { + // GIVEN + const headers = new HttpHeaders().append('X-Total-Count', '1'); + const audit = new Audit({ remoteAddress: '127.0.0.1', sessionId: '123' }, 'user', '20140101', 'AUTHENTICATION_SUCCESS'); + spyOn(service, 'query').and.returnValue( + of( + new HttpResponse({ + body: [audit], + headers + }) + ) + ); + + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.query).toHaveBeenCalledTimes(1); + expect(comp.audits && comp.audits[0]).toEqual(jasmine.objectContaining(audit)); + expect(comp.totalItems).toBe(1); + }); + }); + + describe('Create sort object', () => { + beforeEach(() => { + spyOn(service, 'query').and.returnValue(of(new HttpResponse({ body: null }))); + }); + + it('Should sort only by id asc', () => { + // GIVEN + mockActivatedRoute.setParameters({ + sort: 'id,desc' + }); + + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.query).toBeCalledWith( + expect.objectContaining({ + sort: ['id,desc'] + }) + ); + }); + + it('Should sort by timestamp asc then by id', () => { + // GIVEN + mockActivatedRoute.setParameters({ + sort: 'timestamp,asc' + }); + + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.query).toBeCalledWith( + expect.objectContaining({ + sort: ['timestamp,asc', 'id'] + }) + ); + }); + }); + + describe('transition', () => { + it('Should not query data if fromDate and toDate are empty', () => { + // GIVEN + comp.toDate = ''; + comp.fromDate = ''; + + // WHEN + comp.transition(); + + // THEN + expect(comp.canLoad()).toBe(false); + expect(mockRouter.navigateSpy).not.toBeCalled(); + }); + + it('Should query data if fromDate and toDate are not empty', () => { + // GIVEN + comp.toDate = getDate(); + comp.fromDate = getDate(false); + + // WHEN + comp.transition(); + + // THEN + expect(comp.canLoad()).toBe(true); + expect(mockRouter.navigateSpy).toBeCalled(); + }); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/admin/audits/audits.service.spec.ts b/borestop/src/test/javascript/spec/app/admin/audits/audits.service.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..d5073e2c24f1c1507d3e8b689b5c99a347de3ccc --- /dev/null +++ b/borestop/src/test/javascript/spec/app/admin/audits/audits.service.spec.ts @@ -0,0 +1,70 @@ +import { TestBed } from '@angular/core/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; +import { HttpResponse, HttpErrorResponse } from '@angular/common/http'; + +import { AuditsService, AuditsQuery } from 'app/admin/audits/audits.service'; +import { Audit } from 'app/admin/audits/audit.model'; +import { SERVER_API_URL } from 'app/app.constants'; + +describe('Service Tests', () => { + describe('Audits Service', () => { + let service: AuditsService; + let httpMock: HttpTestingController; + const fakeRequest: AuditsQuery = { page: 0, size: 0, sort: [], fromDate: '', toDate: '' }; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule] + }); + + service = TestBed.get(AuditsService); + httpMock = TestBed.get(HttpTestingController); + }); + + afterEach(() => { + httpMock.verify(); + }); + + describe('Service methods', () => { + it('should call correct URL', () => { + service.query(fakeRequest).subscribe(); + + const req = httpMock.expectOne({ method: 'GET' }); + const resourceUrl = SERVER_API_URL + 'management/audits'; + expect(req.request.url).toEqual(resourceUrl); + }); + + it('should return Audits', () => { + let expectedResult: HttpResponse<Audit[]> = new HttpResponse({ body: [] }); + const audit = new Audit({ remoteAddress: '127.0.0.1', sessionId: '123' }, 'user', '20140101', 'AUTHENTICATION_SUCCESS'); + + service.query(fakeRequest).subscribe(received => { + expectedResult = received; + }); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush([audit]); + let audits: Audit[] = []; + if (expectedResult.body !== null) { + audits = expectedResult.body; + } + expect(audits.length).toBe(1); + expect(audits[0]).toEqual(audit); + }); + + it('should propagate not found response', () => { + let expectedResult = 0; + service.query(fakeRequest).subscribe(null, (error: HttpErrorResponse) => { + expectedResult = error.status; + }); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush('Invalid request parameters', { + status: 404, + statusText: 'Bad Request' + }); + expect(expectedResult).toEqual(404); + }); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/admin/configuration/configuration.component.spec.ts b/borestop/src/test/javascript/spec/app/admin/configuration/configuration.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..f26dc2bb369898aad1e7b32e577e35108df48438 --- /dev/null +++ b/borestop/src/test/javascript/spec/app/admin/configuration/configuration.component.spec.ts @@ -0,0 +1,68 @@ +import { ComponentFixture, TestBed, async } from '@angular/core/testing'; +import { of } from 'rxjs'; + +import { BorestopTestModule } from '../../../test.module'; +import { ConfigurationComponent } from 'app/admin/configuration/configuration.component'; +import { ConfigurationService, Bean, PropertySource } from 'app/admin/configuration/configuration.service'; + +describe('Component Tests', () => { + describe('ConfigurationComponent', () => { + let comp: ConfigurationComponent; + let fixture: ComponentFixture<ConfigurationComponent>; + let service: ConfigurationService; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [ConfigurationComponent], + providers: [ConfigurationService] + }) + .overrideTemplate(ConfigurationComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ConfigurationComponent); + comp = fixture.componentInstance; + service = fixture.debugElement.injector.get(ConfigurationService); + }); + + describe('OnInit', () => { + it('Should call load all on init', () => { + // GIVEN + const beans: Bean[] = [ + { + prefix: 'jhipster', + properties: { + clientApp: { + name: 'jhipsterApp' + } + } + } + ]; + const propertySources: PropertySource[] = [ + { + name: 'server.ports', + properties: { + 'local.server.port': { + value: '8080' + } + } + } + ]; + spyOn(service, 'getBeans').and.returnValue(of(beans)); + spyOn(service, 'getPropertySources').and.returnValue(of(propertySources)); + + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.getBeans).toHaveBeenCalled(); + expect(service.getPropertySources).toHaveBeenCalled(); + expect(comp.allBeans).toEqual(beans); + expect(comp.beans).toEqual(beans); + expect(comp.propertySources).toEqual(propertySources); + }); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/admin/configuration/configuration.service.spec.ts b/borestop/src/test/javascript/spec/app/admin/configuration/configuration.service.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..2715a8fa3e6fe32971891f5742ceb56b5e14918d --- /dev/null +++ b/borestop/src/test/javascript/spec/app/admin/configuration/configuration.service.spec.ts @@ -0,0 +1,81 @@ +import { TestBed } from '@angular/core/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; + +import { ConfigurationService, ConfigProps, Env, Bean, PropertySource } from 'app/admin/configuration/configuration.service'; +import { SERVER_API_URL } from 'app/app.constants'; + +describe('Service Tests', () => { + describe('Logs Service', () => { + let service: ConfigurationService; + let httpMock: HttpTestingController; + let expectedResult: Bean[] | PropertySource[] | null; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule] + }); + + expectedResult = null; + service = TestBed.get(ConfigurationService); + httpMock = TestBed.get(HttpTestingController); + }); + + afterEach(() => { + httpMock.verify(); + }); + + describe('Service methods', () => { + it('should call correct URL', () => { + service.getBeans().subscribe(); + + const req = httpMock.expectOne({ method: 'GET' }); + const resourceUrl = SERVER_API_URL + 'management/configprops'; + expect(req.request.url).toEqual(resourceUrl); + }); + + it('should get the config', () => { + const bean: Bean = { + prefix: 'jhipster', + properties: { + clientApp: { + name: 'jhipsterApp' + } + } + }; + const configProps: ConfigProps = { + contexts: { + jhipster: { + beans: { + 'io.github.jhipster.config.JHipsterProperties': bean + } + } + } + }; + service.getBeans().subscribe(received => (expectedResult = received)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush(configProps); + expect(expectedResult).toEqual([bean]); + }); + + it('should get the env', () => { + const propertySources: PropertySource[] = [ + { + name: 'server.ports', + properties: { + 'local.server.port': { + value: '8080' + } + } + } + ]; + const env: Env = { propertySources }; + service.getPropertySources().subscribe(received => (expectedResult = received)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush(env); + expect(expectedResult).toEqual(propertySources); + }); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/admin/health/health.component.spec.ts b/borestop/src/test/javascript/spec/app/admin/health/health.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..9d926e008ac467b02b5eeb9a639efb631ca68289 --- /dev/null +++ b/borestop/src/test/javascript/spec/app/admin/health/health.component.spec.ts @@ -0,0 +1,67 @@ +import { ComponentFixture, TestBed, async } from '@angular/core/testing'; +import { HttpErrorResponse } from '@angular/common/http'; +import { of, throwError } from 'rxjs'; + +import { BorestopTestModule } from '../../../test.module'; +import { HealthComponent } from 'app/admin/health/health.component'; +import { HealthService, Health } from 'app/admin/health/health.service'; + +describe('Component Tests', () => { + describe('HealthComponent', () => { + let comp: HealthComponent; + let fixture: ComponentFixture<HealthComponent>; + let service: HealthService; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [HealthComponent] + }) + .overrideTemplate(HealthComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HealthComponent); + comp = fixture.componentInstance; + service = fixture.debugElement.injector.get(HealthService); + }); + + describe('getBadgeClass', () => { + it('should get badge class', () => { + const upBadgeClass = comp.getBadgeClass('UP'); + const downBadgeClass = comp.getBadgeClass('DOWN'); + expect(upBadgeClass).toEqual('badge-success'); + expect(downBadgeClass).toEqual('badge-danger'); + }); + }); + + describe('refresh', () => { + it('should call refresh on init', () => { + // GIVEN + const health: Health = { status: 'UP', components: { mail: { status: 'UP', details: 'mailDetails' } } }; + spyOn(service, 'checkHealth').and.returnValue(of(health)); + + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.checkHealth).toHaveBeenCalled(); + expect(comp.health).toEqual(health); + }); + + it('should handle a 503 on refreshing health data', () => { + // GIVEN + const health: Health = { status: 'DOWN', components: { mail: { status: 'DOWN', details: 'mailDetails' } } }; + spyOn(service, 'checkHealth').and.returnValue(throwError(new HttpErrorResponse({ status: 503, error: health }))); + + // WHEN + comp.refresh(); + + // THEN + expect(service.checkHealth).toHaveBeenCalled(); + expect(comp.health).toEqual(health); + }); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/admin/logs/logs.component.spec.ts b/borestop/src/test/javascript/spec/app/admin/logs/logs.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..b5acfc16ae509851ecb541d9dcc783023fecc85c --- /dev/null +++ b/borestop/src/test/javascript/spec/app/admin/logs/logs.component.spec.ts @@ -0,0 +1,85 @@ +import { ComponentFixture, TestBed, async } from '@angular/core/testing'; +import { of } from 'rxjs'; + +import { BorestopTestModule } from '../../../test.module'; +import { LogsComponent } from 'app/admin/logs/logs.component'; +import { LogsService } from 'app/admin/logs/logs.service'; +import { Log } from 'app/admin/logs/log.model'; + +describe('Component Tests', () => { + describe('LogsComponent', () => { + let comp: LogsComponent; + let fixture: ComponentFixture<LogsComponent>; + let service: LogsService; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [LogsComponent], + providers: [LogsService] + }) + .overrideTemplate(LogsComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(LogsComponent); + comp = fixture.componentInstance; + service = fixture.debugElement.injector.get(LogsService); + }); + + describe('OnInit', () => { + it('should set all default values correctly', () => { + expect(comp.filter).toBe(''); + expect(comp.orderProp).toBe('name'); + expect(comp.reverse).toBe(false); + }); + + it('Should call load all on init', () => { + // GIVEN + const log = new Log('main', 'WARN'); + spyOn(service, 'findAll').and.returnValue( + of({ + loggers: { + main: { + effectiveLevel: 'WARN' + } + } + }) + ); + + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.findAll).toHaveBeenCalled(); + expect(comp.loggers && comp.loggers[0]).toEqual(jasmine.objectContaining(log)); + }); + }); + + describe('change log level', () => { + it('should change log level correctly', () => { + // GIVEN + const log = new Log('main', 'ERROR'); + spyOn(service, 'changeLevel').and.returnValue(of({})); + spyOn(service, 'findAll').and.returnValue( + of({ + loggers: { + main: { + effectiveLevel: 'ERROR' + } + } + }) + ); + + // WHEN + comp.changeLevel('main', 'ERROR'); + + // THEN + expect(service.changeLevel).toHaveBeenCalled(); + expect(service.findAll).toHaveBeenCalled(); + expect(comp.loggers && comp.loggers[0]).toEqual(jasmine.objectContaining(log)); + }); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/admin/logs/logs.service.spec.ts b/borestop/src/test/javascript/spec/app/admin/logs/logs.service.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..bccec0dbf465529d24e92f893681539bbf1d34c3 --- /dev/null +++ b/borestop/src/test/javascript/spec/app/admin/logs/logs.service.spec.ts @@ -0,0 +1,44 @@ +import { TestBed } from '@angular/core/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; + +import { LogsService } from 'app/admin/logs/logs.service'; +import { SERVER_API_URL } from 'app/app.constants'; + +describe('Service Tests', () => { + describe('Logs Service', () => { + let service: LogsService; + let httpMock: HttpTestingController; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule] + }); + + service = TestBed.get(LogsService); + httpMock = TestBed.get(HttpTestingController); + }); + + afterEach(() => { + httpMock.verify(); + }); + + describe('Service methods', () => { + it('should call correct URL', () => { + service.findAll().subscribe(); + + const req = httpMock.expectOne({ method: 'GET' }); + const resourceUrl = SERVER_API_URL + 'management/loggers'; + expect(req.request.url).toEqual(resourceUrl); + }); + + it('should change log level', () => { + service.changeLevel('main', 'ERROR').subscribe(); + + const req = httpMock.expectOne({ method: 'POST' }); + const resourceUrl = SERVER_API_URL + 'management/loggers/main'; + expect(req.request.url).toEqual(resourceUrl); + expect(req.request.body).toEqual({ configuredLevel: 'ERROR' }); + }); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/admin/metrics/metrics.component.spec.ts b/borestop/src/test/javascript/spec/app/admin/metrics/metrics.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..98adcf5960feb3f01d6f216ffc7bd0f74064ae8f --- /dev/null +++ b/borestop/src/test/javascript/spec/app/admin/metrics/metrics.component.spec.ts @@ -0,0 +1,54 @@ +import { ComponentFixture, TestBed, async } from '@angular/core/testing'; +import { of } from 'rxjs'; + +import { BorestopTestModule } from '../../../test.module'; +import { MetricsComponent } from 'app/admin/metrics/metrics.component'; +import { MetricsService } from 'app/admin/metrics/metrics.service'; + +describe('Component Tests', () => { + describe('MetricsComponent', () => { + let comp: MetricsComponent; + let fixture: ComponentFixture<MetricsComponent>; + let service: MetricsService; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [MetricsComponent] + }) + .overrideTemplate(MetricsComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MetricsComponent); + comp = fixture.componentInstance; + service = fixture.debugElement.injector.get(MetricsService); + }); + + describe('refresh', () => { + it('should call refresh on init', () => { + // GIVEN + const response = { + timers: { + service: 'test', + unrelatedKey: 'test' + }, + gauges: { + 'jcache.statistics': { + value: 2 + }, + unrelatedKey: 'test' + } + }; + spyOn(service, 'getMetrics').and.returnValue(of(response)); + + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.getMetrics).toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/admin/metrics/metrics.service.spec.ts b/borestop/src/test/javascript/spec/app/admin/metrics/metrics.service.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..c86b4af44add8b9e8f703f131243a1b2b25dc6dd --- /dev/null +++ b/borestop/src/test/javascript/spec/app/admin/metrics/metrics.service.spec.ts @@ -0,0 +1,68 @@ +import { TestBed } from '@angular/core/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; + +import { MetricsService, Metrics, ThreadDump } from 'app/admin/metrics/metrics.service'; +import { SERVER_API_URL } from 'app/app.constants'; + +describe('Service Tests', () => { + describe('Logs Service', () => { + let service: MetricsService; + let httpMock: HttpTestingController; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule] + }); + service = TestBed.get(MetricsService); + httpMock = TestBed.get(HttpTestingController); + }); + + afterEach(() => { + httpMock.verify(); + }); + + describe('Service methods', () => { + it('should call correct URL', () => { + service.getMetrics().subscribe(); + + const req = httpMock.expectOne({ method: 'GET' }); + const resourceUrl = SERVER_API_URL + 'management/jhimetrics'; + expect(req.request.url).toEqual(resourceUrl); + }); + + it('should return Metrics', () => { + let expectedResult: Metrics | null = null; + const metrics: Metrics = { + jvm: {}, + 'http.server.requests': {}, + cache: {}, + services: {}, + databases: {}, + garbageCollector: {}, + processMetrics: {} + }; + + service.getMetrics().subscribe(received => { + expectedResult = received; + }); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush(metrics); + expect(expectedResult).toEqual(metrics); + }); + + it('should return Thread Dump', () => { + let expectedResult: ThreadDump | null = null; + const dump: ThreadDump = { threads: [{ name: 'test1', threadState: 'RUNNABLE' }] }; + + service.threadDump().subscribe(received => { + expectedResult = received; + }); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush(dump); + expect(expectedResult).toEqual(dump); + }); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/admin/user-management/user-management-delete-dialog.component.spec.ts b/borestop/src/test/javascript/spec/app/admin/user-management/user-management-delete-dialog.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..bf01424c06375300f0070e0e2d6d4081723241d5 --- /dev/null +++ b/borestop/src/test/javascript/spec/app/admin/user-management/user-management-delete-dialog.component.spec.ts @@ -0,0 +1,56 @@ +import { ComponentFixture, TestBed, async, inject, fakeAsync, tick } from '@angular/core/testing'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; +import { of } from 'rxjs'; +import { JhiEventManager } from 'ng-jhipster'; + +import { BorestopTestModule } from '../../../test.module'; +import { MockEventManager } from '../../../helpers/mock-event-manager.service'; +import { MockActiveModal } from '../../../helpers/mock-active-modal.service'; +import { UserManagementDeleteDialogComponent } from 'app/admin/user-management/user-management-delete-dialog.component'; +import { UserService } from 'app/core/user/user.service'; + +describe('Component Tests', () => { + describe('User Management Delete Component', () => { + let comp: UserManagementDeleteDialogComponent; + let fixture: ComponentFixture<UserManagementDeleteDialogComponent>; + let service: UserService; + let mockEventManager: MockEventManager; + let mockActiveModal: MockActiveModal; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [UserManagementDeleteDialogComponent] + }) + .overrideTemplate(UserManagementDeleteDialogComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(UserManagementDeleteDialogComponent); + comp = fixture.componentInstance; + service = fixture.debugElement.injector.get(UserService); + mockEventManager = TestBed.get(JhiEventManager); + mockActiveModal = TestBed.get(NgbActiveModal); + }); + + describe('confirmDelete', () => { + it('Should call delete service on confirmDelete', inject( + [], + fakeAsync(() => { + // GIVEN + spyOn(service, 'delete').and.returnValue(of({})); + + // WHEN + comp.confirmDelete('user'); + tick(); + + // THEN + expect(service.delete).toHaveBeenCalledWith('user'); + expect(mockActiveModal.closeSpy).toHaveBeenCalled(); + expect(mockEventManager.broadcastSpy).toHaveBeenCalled(); + }) + )); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/admin/user-management/user-management-detail.component.spec.ts b/borestop/src/test/javascript/spec/app/admin/user-management/user-management-detail.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..d2ab2b9a09978b3bf0ab379cc4dbf6fbe726090e --- /dev/null +++ b/borestop/src/test/javascript/spec/app/admin/user-management/user-management-detail.component.spec.ts @@ -0,0 +1,62 @@ +import { ComponentFixture, TestBed, async } from '@angular/core/testing'; +import { ActivatedRoute } from '@angular/router'; +import { of } from 'rxjs'; + +import { Authority } from 'app/shared/constants/authority.constants'; +import { BorestopTestModule } from '../../../test.module'; +import { UserManagementDetailComponent } from 'app/admin/user-management/user-management-detail.component'; +import { User } from 'app/core/user/user.model'; + +describe('Component Tests', () => { + describe('User Management Detail Component', () => { + let comp: UserManagementDetailComponent; + let fixture: ComponentFixture<UserManagementDetailComponent>; + const route: ActivatedRoute = ({ + data: of({ user: new User(1, 'user', 'first', 'last', 'first@last.com', true, 'en', [Authority.USER], 'admin') }) + } as any) as ActivatedRoute; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [UserManagementDetailComponent], + providers: [ + { + provide: ActivatedRoute, + useValue: route + } + ] + }) + .overrideTemplate(UserManagementDetailComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(UserManagementDetailComponent); + comp = fixture.componentInstance; + }); + + describe('OnInit', () => { + it('Should call load all on init', () => { + // GIVEN + + // WHEN + comp.ngOnInit(); + + // THEN + expect(comp.user).toEqual( + jasmine.objectContaining({ + id: 1, + login: 'user', + firstName: 'first', + lastName: 'last', + email: 'first@last.com', + activated: true, + langKey: 'en', + authorities: [Authority.USER], + createdBy: 'admin' + }) + ); + }); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/admin/user-management/user-management-update.component.spec.ts b/borestop/src/test/javascript/spec/app/admin/user-management/user-management-update.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..66910b8b96efdbb7767560742ecdfb61a7aa69a8 --- /dev/null +++ b/borestop/src/test/javascript/spec/app/admin/user-management/user-management-update.component.spec.ts @@ -0,0 +1,104 @@ +import { ComponentFixture, TestBed, async, inject, fakeAsync, tick } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { FormBuilder } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { of } from 'rxjs'; + +import { Authority } from 'app/shared/constants/authority.constants'; +import { BorestopTestModule } from '../../../test.module'; +import { UserManagementUpdateComponent } from 'app/admin/user-management/user-management-update.component'; +import { UserService } from 'app/core/user/user.service'; +import { User } from 'app/core/user/user.model'; + +describe('Component Tests', () => { + describe('User Management Update Component', () => { + let comp: UserManagementUpdateComponent; + let fixture: ComponentFixture<UserManagementUpdateComponent>; + let service: UserService; + const route: ActivatedRoute = ({ + data: of({ user: new User(1, 'user', 'first', 'last', 'first@last.com', true, 'en', [Authority.USER], 'admin') }) + } as any) as ActivatedRoute; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [UserManagementUpdateComponent], + providers: [ + FormBuilder, + { + provide: ActivatedRoute, + useValue: route + } + ] + }) + .overrideTemplate(UserManagementUpdateComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(UserManagementUpdateComponent); + comp = fixture.componentInstance; + service = fixture.debugElement.injector.get(UserService); + }); + + describe('OnInit', () => { + it('Should load authorities and language on init', inject( + [], + fakeAsync(() => { + // GIVEN + spyOn(service, 'authorities').and.returnValue(of(['USER'])); + + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.authorities).toHaveBeenCalled(); + expect(comp.authorities).toEqual(['USER']); + }) + )); + }); + + describe('save', () => { + it('Should call update service on save for existing user', inject( + [], + fakeAsync(() => { + // GIVEN + const entity = new User(123); + spyOn(service, 'update').and.returnValue( + of( + new HttpResponse({ + body: entity + }) + ) + ); + comp.user = entity; + comp.editForm.patchValue({ id: entity.id }); + // WHEN + comp.save(); + tick(); // simulate async + + // THEN + expect(service.update).toHaveBeenCalledWith(entity); + expect(comp.isSaving).toEqual(false); + }) + )); + + it('Should call create service on save for new user', inject( + [], + fakeAsync(() => { + // GIVEN + const entity = new User(); + spyOn(service, 'create').and.returnValue(of(new HttpResponse({ body: entity }))); + comp.user = entity; + // WHEN + comp.save(); + tick(); // simulate async + + // THEN + expect(service.create).toHaveBeenCalledWith(entity); + expect(comp.isSaving).toEqual(false); + }) + )); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/admin/user-management/user-management.component.spec.ts b/borestop/src/test/javascript/spec/app/admin/user-management/user-management.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..97d0c1081dbd328fab9a7a8fad80af711cf116ab --- /dev/null +++ b/borestop/src/test/javascript/spec/app/admin/user-management/user-management.component.spec.ts @@ -0,0 +1,86 @@ +import { ComponentFixture, TestBed, async, inject, fakeAsync, tick } from '@angular/core/testing'; +import { HttpHeaders, HttpResponse } from '@angular/common/http'; +import { of } from 'rxjs'; + +import { BorestopTestModule } from '../../../test.module'; +import { UserManagementComponent } from 'app/admin/user-management/user-management.component'; +import { UserService } from 'app/core/user/user.service'; +import { User } from 'app/core/user/user.model'; + +describe('Component Tests', () => { + describe('User Management Component', () => { + let comp: UserManagementComponent; + let fixture: ComponentFixture<UserManagementComponent>; + let service: UserService; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [UserManagementComponent] + }) + .overrideTemplate(UserManagementComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(UserManagementComponent); + comp = fixture.componentInstance; + service = fixture.debugElement.injector.get(UserService); + }); + + describe('OnInit', () => { + it('Should call load all on init', inject( + [], + fakeAsync(() => { + // GIVEN + const headers = new HttpHeaders().append('link', 'link;link'); + spyOn(service, 'query').and.returnValue( + of( + new HttpResponse({ + body: [new User(123)], + headers + }) + ) + ); + + // WHEN + comp.ngOnInit(); + tick(); // simulate async + + // THEN + expect(service.query).toHaveBeenCalled(); + expect(comp.users && comp.users[0]).toEqual(jasmine.objectContaining({ id: 123 })); + }) + )); + }); + + describe('setActive', () => { + it('Should update user and call load all', inject( + [], + fakeAsync(() => { + // GIVEN + const headers = new HttpHeaders().append('link', 'link;link'); + const user = new User(123); + spyOn(service, 'query').and.returnValue( + of( + new HttpResponse({ + body: [user], + headers + }) + ) + ); + spyOn(service, 'update').and.returnValue(of(new HttpResponse({ status: 200 }))); + + // WHEN + comp.setActive(user, true); + tick(); // simulate async + + // THEN + expect(service.update).toHaveBeenCalledWith({ ...user, activated: true }); + expect(service.query).toHaveBeenCalled(); + expect(comp.users && comp.users[0]).toEqual(jasmine.objectContaining({ id: 123 })); + }) + )); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/core/login/login-modal.service.spec.ts b/borestop/src/test/javascript/spec/app/core/login/login-modal.service.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..d0d386ad37f7258bae5d79158c01252b947d78b9 --- /dev/null +++ b/borestop/src/test/javascript/spec/app/core/login/login-modal.service.spec.ts @@ -0,0 +1,48 @@ +import { TestBed } from '@angular/core/testing'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; + +import { LoginModalService } from 'app/core/login/login-modal.service'; + +// Mock class for NgbModalRef +export class MockNgbModalRef { + result: Promise<any> = new Promise(resolve => resolve('x')); +} + +describe('Service Tests', () => { + describe('Login Modal Service', () => { + let service: LoginModalService; + let modalService: NgbModal; + + beforeEach(() => { + service = TestBed.get(LoginModalService); + modalService = TestBed.get(NgbModal); + }); + + describe('Service methods', () => { + it('Should call open method for NgbModal when open method is called', () => { + // GIVEN + const mockModalRef: MockNgbModalRef = new MockNgbModalRef(); + spyOn(modalService, 'open').and.returnValue(mockModalRef); + + // WHEN + service.open(); + + // THEN + expect(modalService.open).toHaveBeenCalled(); + }); + + it('Should call open method for NgbModal one time when open method is called twice', () => { + // GIVEN + const mockModalRef: MockNgbModalRef = new MockNgbModalRef(); + spyOn(modalService, 'open').and.returnValue(mockModalRef); + + // WHEN + service.open(); + service.open(); + + // THEN + expect(modalService.open).toHaveBeenCalledTimes(1); + }); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/core/user/account.service.spec.ts b/borestop/src/test/javascript/spec/app/core/user/account.service.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..f5e11671a21430df1af2900f1f6fc0c2fabff728 --- /dev/null +++ b/borestop/src/test/javascript/spec/app/core/user/account.service.spec.ts @@ -0,0 +1,214 @@ +import { Router } from '@angular/router'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; +import { TestBed } from '@angular/core/testing'; +import { JhiDateUtils, JhiLanguageService } from 'ng-jhipster'; +import { NgxWebstorageModule } from 'ngx-webstorage'; + +import { SERVER_API_URL } from 'app/app.constants'; +import { AccountService } from 'app/core/auth/account.service'; +import { Account } from 'app/core/user/account.model'; +import { Authority } from 'app/shared/constants/authority.constants'; +import { StateStorageService } from 'app/core/auth/state-storage.service'; +import { MockLanguageService } from '../../../helpers/mock-language.service'; +import { MockRouter } from '../../../helpers/mock-route.service'; +import { MockStateStorageService } from '../../../helpers/mock-state-storage.service'; + +function accountWithAuthorities(authorities: string[]): Account { + return { + activated: true, + authorities, + email: '', + firstName: '', + langKey: '', + lastName: '', + login: '', + imageUrl: '' + }; +} + +describe('Service Tests', () => { + describe('Account Service', () => { + let service: AccountService; + let httpMock: HttpTestingController; + let storageService: MockStateStorageService; + let router: MockRouter; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule, NgxWebstorageModule.forRoot()], + providers: [ + JhiDateUtils, + { + provide: JhiLanguageService, + useClass: MockLanguageService + }, + { + provide: StateStorageService, + useClass: MockStateStorageService + }, + { + provide: Router, + useClass: MockRouter + } + ] + }); + + service = TestBed.get(AccountService); + httpMock = TestBed.get(HttpTestingController); + storageService = TestBed.get(StateStorageService); + router = TestBed.get(Router); + }); + + afterEach(() => { + httpMock.verify(); + }); + + describe('authenticate', () => { + it('authenticationState should emit null if input is null', () => { + // GIVEN + let userIdentity: Account | null = accountWithAuthorities([]); + service.getAuthenticationState().subscribe(account => (userIdentity = account)); + + // WHEN + service.authenticate(null); + + // THEN + expect(userIdentity).toBeNull(); + expect(service.isAuthenticated()).toBe(false); + }); + + it('authenticationState should emit the same account as was in input parameter', () => { + // GIVEN + const expectedResult = accountWithAuthorities([]); + let userIdentity: Account | null = null; + service.getAuthenticationState().subscribe(account => (userIdentity = account)); + + // WHEN + service.authenticate(expectedResult); + + // THEN + expect(userIdentity).toEqual(expectedResult); + expect(service.isAuthenticated()).toBe(true); + }); + }); + + describe('identity', () => { + it('should call /account if user is undefined', () => { + service.identity().subscribe(); + const req = httpMock.expectOne({ method: 'GET' }); + const resourceUrl = SERVER_API_URL + 'api/account'; + + expect(req.request.url).toEqual(`${resourceUrl}`); + }); + + it('should call /account only once if not logged out after first authentication and should call /account again if user has logged out', () => { + // Given the user is authenticated + service.identity().subscribe(); + httpMock.expectOne({ method: 'GET' }).flush({}); + + // When I call + service.identity().subscribe(); + + // Then there is no second request + httpMock.expectNone({ method: 'GET' }); + + // When I log out + service.authenticate(null); + // and then call + service.identity().subscribe(); + + // Then there is a new request + httpMock.expectOne({ method: 'GET' }); + }); + + describe('navigateToStoredUrl', () => { + it('should navigate to the previous stored url post successful authentication', () => { + // GIVEN + storageService.setResponse('admin/users?page=0'); + + // WHEN + service.identity().subscribe(); + httpMock.expectOne({ method: 'GET' }).flush({}); + + // THEN + expect(storageService.getUrlSpy).toHaveBeenCalledTimes(1); + expect(storageService.clearUrlSpy).toHaveBeenCalledTimes(1); + expect(router.navigateByUrlSpy).toHaveBeenCalledWith('admin/users?page=0'); + }); + + it('should not navigate to the previous stored url when authentication fails', () => { + // WHEN + service.identity().subscribe(); + httpMock.expectOne({ method: 'GET' }).error(new ErrorEvent('')); + + // THEN + expect(storageService.getUrlSpy).not.toHaveBeenCalled(); + expect(storageService.clearUrlSpy).not.toHaveBeenCalled(); + expect(router.navigateByUrlSpy).not.toHaveBeenCalled(); + }); + + it('should not navigate to the previous stored url when no such url exists post successful authentication', () => { + // GIVEN + storageService.setResponse(null); + + // WHEN + service.identity().subscribe(); + httpMock.expectOne({ method: 'GET' }).flush({}); + + // THEN + expect(storageService.getUrlSpy).toHaveBeenCalledTimes(1); + expect(storageService.clearUrlSpy).not.toHaveBeenCalled(); + expect(router.navigateByUrlSpy).not.toHaveBeenCalled(); + }); + }); + }); + + describe('hasAnyAuthority', () => { + describe('hasAnyAuthority string parameter', () => { + it('should return false if user is not logged', () => { + const hasAuthority = service.hasAnyAuthority(Authority.USER); + expect(hasAuthority).toBe(false); + }); + + it('should return false if user is logged and has not authority', () => { + service.authenticate(accountWithAuthorities([Authority.USER])); + + const hasAuthority = service.hasAnyAuthority(Authority.ADMIN); + + expect(hasAuthority).toBe(false); + }); + + it('should return true if user is logged and has authority', () => { + service.authenticate(accountWithAuthorities([Authority.USER])); + + const hasAuthority = service.hasAnyAuthority(Authority.USER); + + expect(hasAuthority).toBe(true); + }); + }); + + describe('hasAnyAuthority array parameter', () => { + it('should return false if user is not logged', () => { + const hasAuthority = service.hasAnyAuthority([Authority.USER]); + expect(hasAuthority).toBeFalsy(); + }); + + it('should return false if user is logged and has not authority', () => { + service.authenticate(accountWithAuthorities([Authority.USER])); + + const hasAuthority = service.hasAnyAuthority([Authority.ADMIN]); + + expect(hasAuthority).toBe(false); + }); + + it('should return true if user is logged and has authority', () => { + service.authenticate(accountWithAuthorities([Authority.USER])); + + const hasAuthority = service.hasAnyAuthority([Authority.USER, Authority.ADMIN]); + + expect(hasAuthority).toBe(true); + }); + }); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/core/user/user.service.spec.ts b/borestop/src/test/javascript/spec/app/core/user/user.service.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..2811acbf1196e94fae15edce338c4169930e1302 --- /dev/null +++ b/borestop/src/test/javascript/spec/app/core/user/user.service.spec.ts @@ -0,0 +1,79 @@ +import { TestBed } from '@angular/core/testing'; +import { HttpErrorResponse } from '@angular/common/http'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; +import { JhiDateUtils } from 'ng-jhipster'; + +import { Authority } from 'app/shared/constants/authority.constants'; +import { UserService } from 'app/core/user/user.service'; +import { User } from 'app/core/user/user.model'; +import { SERVER_API_URL } from 'app/app.constants'; + +describe('Service Tests', () => { + describe('User Service', () => { + let service: UserService; + let httpMock: HttpTestingController; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [JhiDateUtils] + }); + + service = TestBed.get(UserService); + httpMock = TestBed.get(HttpTestingController); + }); + + afterEach(() => { + httpMock.verify(); + }); + + describe('Service methods', () => { + it('should call correct URL', () => { + service.find('user').subscribe(); + + const req = httpMock.expectOne({ method: 'GET' }); + const resourceUrl = SERVER_API_URL + 'api/users'; + expect(req.request.url).toEqual(`${resourceUrl}/user`); + }); + + it('should return User', () => { + let expectedResult: string | undefined; + + service.find('user').subscribe(received => { + expectedResult = received.login; + }); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush(new User(1, 'user')); + expect(expectedResult).toEqual('user'); + }); + + it('should return Authorities', () => { + let expectedResult: string[] = []; + + service.authorities().subscribe(authorities => { + expectedResult = authorities; + }); + const req = httpMock.expectOne({ method: 'GET' }); + + req.flush([Authority.USER, Authority.ADMIN]); + expect(expectedResult).toEqual([Authority.USER, Authority.ADMIN]); + }); + + it('should propagate not found response', () => { + let expectedResult = 0; + + service.find('user').subscribe(null, (error: HttpErrorResponse) => { + expectedResult = error.status; + }); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush('Invalid request parameters', { + status: 404, + statusText: 'Bad Request' + }); + expect(expectedResult).toEqual(404); + }); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/home/home.component.spec.ts b/borestop/src/test/javascript/spec/app/home/home.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..e1a99ac85d9e43b91dec580895382002d2e0e1e5 --- /dev/null +++ b/borestop/src/test/javascript/spec/app/home/home.component.spec.ts @@ -0,0 +1,55 @@ +import { ComponentFixture, TestBed, async } from '@angular/core/testing'; + +import { BorestopTestModule } from '../../test.module'; +import { HomeComponent } from 'app/home/home.component'; +import { AccountService } from 'app/core/auth/account.service'; +import { LoginModalService } from 'app/core/login/login-modal.service'; + +describe('Component Tests', () => { + describe('Home Component', () => { + let comp: HomeComponent; + let fixture: ComponentFixture<HomeComponent>; + let accountService: AccountService; + let loginModalService: LoginModalService; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [HomeComponent] + }) + .overrideTemplate(HomeComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HomeComponent); + comp = fixture.componentInstance; + accountService = TestBed.get(AccountService); + loginModalService = TestBed.get(LoginModalService); + }); + + it('Should call accountService.getAuthenticationState on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(accountService.getAuthenticationState).toHaveBeenCalled(); + }); + + it('Should call accountService.isAuthenticated when it checks authentication', () => { + // WHEN + comp.isAuthenticated(); + + // THEN + expect(accountService.isAuthenticated).toHaveBeenCalled(); + }); + + it('Should call loginModalService.open on login', () => { + // WHEN + comp.login(); + + // THEN + expect(loginModalService.open).toHaveBeenCalled(); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/layouts/main/main.component.spec.ts b/borestop/src/test/javascript/spec/app/layouts/main/main.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..0d68e74b4c2e72bd2cb9144151460c6827665c81 --- /dev/null +++ b/borestop/src/test/javascript/spec/app/layouts/main/main.component.spec.ts @@ -0,0 +1,183 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { Router, RouterEvent, NavigationEnd } from '@angular/router'; +import { Title } from '@angular/platform-browser'; +import { Subject, of } from 'rxjs'; +import { TranslateModule, TranslateService, LangChangeEvent } from '@ngx-translate/core'; + +import { MainComponent } from 'app/layouts/main/main.component'; +import { BorestopTestModule } from '../../../test.module'; +import { MockRouter } from '../../../helpers/mock-route.service'; + +describe('Component Tests', () => { + describe('MainComponent', () => { + let comp: MainComponent; + let fixture: ComponentFixture<MainComponent>; + let router: MockRouter; + const routerEventsSubject = new Subject<RouterEvent>(); + let titleService: Title; + let translateService: TranslateService; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule, TranslateModule.forRoot()], + declarations: [MainComponent], + providers: [Title] + }) + .overrideTemplate(MainComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MainComponent); + comp = fixture.componentInstance; + router = TestBed.get(Router); + router.setEvents(routerEventsSubject.asObservable()); + titleService = TestBed.get(Title); + translateService = TestBed.get(TranslateService); + }); + + describe('page title', () => { + let routerState: any; + const defaultPageTitle = 'global.title'; + const parentRoutePageTitle = 'parentTitle'; + const childRoutePageTitle = 'childTitle'; + const navigationEnd = new NavigationEnd(1, '', ''); + const langChangeEvent: LangChangeEvent = { lang: 'en', translations: null }; + + beforeEach(() => { + routerState = { snapshot: { root: {} } }; + router.setRouterState(routerState); + spyOn(translateService, 'get').and.callFake((key: string) => { + return of(key + ' translated'); + }); + translateService.currentLang = 'en'; + spyOn(titleService, 'setTitle'); + comp.ngOnInit(); + }); + + describe('navigation end', () => { + it('should set page title to default title if pageTitle is missing on routes', () => { + // WHEN + routerEventsSubject.next(navigationEnd); + + // THEN + expect(translateService.get).toHaveBeenCalledWith(defaultPageTitle); + expect(titleService.setTitle).toHaveBeenCalledWith(defaultPageTitle + ' translated'); + }); + + it('should set page title to root route pageTitle if there is no child routes', () => { + // GIVEN + routerState.snapshot.root.data = { pageTitle: parentRoutePageTitle }; + + // WHEN + routerEventsSubject.next(navigationEnd); + + // THEN + expect(translateService.get).toHaveBeenCalledWith(parentRoutePageTitle); + expect(titleService.setTitle).toHaveBeenCalledWith(parentRoutePageTitle + ' translated'); + }); + + it('should set page title to child route pageTitle if child routes exist and pageTitle is set for child route', () => { + // GIVEN + routerState.snapshot.root.data = { pageTitle: parentRoutePageTitle }; + routerState.snapshot.root.firstChild = { data: { pageTitle: childRoutePageTitle } }; + + // WHEN + routerEventsSubject.next(navigationEnd); + + // THEN + expect(translateService.get).toHaveBeenCalledWith(childRoutePageTitle); + expect(titleService.setTitle).toHaveBeenCalledWith(childRoutePageTitle + ' translated'); + }); + + it('should set page title to parent route pageTitle if child routes exists but pageTitle is not set for child route data', () => { + // GIVEN + routerState.snapshot.root.data = { pageTitle: parentRoutePageTitle }; + routerState.snapshot.root.firstChild = { data: {} }; + + // WHEN + routerEventsSubject.next(navigationEnd); + + // THEN + expect(translateService.get).toHaveBeenCalledWith(parentRoutePageTitle); + expect(titleService.setTitle).toHaveBeenCalledWith(parentRoutePageTitle + ' translated'); + }); + + it('should set page title to parent route pageTitle if child routes exists but data is not set for child route', () => { + // GIVEN + routerState.snapshot.root.data = { pageTitle: parentRoutePageTitle }; + routerState.snapshot.root.firstChild = {}; + + // WHEN + routerEventsSubject.next(navigationEnd); + + // THEN + expect(translateService.get).toHaveBeenCalledWith(parentRoutePageTitle); + expect(titleService.setTitle).toHaveBeenCalledWith(parentRoutePageTitle + ' translated'); + }); + }); + + describe('language change', () => { + it('should set page title to default title if pageTitle is missing on routes', () => { + // WHEN + translateService.onLangChange.emit(langChangeEvent); + + // THEN + expect(translateService.get).toHaveBeenCalledWith(defaultPageTitle); + expect(titleService.setTitle).toHaveBeenCalledWith(defaultPageTitle + ' translated'); + }); + + it('should set page title to root route pageTitle if there is no child routes', () => { + // GIVEN + routerState.snapshot.root.data = { pageTitle: parentRoutePageTitle }; + + // WHEN + translateService.onLangChange.emit(langChangeEvent); + + // THEN + expect(translateService.get).toHaveBeenCalledWith(parentRoutePageTitle); + expect(titleService.setTitle).toHaveBeenCalledWith(parentRoutePageTitle + ' translated'); + }); + + it('should set page title to child route pageTitle if child routes exist and pageTitle is set for child route', () => { + // GIVEN + routerState.snapshot.root.data = { pageTitle: parentRoutePageTitle }; + routerState.snapshot.root.firstChild = { data: { pageTitle: childRoutePageTitle } }; + + // WHEN + translateService.onLangChange.emit(langChangeEvent); + + // THEN + expect(translateService.get).toHaveBeenCalledWith(childRoutePageTitle); + expect(titleService.setTitle).toHaveBeenCalledWith(childRoutePageTitle + ' translated'); + }); + + it('should set page title to parent route pageTitle if child routes exists but pageTitle is not set for child route data', () => { + // GIVEN + routerState.snapshot.root.data = { pageTitle: parentRoutePageTitle }; + routerState.snapshot.root.firstChild = { data: {} }; + + // WHEN + translateService.onLangChange.emit(langChangeEvent); + + // THEN + expect(translateService.get).toHaveBeenCalledWith(parentRoutePageTitle); + expect(titleService.setTitle).toHaveBeenCalledWith(parentRoutePageTitle + ' translated'); + }); + + it('should set page title to parent route pageTitle if child routes exists but data is not set for child route', () => { + // GIVEN + routerState.snapshot.root.data = { pageTitle: parentRoutePageTitle }; + routerState.snapshot.root.firstChild = {}; + + // WHEN + translateService.onLangChange.emit(langChangeEvent); + + // THEN + expect(translateService.get).toHaveBeenCalledWith(parentRoutePageTitle); + expect(titleService.setTitle).toHaveBeenCalledWith(parentRoutePageTitle + ' translated'); + }); + }); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/layouts/navbar/navbar.component.spec.ts b/borestop/src/test/javascript/spec/app/layouts/navbar/navbar.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..ab8fc448078a91616cad02f94bce67ae50e14284 --- /dev/null +++ b/borestop/src/test/javascript/spec/app/layouts/navbar/navbar.component.spec.ts @@ -0,0 +1,52 @@ +import { ComponentFixture, TestBed, async } from '@angular/core/testing'; +import { of } from 'rxjs'; + +import { BorestopTestModule } from '../../../test.module'; +import { ProfileInfo } from 'app/layouts/profiles/profile-info.model'; +import { NavbarComponent } from 'app/layouts/navbar/navbar.component'; +import { AccountService } from 'app/core/auth/account.service'; +import { ProfileService } from 'app/layouts/profiles/profile.service'; + +describe('Component Tests', () => { + describe('Navbar Component', () => { + let comp: NavbarComponent; + let fixture: ComponentFixture<NavbarComponent>; + let accountService: AccountService; + let profileService: ProfileService; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [NavbarComponent] + }) + .overrideTemplate(NavbarComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(NavbarComponent); + comp = fixture.componentInstance; + accountService = TestBed.get(AccountService); + profileService = TestBed.get(ProfileService); + }); + + it('Should call profileService.getProfileInfo on init', () => { + // GIVEN + spyOn(profileService, 'getProfileInfo').and.returnValue(of(new ProfileInfo())); + + // WHEN + comp.ngOnInit(); + + // THEN + expect(profileService.getProfileInfo).toHaveBeenCalled(); + }); + + it('Should call accountService.isAuthenticated on authentication', () => { + // WHEN + comp.isAuthenticated(); + + // THEN + expect(accountService.isAuthenticated).toHaveBeenCalled(); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/shared/alert/alert-error.component.spec.ts b/borestop/src/test/javascript/spec/app/shared/alert/alert-error.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..73e58918eb5833930c616fad758f38f1d9283afd --- /dev/null +++ b/borestop/src/test/javascript/spec/app/shared/alert/alert-error.component.spec.ts @@ -0,0 +1,141 @@ +import { ComponentFixture, TestBed, async } from '@angular/core/testing'; +import { HttpErrorResponse, HttpHeaders } from '@angular/common/http'; +import { JhiAlertService, JhiEventManager } from 'ng-jhipster'; +import { TranslateModule } from '@ngx-translate/core'; + +import { BorestopTestModule } from '../../../test.module'; +import { AlertErrorComponent } from 'app/shared/alert/alert-error.component'; +import { MockAlertService } from '../../../helpers/mock-alert.service'; + +describe('Component Tests', () => { + describe('Alert Error Component', () => { + let comp: AlertErrorComponent; + let fixture: ComponentFixture<AlertErrorComponent>; + let eventManager: JhiEventManager; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule, TranslateModule.forRoot()], + declarations: [AlertErrorComponent], + providers: [ + JhiEventManager, + { + provide: JhiAlertService, + useClass: MockAlertService + } + ] + }) + .overrideTemplate(AlertErrorComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AlertErrorComponent); + comp = fixture.componentInstance; + eventManager = fixture.debugElement.injector.get(JhiEventManager); + }); + + describe('Error Handling', () => { + it('Should display an alert on status 0', () => { + // GIVEN + eventManager.broadcast({ name: 'borestopApp.httpError', content: { status: 0 } }); + // THEN + expect(comp.alerts.length).toBe(1); + expect(comp.alerts[0].msg).toBe('error.server.not.reachable'); + }); + + it('Should display an alert on status 404', () => { + // GIVEN + eventManager.broadcast({ name: 'borestopApp.httpError', content: { status: 404 } }); + // THEN + expect(comp.alerts.length).toBe(1); + expect(comp.alerts[0].msg).toBe('error.url.not.found'); + }); + + it('Should display an alert on generic error', () => { + // GIVEN + eventManager.broadcast({ name: 'borestopApp.httpError', content: { error: { message: 'Error Message' } } }); + eventManager.broadcast({ name: 'borestopApp.httpError', content: { error: 'Second Error Message' } }); + // THEN + expect(comp.alerts.length).toBe(2); + expect(comp.alerts[0].msg).toBe('Error Message'); + expect(comp.alerts[1].msg).toBe('Second Error Message'); + }); + + it('Should display an alert on status 400 for generic error', () => { + // GIVEN + const response = new HttpErrorResponse({ + url: 'http://localhost:8080/api/foos', + headers: new HttpHeaders(), + status: 400, + statusText: 'Bad Request', + error: { + type: 'https://www.jhipster.tech/problem/constraint-violation', + title: 'Bad Request', + status: 400, + path: '/api/foos', + message: 'error.validation' + } + }); + eventManager.broadcast({ name: 'borestopApp.httpError', content: response }); + // THEN + expect(comp.alerts.length).toBe(1); + expect(comp.alerts[0].msg).toBe('error.validation'); + }); + + it('Should display an alert on status 400 for generic error without message', () => { + // GIVEN + const response = new HttpErrorResponse({ + url: 'http://localhost:8080/api/foos', + headers: new HttpHeaders(), + status: 400, + error: 'Bad Request' + }); + eventManager.broadcast({ name: 'borestopApp.httpError', content: response }); + // THEN + expect(comp.alerts.length).toBe(1); + expect(comp.alerts[0].msg).toBe('Bad Request'); + }); + + it('Should display an alert on status 400 for invalid parameters', () => { + // GIVEN + const response = new HttpErrorResponse({ + url: 'http://localhost:8080/api/foos', + headers: new HttpHeaders(), + status: 400, + statusText: 'Bad Request', + error: { + type: 'https://www.jhipster.tech/problem/constraint-violation', + title: 'Method argument not valid', + status: 400, + path: '/api/foos', + message: 'error.validation', + fieldErrors: [{ objectName: 'foo', field: 'minField', message: 'Min' }] + } + }); + eventManager.broadcast({ name: 'borestopApp.httpError', content: response }); + // THEN + expect(comp.alerts.length).toBe(1); + expect(comp.alerts[0].msg).toBe('error.Size'); + }); + + it('Should display an alert on status 400 for error headers', () => { + // GIVEN + const response = new HttpErrorResponse({ + url: 'http://localhost:8080/api/foos', + headers: new HttpHeaders().append('app-error', 'Error Message').append('app-params', 'foo'), + status: 400, + statusText: 'Bad Request', + error: { + status: 400, + message: 'error.validation' + } + }); + eventManager.broadcast({ name: 'borestopApp.httpError', content: response }); + // THEN + expect(comp.alerts.length).toBe(1); + expect(comp.alerts[0].msg).toBe('Error Message'); + }); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/shared/alert/alert.component.spec.ts b/borestop/src/test/javascript/spec/app/shared/alert/alert.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..36cdb5f21865d606c178d0c895b8d51c48fb9235 --- /dev/null +++ b/borestop/src/test/javascript/spec/app/shared/alert/alert.component.spec.ts @@ -0,0 +1,44 @@ +import { ComponentFixture, TestBed, async } from '@angular/core/testing'; +import { JhiAlertService } from 'ng-jhipster'; + +import { BorestopTestModule } from '../../../test.module'; +import { AlertComponent } from 'app/shared/alert/alert.component'; + +describe('Component Tests', () => { + describe('Alert Component', () => { + let comp: AlertComponent; + let fixture: ComponentFixture<AlertComponent>; + let alertService: JhiAlertService; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [AlertComponent] + }) + .overrideTemplate(AlertComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AlertComponent); + comp = fixture.componentInstance; + alertService = TestBed.get(JhiAlertService); + }); + + it('Should call alertService.get on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(alertService.get).toHaveBeenCalled(); + }); + + it('Should call alertService.clear on destroy', () => { + // WHEN + comp.ngOnDestroy(); + + // THEN + expect(alertService.clear).toHaveBeenCalled(); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/app/shared/login/login.component.spec.ts b/borestop/src/test/javascript/spec/app/shared/login/login.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..96fd89e1f2a57d4cd20c8b907c7cc0898f94aad9 --- /dev/null +++ b/borestop/src/test/javascript/spec/app/shared/login/login.component.spec.ts @@ -0,0 +1,116 @@ +import { ComponentFixture, TestBed, async, inject, fakeAsync, tick } from '@angular/core/testing'; +import { FormBuilder } from '@angular/forms'; +import { Router } from '@angular/router'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { LoginService } from 'app/core/login/login.service'; +import { LoginModalComponent } from 'app/shared/login/login.component'; +import { BorestopTestModule } from '../../../test.module'; +import { MockLoginService } from '../../../helpers/mock-login.service'; +import { MockRouter } from '../../../helpers/mock-route.service'; +import { MockActiveModal } from '../../../helpers/mock-active-modal.service'; + +describe('Component Tests', () => { + describe('LoginComponent', () => { + let comp: LoginModalComponent; + let fixture: ComponentFixture<LoginModalComponent>; + let mockLoginService: MockLoginService; + let mockRouter: MockRouter; + let mockActiveModal: MockActiveModal; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [BorestopTestModule], + declarations: [LoginModalComponent], + providers: [ + FormBuilder, + { + provide: LoginService, + useClass: MockLoginService + } + ] + }) + .overrideTemplate(LoginModalComponent, '') + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(LoginModalComponent); + comp = fixture.componentInstance; + mockLoginService = TestBed.get(LoginService); + mockRouter = TestBed.get(Router); + mockActiveModal = TestBed.get(NgbActiveModal); + }); + + it('should authenticate the user', inject( + [], + fakeAsync(() => { + // GIVEN + const credentials = { + username: 'admin', + password: 'admin', + rememberMe: true + }; + + comp.loginForm.patchValue({ + username: 'admin', + password: 'admin', + rememberMe: true + }); + mockLoginService.setResponse({}); + mockRouter.url = '/admin/metrics'; + + // WHEN/ + comp.login(); + tick(); // simulate async + + // THEN + expect(comp.authenticationError).toEqual(false); + expect(mockActiveModal.closeSpy).toHaveBeenCalled(); + expect(mockLoginService.loginSpy).toHaveBeenCalledWith(credentials); + }) + )); + + it('should empty the credentials upon cancel', () => { + // GIVEN + comp.loginForm.patchValue({ + username: 'admin', + password: 'admin' + }); + + const expected = { + username: '', + password: '', + rememberMe: false + }; + + // WHEN + comp.cancel(); + + // THEN + expect(comp.authenticationError).toEqual(false); + expect(comp.loginForm.get('username')!.value).toEqual(expected.username); + expect(comp.loginForm.get('password')!.value).toEqual(expected.password); + expect(comp.loginForm.get('rememberMe')!.value).toEqual(expected.rememberMe); + expect(mockActiveModal.dismissSpy).toHaveBeenCalledWith('cancel'); + }); + + it('should redirect user when register', () => { + // WHEN + comp.register(); + + // THEN + expect(mockActiveModal.dismissSpy).toHaveBeenCalledWith('to state register'); + expect(mockRouter.navigateSpy).toHaveBeenCalledWith(['/account/register']); + }); + + it('should redirect user when request password', () => { + // WHEN + comp.requestResetPassword(); + + // THEN + expect(mockActiveModal.dismissSpy).toHaveBeenCalledWith('to state requestReset'); + expect(mockRouter.navigateSpy).toHaveBeenCalledWith(['/account/reset', 'request']); + }); + }); +}); diff --git a/borestop/src/test/javascript/spec/helpers/mock-account.service.ts b/borestop/src/test/javascript/spec/helpers/mock-account.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..b75655c50f6ba5f2baa1b11c196cbfe9cce979b6 --- /dev/null +++ b/borestop/src/test/javascript/spec/helpers/mock-account.service.ts @@ -0,0 +1,31 @@ +import Spy = jasmine.Spy; +import { of } from 'rxjs'; + +import { SpyObject } from './spyobject'; +import { AccountService } from 'app/core/auth/account.service'; +import { Account } from 'app/core/user/account.model'; + +export class MockAccountService extends SpyObject { + getSpy: Spy; + saveSpy: Spy; + authenticateSpy: Spy; + identitySpy: Spy; + getAuthenticationStateSpy: Spy; + isAuthenticated: Spy; + + constructor() { + super(AccountService); + + this.getSpy = this.spy('get').andReturn(this); + this.saveSpy = this.spy('save').andReturn(this); + this.authenticateSpy = this.spy('authenticate').andReturn(this); + this.identitySpy = this.spy('identity').andReturn(of(null)); + this.getAuthenticationStateSpy = this.spy('getAuthenticationState').andReturn(of(null)); + this.isAuthenticated = this.spy('isAuthenticated').andReturn(true); + } + + setIdentityResponse(account: Account | null): void { + this.identitySpy = this.spy('identity').andReturn(of(account)); + this.getAuthenticationStateSpy = this.spy('getAuthenticationState').andReturn(of(account)); + } +} diff --git a/borestop/src/test/javascript/spec/helpers/mock-active-modal.service.ts b/borestop/src/test/javascript/spec/helpers/mock-active-modal.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..bd32d740b7c6738335c81622396a8d591ae61f92 --- /dev/null +++ b/borestop/src/test/javascript/spec/helpers/mock-active-modal.service.ts @@ -0,0 +1,15 @@ +import Spy = jasmine.Spy; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { SpyObject } from './spyobject'; + +export class MockActiveModal extends SpyObject { + dismissSpy: Spy; + closeSpy: Spy; + + constructor() { + super(NgbActiveModal); + this.dismissSpy = this.spy('dismiss').andReturn(this); + this.closeSpy = this.spy('close').andReturn(this); + } +} diff --git a/borestop/src/test/javascript/spec/helpers/mock-alert.service.ts b/borestop/src/test/javascript/spec/helpers/mock-alert.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..2bf772462621b7b3d793f09b3dc536fa2034946a --- /dev/null +++ b/borestop/src/test/javascript/spec/helpers/mock-alert.service.ts @@ -0,0 +1,13 @@ +import { JhiAlertService, JhiAlert } from 'ng-jhipster'; + +import { SpyObject } from './spyobject'; + +export class MockAlertService extends SpyObject { + constructor() { + super(JhiAlertService); + } + + addAlert(alertOptions: JhiAlert): JhiAlert { + return alertOptions; + } +} diff --git a/borestop/src/test/javascript/spec/helpers/mock-event-manager.service.ts b/borestop/src/test/javascript/spec/helpers/mock-event-manager.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..4a8f56aeae8691b09dcf6a96ffe60e6e446f189d --- /dev/null +++ b/borestop/src/test/javascript/spec/helpers/mock-event-manager.service.ts @@ -0,0 +1,13 @@ +import Spy = jasmine.Spy; +import { JhiEventManager } from 'ng-jhipster'; + +import { SpyObject } from './spyobject'; + +export class MockEventManager extends SpyObject { + broadcastSpy: Spy; + + constructor() { + super(JhiEventManager); + this.broadcastSpy = this.spy('broadcast').andReturn(this); + } +} diff --git a/borestop/src/test/javascript/spec/helpers/mock-language.service.ts b/borestop/src/test/javascript/spec/helpers/mock-language.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..2438a44fa23e8f49360cd860e06ae7d78297c3b6 --- /dev/null +++ b/borestop/src/test/javascript/spec/helpers/mock-language.service.ts @@ -0,0 +1,14 @@ +import Spy = jasmine.Spy; +import { JhiLanguageService } from 'ng-jhipster'; + +import { SpyObject } from './spyobject'; + +export class MockLanguageService extends SpyObject { + getCurrentLanguageSpy: Spy; + + constructor() { + super(JhiLanguageService); + + this.getCurrentLanguageSpy = this.spy('getCurrentLanguage').andReturn('en'); + } +} diff --git a/borestop/src/test/javascript/spec/helpers/mock-login-modal.service.ts b/borestop/src/test/javascript/spec/helpers/mock-login-modal.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..1c0f7c35af618af4f5a89b3a0a687065960998a4 --- /dev/null +++ b/borestop/src/test/javascript/spec/helpers/mock-login-modal.service.ts @@ -0,0 +1,14 @@ +import Spy = jasmine.Spy; + +import { SpyObject } from './spyobject'; +import { LoginModalService } from 'app/core/login/login-modal.service'; + +export class MockLoginModalService extends SpyObject { + open: Spy; + + constructor() { + super(LoginModalService); + + this.open = this.spy('open'); + } +} diff --git a/borestop/src/test/javascript/spec/helpers/mock-login.service.ts b/borestop/src/test/javascript/spec/helpers/mock-login.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..a75a8004565ea9d7a5de7a6d8500318b416c8110 --- /dev/null +++ b/borestop/src/test/javascript/spec/helpers/mock-login.service.ts @@ -0,0 +1,27 @@ +import Spy = jasmine.Spy; +import { of } from 'rxjs'; + +import { SpyObject } from './spyobject'; +import { LoginService } from 'app/core/login/login.service'; + +export class MockLoginService extends SpyObject { + loginSpy: Spy; + logoutSpy: Spy; + registerSpy: Spy; + requestResetPasswordSpy: Spy; + cancelSpy: Spy; + + constructor() { + super(LoginService); + + this.loginSpy = this.spy('login').andReturn(of({})); + this.logoutSpy = this.spy('logout').andReturn(this); + this.registerSpy = this.spy('register').andReturn(this); + this.requestResetPasswordSpy = this.spy('requestResetPassword').andReturn(this); + this.cancelSpy = this.spy('cancel').andReturn(this); + } + + setResponse(json: any): void { + this.loginSpy = this.spy('login').andReturn(of(json)); + } +} diff --git a/borestop/src/test/javascript/spec/helpers/mock-route.service.ts b/borestop/src/test/javascript/spec/helpers/mock-route.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..e0458630eb45812f7490fe51ff47a2c33a1f3910 --- /dev/null +++ b/borestop/src/test/javascript/spec/helpers/mock-route.service.ts @@ -0,0 +1,50 @@ +import Spy = jasmine.Spy; +import { ActivatedRoute, Router, RouterEvent, Data, Params } from '@angular/router'; +import { Observable, ReplaySubject } from 'rxjs'; + +import { SpyObject } from './spyobject'; + +export class MockActivatedRoute extends ActivatedRoute { + private queryParamsSubject = new ReplaySubject<Params>(); + private paramSubject = new ReplaySubject<Params>(); + private dataSubject = new ReplaySubject<Data>(); + + constructor(parameters: Params) { + super(); + this.queryParams = this.queryParamsSubject.asObservable(); + this.params = this.paramSubject.asObservable(); + this.data = this.dataSubject.asObservable(); + this.setParameters(parameters); + } + + setParameters(parameters: Params): void { + this.queryParamsSubject.next(parameters); + this.paramSubject.next(parameters); + this.dataSubject.next({ + ...parameters, + defaultSort: 'id,desc' + }); + } +} + +export class MockRouter extends SpyObject { + navigateSpy: Spy; + navigateByUrlSpy: Spy; + events: Observable<RouterEvent> | null = null; + routerState: any; + url = ''; + + constructor() { + super(Router); + this.navigateSpy = this.spy('navigate'); + this.navigateByUrlSpy = this.spy('navigateByUrl'); + } + + setEvents(events: Observable<RouterEvent>): void { + this.events = events; + } + + setRouterState(routerState: any): void { + this.routerState = routerState; + } +} diff --git a/borestop/src/test/javascript/spec/helpers/mock-state-storage.service.ts b/borestop/src/test/javascript/spec/helpers/mock-state-storage.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..1a23343dcbea235665691e7c47c69153c9345594 --- /dev/null +++ b/borestop/src/test/javascript/spec/helpers/mock-state-storage.service.ts @@ -0,0 +1,21 @@ +import Spy = jasmine.Spy; + +import { SpyObject } from './spyobject'; +import { StateStorageService } from 'app/core/auth/state-storage.service'; + +export class MockStateStorageService extends SpyObject { + getUrlSpy: Spy; + storeUrlSpy: Spy; + clearUrlSpy: Spy; + + constructor() { + super(StateStorageService); + this.getUrlSpy = this.spy('getUrl').andReturn(null); + this.storeUrlSpy = this.spy('storeUrl').andReturn(this); + this.clearUrlSpy = this.spy('clearUrl').andReturn(this); + } + + setResponse(previousUrl: string | null): void { + this.getUrlSpy = this.spy('getUrl').andReturn(previousUrl); + } +} diff --git a/borestop/src/test/javascript/spec/helpers/spyobject.ts b/borestop/src/test/javascript/spec/helpers/spyobject.ts new file mode 100644 index 0000000000000000000000000000000000000000..eeb221a9a45b563ea995ab74e60bfb2c309ab514 --- /dev/null +++ b/borestop/src/test/javascript/spec/helpers/spyobject.ts @@ -0,0 +1,48 @@ +export interface GuinessCompatibleSpy extends jasmine.Spy { + /** By chaining the spy with and.returnValue, all calls to the function will return a specific + * value. */ + andReturn(val: any): GuinessCompatibleSpy; + /** By chaining the spy with and.callFake, all calls to the spy will delegate to the supplied + * function. */ + andCallFake(fn: Function): GuinessCompatibleSpy; + /** removes all recorded calls */ + reset(): void; +} + +export class SpyObject { + constructor(type?: any) { + if (type) { + Object.keys(type.prototype).forEach(prop => { + let m = null; + try { + m = type.prototype[prop]; + } catch (e) { + // As we are creating spys for abstract classes, + // these classes might have getters that throw when they are accessed. + // As we are only auto creating spys for methods, this + // should not matter. + } + if (typeof m === 'function') { + this.spy(prop); + } + }); + } + } + + spy(name: string): GuinessCompatibleSpy { + if (!this[name]) { + this[name] = this.createGuinnessCompatibleSpy(name); + } + return this[name]; + } + + private createGuinnessCompatibleSpy(name: string): GuinessCompatibleSpy { + const newSpy: GuinessCompatibleSpy = jasmine.createSpy(name) as any; + newSpy.andCallFake = newSpy.and.callFake as any; + newSpy.andReturn = newSpy.and.returnValue as any; + newSpy.reset = newSpy.calls.reset as any; + // revisit return null here (previously needed for rtts_assert). + newSpy.and.returnValue(null); + return newSpy; + } +} diff --git a/borestop/src/test/javascript/spec/test.module.ts b/borestop/src/test/javascript/spec/test.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..0e044235852c120060c711c41e966991e21b2ada --- /dev/null +++ b/borestop/src/test/javascript/spec/test.module.ts @@ -0,0 +1,72 @@ +import { DatePipe } from '@angular/common'; +import { ActivatedRoute, Router } from '@angular/router'; +import { NgModule } from '@angular/core'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { NgbActiveModal, NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { SessionStorageService, LocalStorageService } from 'ngx-webstorage'; +import { JhiLanguageService, JhiDataUtils, JhiDateUtils, JhiEventManager, JhiAlertService, JhiParseLinks } from 'ng-jhipster'; + +import { MockLanguageService } from './helpers/mock-language.service'; +import { AccountService } from 'app/core/auth/account.service'; +import { LoginModalService } from 'app/core/login/login-modal.service'; +import { MockLoginModalService } from './helpers/mock-login-modal.service'; +import { MockAccountService } from './helpers/mock-account.service'; +import { MockActivatedRoute, MockRouter } from './helpers/mock-route.service'; +import { MockActiveModal } from './helpers/mock-active-modal.service'; +import { MockAlertService } from './helpers/mock-alert.service'; +import { MockEventManager } from './helpers/mock-event-manager.service'; + +@NgModule({ + providers: [ + DatePipe, + JhiDataUtils, + JhiDateUtils, + JhiParseLinks, + { + provide: JhiLanguageService, + useClass: MockLanguageService + }, + { + provide: JhiEventManager, + useClass: MockEventManager + }, + { + provide: NgbActiveModal, + useClass: MockActiveModal + }, + { + provide: ActivatedRoute, + useValue: new MockActivatedRoute({ id: 123 }) + }, + { + provide: Router, + useClass: MockRouter + }, + { + provide: AccountService, + useClass: MockAccountService + }, + { + provide: LoginModalService, + useClass: MockLoginModalService + }, + { + provide: JhiAlertService, + useClass: MockAlertService + }, + { + provide: NgbModal, + useValue: null + }, + { + provide: SessionStorageService, + useValue: null + }, + { + provide: LocalStorageService, + useValue: null + } + ], + imports: [HttpClientTestingModule] +}) +export class BorestopTestModule {} diff --git a/borestop/src/test/resources/config/application-testcontainers.yml b/borestop/src/test/resources/config/application-testcontainers.yml new file mode 100644 index 0000000000000000000000000000000000000000..81aafc15a776169a486dff81f460beefb4e6aab5 --- /dev/null +++ b/borestop/src/test/resources/config/application-testcontainers.yml @@ -0,0 +1,22 @@ +# =================================================================== +# Spring Boot configuration. +# +# This configuration is used for unit/integration tests with testcontainers database containers. +# +# To activate this configuration launch integration tests with the 'testcontainers' profile +# +# More information on database containers: https://www.testcontainers.org/modules/databases/ +# =================================================================== + +spring: + datasource: + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver + url: jdbc:tc:postgresql:latest:///borestop?TC_TMPFS=/testtmpfs:rw + username: borestop + password: + hikari: + poolName: Hikari + auto-commit: false + jpa: + database-platform: io.github.jhipster.domain.util.FixedPostgreSQL10Dialect diff --git a/borestop/src/test/resources/config/application.yml b/borestop/src/test/resources/config/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..5eb3945b2edf299e0e70cef33f924d4b2ce18a06 --- /dev/null +++ b/borestop/src/test/resources/config/application.yml @@ -0,0 +1,117 @@ +# =================================================================== +# Spring Boot configuration. +# +# This configuration is used for unit/integration tests. +# +# More information on profiles: https://www.jhipster.tech/profiles/ +# More information on configuration properties: https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +# =================================================================== +# Standard Spring Boot properties. +# Full reference is available at: +# http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html +# =================================================================== + +spring: + profiles: + # Uncomment the following line to enable tests against production database type rather than H2, using Testcontainers + #active: testcontainers + application: + name: borestop + datasource: + type: com.zaxxer.hikari.HikariDataSource + url: jdbc:h2:mem:borestop;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE + name: + username: + password: + hikari: + auto-commit: false + jackson: + serialization: + write-durations-as-timestamps: false + jpa: + database-platform: io.github.jhipster.domain.util.FixedH2Dialect + open-in-view: false + show-sql: false + hibernate: + ddl-auto: none + naming: + physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy + implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy + properties: + hibernate.id.new_generator_mappings: true + hibernate.connection.provider_disables_autocommit: true + hibernate.cache.use_second_level_cache: false + hibernate.cache.use_query_cache: false + hibernate.generate_statistics: false + hibernate.hbm2ddl.auto: validate + hibernate.jdbc.time_zone: UTC + liquibase: + contexts: test + mail: + host: localhost + main: + allow-bean-definition-overriding: true + messages: + basename: i18n/messages + task: + execution: + thread-name-prefix: borestop-task- + pool: + core-size: 1 + max-size: 50 + queue-capacity: 10000 + scheduling: + thread-name-prefix: borestop-scheduling- + pool: + size: 1 + thymeleaf: + mode: HTML + +server: + port: 10344 + address: localhost + +# =================================================================== +# JHipster specific properties +# +# Full reference is available at: https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +jhipster: + clientApp: + name: 'borestopApp' + logging: + # To test json console appender + use-json-format: false + logstash: + enabled: false + host: localhost + port: 5000 + queue-size: 512 + mail: + from: test@localhost + base-url: http://127.0.0.1:8080 + security: + authentication: + jwt: + # This token must be encoded using Base64 (you can type `echo 'secret-key'|base64` on your command line) + base64-secret: NzdiMjRkMmMxZDNkMGY2ZWIyYTcxYWNhYzM4YTBiZjMzOWQzZDQyM2VjY2UwOGRlZDVjZTNiOTdkMWMzNWEzZGNkNzg4YTk2ZDFhZWYwMjUxZjU1ZWFiY2U1ZjA2ZDI1MzFiNTJmMTk5NzE2ZmIzMTE0YzMwYTMzODliYzhhY2E= + # Token is valid 24 hours + token-validity-in-seconds: 86400 + metrics: + logs: # Reports metrics in the logs + enabled: true + report-frequency: 60 # in seconds + +# =================================================================== +# Application specific properties +# Add your own application properties here, see the ApplicationProperties class +# to have type-safe configuration, like in the JHipsterProperties above +# +# More documentation is available at: +# https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +# application: diff --git a/borestop/src/test/resources/i18n/messages_en.properties b/borestop/src/test/resources/i18n/messages_en.properties new file mode 100644 index 0000000000000000000000000000000000000000..7b3fbb99db4c5c8d0c4311ade40ba303b2f4908f --- /dev/null +++ b/borestop/src/test/resources/i18n/messages_en.properties @@ -0,0 +1,4 @@ +email.test.title=test title +# Value used for English locale unit test in MailServiceIT +# as this file is loaded instead of real file +email.activation.title=borestop account activation diff --git a/borestop/src/test/resources/logback.xml b/borestop/src/test/resources/logback.xml new file mode 100644 index 0000000000000000000000000000000000000000..8d334f268c75b77f08d31489620a5b5e71686b5f --- /dev/null +++ b/borestop/src/test/resources/logback.xml @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE configuration> + +<configuration scan="true"> + <include resource="org/springframework/boot/logging/logback/base.xml"/> + + <logger name="com.ippon.borestop" level="INFO"/> + + <logger name="io.github.jhipster" level="WARN"/> + + <logger name="javax.activation" level="WARN"/> + <logger name="javax.mail" level="WARN"/> + <logger name="javax.xml.bind" level="WARN"/> + <logger name="ch.qos.logback" level="WARN"/> + <logger name="com.ryantenney" level="WARN"/> + <logger name="com.sun" level="WARN"/> + <logger name="com.zaxxer" level="WARN"/> + <logger name="com.github.dockerjava" level="WARN"/> + <logger name="org.testcontainers" level="WARN"/> + <logger name="io.undertow" level="WARN"/> + <logger name="io.undertow.websockets.jsr" level="ERROR"/> + <logger name="org.apache" level="WARN"/> + <logger name="org.apache.catalina.startup.DigesterFactory" level="OFF"/> + <logger name="org.bson" level="WARN"/> + <logger name="org.hibernate.validator" level="WARN"/> + <logger name="org.hibernate" level="WARN"/> + <logger name="org.hibernate.ejb.HibernatePersistence" level="OFF"/> + <logger name="org.postgresql.jdbc" level="WARN"/> + <logger name="org.springframework" level="WARN"/> + <logger name="org.springframework.web" level="WARN"/> + <logger name="org.springframework.security" level="WARN"/> + <logger name="org.springframework.cache" level="WARN"/> + <logger name="org.thymeleaf" level="WARN"/> + <logger name="org.xnio" level="WARN"/> + <logger name="springfox" level="WARN"/> + <logger name="sun.rmi" level="WARN"/> + <logger name="liquibase" level="WARN"/> + <logger name="LiquibaseSchemaResolver" level="INFO"/> + <logger name="sun.rmi.transport" level="WARN"/> + <logger name="com.tngtech.archunit.core.importer" level="ERROR"/> + + <root> + <level>WARN</level> + <appender-ref ref="CONSOLE"/> + </root> + +</configuration> diff --git a/borestop/src/test/resources/templates/mail/testEmail.html b/borestop/src/test/resources/templates/mail/testEmail.html new file mode 100644 index 0000000000000000000000000000000000000000..a4ca16a79f05dcd22c3d3adad996611b5e7a8afa --- /dev/null +++ b/borestop/src/test/resources/templates/mail/testEmail.html @@ -0,0 +1 @@ +<html xmlns:th="http://www.thymeleaf.org" th:text="|#{email.test.title}, ${baseUrl}, ${user.login}|"></html> diff --git a/borestop/tsconfig.app.json b/borestop/tsconfig.app.json new file mode 100644 index 0000000000000000000000000000000000000000..5c33c96b75525374417aa29df73902546aeb2487 --- /dev/null +++ b/borestop/tsconfig.app.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.base.json", + "files": ["src/main/webapp/app/app.main.ts"] +} diff --git a/borestop/tsconfig.base.json b/borestop/tsconfig.base.json new file mode 100644 index 0000000000000000000000000000000000000000..afc0bb2aab14ada3ef4de5c4eeea0fe3dba89ccf --- /dev/null +++ b/borestop/tsconfig.base.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "target": "es6", + "module": "esnext", + "moduleResolution": "node", + "sourceMap": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "strict": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "suppressImplicitAnyIndexErrors": true, + "skipLibCheck": true, + "outDir": "target/classes/static/app", + "lib": ["es7", "dom"], + "baseUrl": "./", + "paths": { + "app/*": ["src/main/webapp/app/*"] + }, + "importHelpers": true, + "downlevelIteration": true, + "declaration": false, + "forceConsistentCasingInFileNames": true + }, + "angularCompilerOptions": { + "strictInjectionParameters": true, + "fullTemplateTypeCheck": true, + "strictTemplates": true, + "preserveWhitespaces": true + } +} diff --git a/borestop/tsconfig.json b/borestop/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..dda314604505c32a7e724bee4f0d68f18b699b0b --- /dev/null +++ b/borestop/tsconfig.json @@ -0,0 +1,11 @@ +{ + "files": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.e2e.json" + } + ] +} diff --git a/borestop/tslint.json b/borestop/tslint.json new file mode 100644 index 0000000000000000000000000000000000000000..52fb92500384158e56e3286ff140f5c1412302a9 --- /dev/null +++ b/borestop/tslint.json @@ -0,0 +1,17 @@ +{ + "rulesDirectory": ["node_modules/codelyzer"], + "rules": { + "directive-selector": [true, "attribute", "jhi", "camelCase"], + "component-selector": [true, "element", "jhi", "kebab-case"], + "no-inputs-metadata-property": true, + "no-outputs-metadata-property": true, + "no-host-metadata-property": true, + "no-input-rename": true, + "no-output-rename": true, + "use-lifecycle-interface": true, + "use-pipe-transform-interface": false, + "component-class-suffix": true, + "directive-class-suffix": true, + "typedef": [true, "call-signature"] + } +} diff --git a/borestop/webpack/logo-jhipster.png b/borestop/webpack/logo-jhipster.png new file mode 100755 index 0000000000000000000000000000000000000000..e301aa90f75e3ef8b5c5bf053186f3a02e7605d2 Binary files /dev/null and b/borestop/webpack/logo-jhipster.png differ diff --git a/borestop/webpack/utils.js b/borestop/webpack/utils.js new file mode 100644 index 0000000000000000000000000000000000000000..25620b4743a85b684178752df1469a6b8b7c1ca9 --- /dev/null +++ b/borestop/webpack/utils.js @@ -0,0 +1,39 @@ +const path = require('path'); + +const tsconfig = require('../tsconfig.base.json'); + +module.exports = { + root, + mapTypescriptAliasToWebpackAlias +}; + +const _root = path.resolve(__dirname, '..'); + +function root(args) { + args = Array.prototype.slice.call(arguments, 0); + return path.join.apply(path, [_root].concat(args)); +} + +function mapTypescriptAliasToWebpackAlias(alias = {}) { + const webpackAliases = { ...alias }; + if (!tsconfig.compilerOptions.paths) { + return webpackAliases; + } + Object.entries(tsconfig.compilerOptions.paths) + .filter(([key, value]) => { + // use Typescript alias in Webpack only if this has value + return Boolean(value.length); + }) + .map(([key, value]) => { + // if Typescript alias ends with /* then remove this for Webpack + const regexToReplace = /\/\*$/; + const aliasKey = key.replace(regexToReplace, ''); + const aliasValue = value[0].replace(regexToReplace, ''); + return [aliasKey, root(aliasValue)]; + }) + .reduce((aliases, [key, value]) => { + aliases[key] = value; + return aliases; + }, webpackAliases); + return webpackAliases; +} diff --git a/borestop/webpack/webpack.common.js b/borestop/webpack/webpack.common.js new file mode 100644 index 0000000000000000000000000000000000000000..5853fa10b5a3097e59810555b46a18a8c152c520 --- /dev/null +++ b/borestop/webpack/webpack.common.js @@ -0,0 +1,114 @@ +const webpack = require('webpack'); +const CopyWebpackPlugin = require('copy-webpack-plugin'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const AngularCompilerPlugin = require('@ngtools/webpack').AngularCompilerPlugin; +const MergeJsonWebpackPlugin = require('merge-jsons-webpack-plugin'); + +const utils = require('./utils.js'); + +module.exports = options => ({ + resolve: { + extensions: ['.ts', '.js'], + modules: ['node_modules'], + mainFields: ['es2015', 'browser', 'module', 'main'], + alias: utils.mapTypescriptAliasToWebpackAlias() + }, + stats: { + children: false + }, + module: { + rules: [ + { + test: /(?:\.ngfactory\.js|\.ngstyle\.js|\.ts)$/, + loader: '@ngtools/webpack' + }, + { + test: /\.html$/, + loader: 'html-loader', + options: { + minimize: { + caseSensitive: true, + removeAttributeQuotes: false, + minifyJS: false, + minifyCSS: false + } + }, + exclude: utils.root('src/main/webapp/index.html') + }, + { + test: /\.(jpe?g|png|gif|svg|woff2?|ttf|eot)$/i, + loader: 'file-loader', + options: { + digest: 'hex', + hash: 'sha512', + // For fixing src attr of image + // See https://github.com/jhipster/generator-jhipster/issues/11209 + name: 'content/[hash].[ext]', + esModule: false + } + }, + { + test: /manifest.webapp$/, + loader: 'file-loader', + options: { + name: 'manifest.webapp' + } + }, + // Ignore warnings about System.import in Angular + { test: /[\/\\]@angular[\/\\].+\.js$/, parser: { system: true } } + ] + }, + plugins: [ + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: `'${options.env}'`, + BUILD_TIMESTAMP: `'${new Date().getTime()}'`, + // APP_VERSION is passed as an environment variable from the Gradle / Maven build tasks. + VERSION: `'${process.env.hasOwnProperty('APP_VERSION') ? process.env.APP_VERSION : 'DEV'}'`, + DEBUG_INFO_ENABLED: options.env === 'development', + // The root URL for API calls, ending with a '/' - for example: `"https://www.jhipster.tech:8081/myservice/"`. + // If this URL is left empty (""), then it will be relative to the current context. + // If you use an API server, in `prod` mode, you will need to enable CORS + // (see the `jhipster.cors` common JHipster property in the `application-*.yml` configurations) + SERVER_API_URL: `''` + } + }), + new CopyWebpackPlugin({ + patterns: [ + { + from: './node_modules/swagger-ui-dist/*.{js,css,html,png}', + to: 'swagger-ui', + flatten: true, + globOptions: { ignore: ['**/index.html'] } + }, + { from: './node_modules/axios/dist/axios.min.js', to: 'swagger-ui' }, + { from: './src/main/webapp/swagger-ui/', to: 'swagger-ui' }, + { from: './src/main/webapp/content/', to: 'content' }, + { from: './src/main/webapp/favicon.ico', to: 'favicon.ico' }, + { from: './src/main/webapp/manifest.webapp', to: 'manifest.webapp' }, + // jhipster-needle-add-assets-to-webpack - JHipster will add/remove third-party resources in this array + { from: './src/main/webapp/robots.txt', to: 'robots.txt' } + ] + }), + new MergeJsonWebpackPlugin({ + output: { + groupBy: [ + { pattern: './src/main/webapp/i18n/en/*.json', fileName: './i18n/en.json' } + // jhipster-needle-i18n-language-webpack - JHipster will add/remove languages in this array + ] + } + }), + new HtmlWebpackPlugin({ + template: './src/main/webapp/index.html', + chunks: ['polyfills', 'main', 'global'], + chunksSortMode: 'manual', + inject: 'body', + base: '/' + }), + new AngularCompilerPlugin({ + mainPath: utils.root('src/main/webapp/app/app.main.ts'), + tsConfigPath: utils.root('tsconfig.app.json'), + sourceMap: true + }) + ] +}); diff --git a/borestop/webpack/webpack.dev.js b/borestop/webpack/webpack.dev.js new file mode 100644 index 0000000000000000000000000000000000000000..2875825b7f115b21b3d6d56500b1a4b4bc65fc45 --- /dev/null +++ b/borestop/webpack/webpack.dev.js @@ -0,0 +1,125 @@ +const webpack = require('webpack'); +const writeFilePlugin = require('write-file-webpack-plugin'); +const webpackMerge = require('webpack-merge'); +const BrowserSyncPlugin = require('browser-sync-webpack-plugin'); +const FriendlyErrorsWebpackPlugin = require('friendly-errors-webpack-plugin'); +const SimpleProgressWebpackPlugin = require('simple-progress-webpack-plugin'); +const WebpackNotifierPlugin = require('webpack-notifier'); +const path = require('path'); +const sass = require('sass'); + +const utils = require('./utils.js'); +const commonConfig = require('./webpack.common.js'); + +const ENV = 'development'; + +module.exports = options => + webpackMerge(commonConfig({ env: ENV }), { + devtool: 'eval-source-map', + devServer: { + contentBase: './target/classes/static/', + proxy: [ + { + context: ['/api', '/services', '/management', '/swagger-resources', '/v2/api-docs', '/h2-console', '/auth'], + target: `http${options.tls ? 's' : ''}://localhost:8080`, + secure: false, + changeOrigin: options.tls + } + ], + stats: options.stats, + watchOptions: { + ignored: /node_modules/ + }, + https: options.tls, + historyApiFallback: true + }, + entry: { + global: './src/main/webapp/content/scss/global.scss', + main: './src/main/webapp/app/app.main' + }, + output: { + path: utils.root('target/classes/static/'), + filename: 'app/[name].bundle.js', + chunkFilename: 'app/[id].chunk.js' + }, + module: { + rules: [ + { + test: /\.(j|t)s$/, + enforce: 'pre', + loader: 'eslint-loader', + exclude: /node_modules/ + }, + { + test: /\.scss$/, + use: [ + 'to-string-loader', + 'css-loader', + 'postcss-loader', + { + loader: 'sass-loader', + options: { implementation: sass } + } + ], + exclude: /(vendor\.scss|global\.scss)/ + }, + { + test: /(vendor\.scss|global\.scss)/, + use: [ + 'style-loader', + 'css-loader', + 'postcss-loader', + { + loader: 'sass-loader', + options: { implementation: sass } + } + ] + } + ] + }, + stats: process.env.JHI_DISABLE_WEBPACK_LOGS ? 'none' : options.stats, + plugins: [ + process.env.JHI_DISABLE_WEBPACK_LOGS + ? null + : new SimpleProgressWebpackPlugin({ + format: options.stats === 'minimal' ? 'compact' : 'expanded' + }), + new FriendlyErrorsWebpackPlugin(), + new BrowserSyncPlugin( + { + https: options.tls, + host: 'localhost', + port: 9000, + proxy: { + target: `http${options.tls ? 's' : ''}://localhost:9060`, + proxyOptions: { + changeOrigin: false //pass the Host header to the backend unchanged https://github.com/Browsersync/browser-sync/issues/430 + } + }, + socket: { + clients: { + heartbeatTimeout: 60000 + } + } + /* + ,ghostMode: { // uncomment this part to disable BrowserSync ghostMode; https://github.com/jhipster/generator-jhipster/issues/11116 + clicks: false, + location: false, + forms: false, + scroll: false + } */ + }, + { + reload: false + } + ), + new webpack.ContextReplacementPlugin(/angular(\\|\/)core(\\|\/)/, path.resolve(__dirname, './src/main/webapp/')), + new writeFilePlugin(), + new webpack.WatchIgnorePlugin([utils.root('src/test')]), + new WebpackNotifierPlugin({ + title: 'JHipster', + contentImage: path.join(__dirname, 'logo-jhipster.png') + }) + ].filter(Boolean), + mode: 'development' + }); diff --git a/borestop/webpack/webpack.prod.js b/borestop/webpack/webpack.prod.js new file mode 100644 index 0000000000000000000000000000000000000000..219e081f8209474bd48444a3a2aba66d3e7fa55a --- /dev/null +++ b/borestop/webpack/webpack.prod.js @@ -0,0 +1,154 @@ +const webpack = require('webpack'); +const webpackMerge = require('webpack-merge'); +const MiniCssExtractPlugin = require('mini-css-extract-plugin'); +const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); +const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; +const MomentLocalesPlugin = require('moment-locales-webpack-plugin'); +const TerserPlugin = require('terser-webpack-plugin'); +const WorkboxPlugin = require('workbox-webpack-plugin'); + +const utils = require('./utils.js'); +const commonConfig = require('./webpack.common.js'); + +const ENV = 'production'; +const sass = require('sass'); + +module.exports = webpackMerge(commonConfig({ env: ENV }), { + // Enable source maps. Please note that this will slow down the build. + // You have to enable it in Terser config below and in tsconfig.json as well + // devtool: 'source-map', + entry: { + global: './src/main/webapp/content/scss/global.scss', + main: './src/main/webapp/app/app.main' + }, + output: { + path: utils.root('target/classes/static/'), + filename: 'app/[name].[hash].bundle.js', + chunkFilename: 'app/[id].[hash].chunk.js' + }, + module: { + rules: [ + { + test: /\.scss$/, + use: [ + 'to-string-loader', + 'css-loader', + 'postcss-loader', + { + loader: 'sass-loader', + options: { implementation: sass } + } + ], + exclude: /(vendor\.scss|global\.scss)/ + }, + { + test: /(vendor\.scss|global\.scss)/, + use: [ + { + loader: MiniCssExtractPlugin.loader, + options: { + publicPath: '../' + } + }, + 'css-loader', + 'postcss-loader', + { + loader: 'sass-loader', + options: { implementation: sass } + } + ] + }, + { + test: /\.css$/, + use: ['to-string-loader', 'css-loader'], + exclude: /(vendor\.css|global\.css)/ + }, + { + test: /(vendor\.css|global\.css)/, + use: [ + { + loader: MiniCssExtractPlugin.loader, + options: { + publicPath: '../' + } + }, + 'css-loader', + 'postcss-loader' + ] + } + ] + }, + optimization: { + runtimeChunk: false, + minimizer: [ + new TerserPlugin({ + parallel: true, + cache: true, + // sourceMap: true, // Enable source maps. Please note that this will slow down the build + terserOptions: { + ecma: 6, + ie8: false, + toplevel: true, + module: true, + compress: { + dead_code: true, + warnings: false, + properties: true, + drop_debugger: true, + conditionals: true, + booleans: true, + loops: true, + unused: true, + toplevel: true, + if_return: true, + inline: true, + join_vars: true, + ecma: 6, + module: true + }, + output: { + comments: false, + beautify: false, + indent_level: 2, + ecma: 6 + }, + mangle: { + module: true, + toplevel: true + } + } + }), + new OptimizeCSSAssetsPlugin({}) + ] + }, + plugins: [ + new MiniCssExtractPlugin({ + // Options similar to the same options in webpackOptions.output + // both options are optional + filename: 'content/[name].[contenthash].css', + chunkFilename: 'content/[id].css' + }), + new MomentLocalesPlugin({ + localesToKeep: [ + 'en' + // jhipster-needle-i18n-language-moment-webpack - JHipster will add/remove languages in this array + ] + }), + new BundleAnalyzerPlugin({ + analyzerMode: 'static', + openAnalyzer: false, + // Webpack statistics in target folder + reportFilename: '../stats.html' + }), + new webpack.LoaderOptionsPlugin({ + minimize: true, + debug: false + }), + new WorkboxPlugin.GenerateSW({ + clientsClaim: true, + skipWaiting: true, + exclude: [/swagger-ui/] + }) + ], + mode: 'production' +});