commit 71c124cc68dd170a4e9fd0f1c8b021d3af6332a2 Author: Diego Freitas Date: Tue May 26 09:38:56 2026 -0300 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f4a963a --- /dev/null +++ b/.gitignore @@ -0,0 +1,51 @@ +# These are some examples of commonly ignored file patterns. +# You should customize this list as applicable to your project. +# Learn more about .gitignore: +# https://www.atlassian.com/git/tutorials/saving-changes/gitignore + +# Node artifact files +node_modules/ +dist/ + +# Compiled Java class files +*.class + +# Compiled Python bytecode +*.py[cod] + +# Log files +*.log + +# Package files +*.jar + +# Maven +target/ +dist/ + +# JetBrains IDE +.idea/ + +# Unit test reports +TEST*.xml + +# Generated by MacOS +.DS_Store + +# Generated by Windows +Thumbs.db + +# Applications +*.app +*.war + +# Large media files +*.mp4 +*.tiff +*.avi +*.flv +*.mov +*.wmv + + +*desktop.ini \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..8800bc9 --- /dev/null +++ b/README.md @@ -0,0 +1,27 @@ +# ZendionInc + +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.1.3. + +## Development server + +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. + +## Code scaffolding + +Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. + +## Build + +Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build. + +## Running unit tests + +Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Running end-to-end tests + +Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). diff --git a/angular.json b/angular.json new file mode 100644 index 0000000..16c1a43 --- /dev/null +++ b/angular.json @@ -0,0 +1,133 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "ZendionInc": { + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } + }, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist/ZendionInc", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.app.json", + "aot": false, + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "styles": [ + "./node_modules/@angular/material/prebuilt-themes/pink-bluegrey.css", + "src/styles.scss", + "node_modules/bootstrap/dist/css/bootstrap.min.css" + ], + "scripts": [ + "node_modules/jquery/dist/jquery.js", + "node_modules/popper.js/dist/umd/popper.js", + "node_modules/bootstrap/dist/js/bootstrap.js", + "node_modules/chart.js/dist/Chart.js" + ] + }, + "configurations": { + "production": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "extractCss": true, + "namedChunks": false, + "aot": true, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true, + "budgets": [ + { + "type": "initial", + "maximumWarning": "2mb", + "maximumError": "5mb" + } + ] + } + } + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "ZendionInc:build" + }, + "configurations": { + "production": { + "browserTarget": "ZendionInc:build:production" + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "ZendionInc:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.spec.json", + "karmaConfig": "karma.conf.js", + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "styles": [ + "./node_modules/@angular/material/prebuilt-themes/pink-bluegrey.css", + "src/styles.scss" + ], + "scripts": [] + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "tsconfig.app.json", + "tsconfig.spec.json", + "e2e/tsconfig.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + }, + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "e2e/protractor.conf.js", + "devServerTarget": "ZendionInc:serve" + }, + "configurations": { + "production": { + "devServerTarget": "ZendionInc:serve:production" + } + } + } + } + } + }, + "defaultProject": "ZendionInc" +} \ No newline at end of file diff --git a/banco.sql b/banco.sql new file mode 100644 index 0000000..536852e --- /dev/null +++ b/banco.sql @@ -0,0 +1,367 @@ +-- MySQL dump 10.13 Distrib 8.0.20, for Win64 (x86_64) +-- +-- Host: 18.228.31.8 Database: zendioninc +-- ------------------------------------------------------ +-- Server version 8.0.22-0ubuntu0.20.04.2 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `chaves` +-- + +DROP TABLE IF EXISTS `chaves`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `chaves` ( + `idchaves` int NOT NULL AUTO_INCREMENT, + `licenca` varchar(150) DEFAULT NULL, + `data_criacao` datetime DEFAULT NULL, + `data_validade` datetime DEFAULT NULL, + `idusuarios` int DEFAULT NULL, + `usada` tinyint DEFAULT NULL, + `idsistemas` int DEFAULT NULL, + `insert_date` datetime DEFAULT CURRENT_TIMESTAMP, + `update_date` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`idchaves`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `chaves` +-- + +LOCK TABLES `chaves` WRITE; +/*!40000 ALTER TABLE `chaves` DISABLE KEYS */; +/*!40000 ALTER TABLE `chaves` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `noticias` +-- + +DROP TABLE IF EXISTS `noticias`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `noticias` ( + `idnoticias` int NOT NULL AUTO_INCREMENT, + `titulo` varchar(150) DEFAULT NULL, + `descricao` longtext, + `habilitado` tinyint DEFAULT NULL, + `link` varchar(200) DEFAULT NULL, + `insert_date` datetime DEFAULT CURRENT_TIMESTAMP, + `update_date` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`idnoticias`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `noticias` +-- + +LOCK TABLES `noticias` WRITE; +/*!40000 ALTER TABLE `noticias` DISABLE KEYS */; +INSERT INTO `noticias` VALUES (1,'Teste noticia 1','Aqui entra o texto da noticia de teste 1',1,'https://www.google.com.br/','2021-03-05 23:23:01','2021-03-05 23:23:16'); +/*!40000 ALTER TABLE `noticias` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `plataformas` +-- + +DROP TABLE IF EXISTS `plataformas`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `plataformas` ( + `idplataformas` int NOT NULL AUTO_INCREMENT, + `descricao` varchar(150) DEFAULT NULL, + `habilitado` tinyint DEFAULT NULL, + `insert_date` datetime DEFAULT CURRENT_TIMESTAMP, + `update_date` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`idplataformas`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `plataformas` +-- + +LOCK TABLES `plataformas` WRITE; +/*!40000 ALTER TABLE `plataformas` DISABLE KEYS */; +/*!40000 ALTER TABLE `plataformas` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `sistemas` +-- + +DROP TABLE IF EXISTS `sistemas`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `sistemas` ( + `idsistemas` int NOT NULL AUTO_INCREMENT, + `nome` varchar(150) DEFAULT NULL, + `descricao` varchar(150) DEFAULT NULL, + `versaoatual` varchar(45) DEFAULT NULL, + `habilitado` tinyint DEFAULT NULL, + `idtiposdesistema` int DEFAULT NULL, + `idplataformas` int DEFAULT NULL, + `nome_install` varchar(150) DEFAULT NULL, + `notasdeatualizacao` longtext, + `idtiposlicenca` int DEFAULT NULL, + `insert_date` datetime DEFAULT CURRENT_TIMESTAMP, + `update_date` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`idsistemas`) +) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `sistemas` +-- + +LOCK TABLES `sistemas` WRITE; +/*!40000 ALTER TABLE `sistemas` DISABLE KEYS */; +INSERT INTO `sistemas` VALUES (9,'FMovel','Sistema de gestão de concecionaria','1.0.0.1',1,1,1,'fmovel_install.exe','Primeira versão',1,'2021-02-25 23:10:06','2021-03-04 00:30:07'); +/*!40000 ALTER TABLE `sistemas` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `sistemasdetalhes` +-- + +DROP TABLE IF EXISTS `sistemasdetalhes`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `sistemasdetalhes` ( + `idsistemasdetalhes` int NOT NULL AUTO_INCREMENT, + `idsistemas` int DEFAULT NULL, + `descricao` varchar(250) DEFAULT NULL, + `habilitado` tinyint DEFAULT NULL, + `insert_date` datetime DEFAULT CURRENT_TIMESTAMP, + `update_date` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`idsistemasdetalhes`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `sistemasdetalhes` +-- + +LOCK TABLES `sistemasdetalhes` WRITE; +/*!40000 ALTER TABLE `sistemasdetalhes` DISABLE KEYS */; +/*!40000 ALTER TABLE `sistemasdetalhes` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `sistemasusuario` +-- + +DROP TABLE IF EXISTS `sistemasusuario`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `sistemasusuario` ( + `idsistemasusuario` int NOT NULL AUTO_INCREMENT, + `idsistemas` int DEFAULT NULL, + `idusuarios` int DEFAULT NULL, + `data_download` datetime DEFAULT NULL, + `insert_date` datetime DEFAULT CURRENT_TIMESTAMP, + `update_date` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`idsistemasusuario`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `sistemasusuario` +-- + +LOCK TABLES `sistemasusuario` WRITE; +/*!40000 ALTER TABLE `sistemasusuario` DISABLE KEYS */; +/*!40000 ALTER TABLE `sistemasusuario` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `slides` +-- + +DROP TABLE IF EXISTS `slides`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `slides` ( + `idslides` int NOT NULL AUTO_INCREMENT, + `descricao` varchar(150) DEFAULT NULL, + `habilitado` tinyint DEFAULT NULL, + `link` varchar(250) DEFAULT NULL, + `insert_date` datetime DEFAULT CURRENT_TIMESTAMP, + `update_date` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`idslides`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `slides` +-- + +LOCK TABLES `slides` WRITE; +/*!40000 ALTER TABLE `slides` DISABLE KEYS */; +INSERT INTO `slides` VALUES (1,'TI',1,'undefined','2021-03-05 23:21:52','2021-03-05 23:22:04'),(2,'Inovacao',1,'undefined','2021-03-05 23:22:25','2021-03-05 23:22:30'); +/*!40000 ALTER TABLE `slides` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `tiposdesistema` +-- + +DROP TABLE IF EXISTS `tiposdesistema`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `tiposdesistema` ( + `idtiposdesistema` int NOT NULL AUTO_INCREMENT, + `descricao` varchar(150) DEFAULT NULL, + `habilitado` tinyint DEFAULT NULL, + `insert_date` datetime DEFAULT CURRENT_TIMESTAMP, + `update_date` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`idtiposdesistema`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `tiposdesistema` +-- + +LOCK TABLES `tiposdesistema` WRITE; +/*!40000 ALTER TABLE `tiposdesistema` DISABLE KEYS */; +/*!40000 ALTER TABLE `tiposdesistema` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `tiposdeusuario` +-- + +DROP TABLE IF EXISTS `tiposdeusuario`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `tiposdeusuario` ( + `idtiposdeusuario` int NOT NULL AUTO_INCREMENT, + `descricao` varchar(45) DEFAULT NULL, + `habilitado` tinyint DEFAULT NULL, + `insert_date` datetime DEFAULT CURRENT_TIMESTAMP, + `update_date` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`idtiposdeusuario`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `tiposdeusuario` +-- + +LOCK TABLES `tiposdeusuario` WRITE; +/*!40000 ALTER TABLE `tiposdeusuario` DISABLE KEYS */; +INSERT INTO `tiposdeusuario` VALUES (1,'Administrador',1,'2021-03-05 23:20:05',NULL),(2,'Cliente',1,'2021-03-05 23:20:05',NULL); +/*!40000 ALTER TABLE `tiposdeusuario` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `tiposlicenca` +-- + +DROP TABLE IF EXISTS `tiposlicenca`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `tiposlicenca` ( + `idtiposlicenca` int NOT NULL AUTO_INCREMENT, + `descricao` varchar(150) DEFAULT NULL, + `habilitado` tinyint DEFAULT NULL, + `insert_date` datetime DEFAULT CURRENT_TIMESTAMP, + `update_date` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`idtiposlicenca`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `tiposlicenca` +-- + +LOCK TABLES `tiposlicenca` WRITE; +/*!40000 ALTER TABLE `tiposlicenca` DISABLE KEYS */; +/*!40000 ALTER TABLE `tiposlicenca` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `trocasenha` +-- + +DROP TABLE IF EXISTS `trocasenha`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `trocasenha` ( + `idtrocasenha` int NOT NULL AUTO_INCREMENT, + `idusuarios` int DEFAULT NULL, + `tag` varchar(250) DEFAULT NULL, + `usada` tinyint DEFAULT NULL, + `insert_date` datetime DEFAULT CURRENT_TIMESTAMP, + `update_date` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`idtrocasenha`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `trocasenha` +-- + +LOCK TABLES `trocasenha` WRITE; +/*!40000 ALTER TABLE `trocasenha` DISABLE KEYS */; +/*!40000 ALTER TABLE `trocasenha` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `usuarios` +-- + +DROP TABLE IF EXISTS `usuarios`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `usuarios` ( + `idusuarios` int NOT NULL AUTO_INCREMENT, + `nome` varchar(150) DEFAULT NULL, + `usuario` varchar(45) DEFAULT NULL, + `senha` varchar(45) DEFAULT NULL, + `data_cadastro` datetime DEFAULT NULL, + `email` varchar(45) DEFAULT NULL, + `idtiposdeusuario` int DEFAULT NULL, + `cpf` varchar(45) DEFAULT NULL, + `habilitado` tinyint DEFAULT NULL, + `insert_date` datetime DEFAULT CURRENT_TIMESTAMP, + `update_date` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`idusuarios`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `usuarios` +-- + +LOCK TABLES `usuarios` WRITE; +/*!40000 ALTER TABLE `usuarios` DISABLE KEYS */; +INSERT INTO `usuarios` VALUES (1,'Diego Freitas','ZENDION','Z210203!','2021-03-05 23:15:50','zendionmazinni@gmail.com',1,'425.855.768-41',1,'2021-03-05 23:15:50','2021-03-05 23:18:42'); +/*!40000 ALTER TABLE `usuarios` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2021-03-05 20:27:35 diff --git a/browserslist b/browserslist new file mode 100644 index 0000000..8084853 --- /dev/null +++ b/browserslist @@ -0,0 +1,12 @@ +# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries + +# You can see what browsers were selected by your queries by running: +# npx browserslist + +> 0.5% +last 2 versions +Firefox ESR +not dead +not IE 9-11 # For IE 9-11 support, remove 'not'. \ No newline at end of file diff --git a/e2e/protractor.conf.js b/e2e/protractor.conf.js new file mode 100644 index 0000000..73e4e68 --- /dev/null +++ b/e2e/protractor.conf.js @@ -0,0 +1,32 @@ +// @ts-check +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +const { SpecReporter } = require('jasmine-spec-reporter'); + +/** + * @type { import("protractor").Config } + */ +exports.config = { + allScriptsTimeout: 11000, + specs: [ + './src/**/*.e2e-spec.ts' + ], + capabilities: { + 'browserName': 'chrome' + }, + directConnect: true, + baseUrl: 'http://localhost:4200/', + framework: 'jasmine', + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 30000, + print: function() {} + }, + onPrepare() { + require('ts-node').register({ + project: require('path').join(__dirname, './tsconfig.json') + }); + jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); + } +}; \ No newline at end of file diff --git a/e2e/src/app.e2e-spec.ts b/e2e/src/app.e2e-spec.ts new file mode 100644 index 0000000..7d0e3a5 --- /dev/null +++ b/e2e/src/app.e2e-spec.ts @@ -0,0 +1,23 @@ +import { AppPage } from './app.po'; +import { browser, logging } from 'protractor'; + +describe('workspace-project App', () => { + let page: AppPage; + + beforeEach(() => { + page = new AppPage(); + }); + + it('should display welcome message', () => { + page.navigateTo(); + expect(page.getTitleText()).toEqual('Welcome to ZendionInc!'); + }); + + afterEach(async () => { + // Assert that there are no errors emitted from the browser + const logs = await browser.manage().logs().get(logging.Type.BROWSER); + expect(logs).not.toContain(jasmine.objectContaining({ + level: logging.Level.SEVERE, + } as logging.Entry)); + }); +}); diff --git a/e2e/src/app.po.ts b/e2e/src/app.po.ts new file mode 100644 index 0000000..5776aa9 --- /dev/null +++ b/e2e/src/app.po.ts @@ -0,0 +1,11 @@ +import { browser, by, element } from 'protractor'; + +export class AppPage { + navigateTo() { + return browser.get(browser.baseUrl) as Promise; + } + + getTitleText() { + return element(by.css('app-root h1')).getText() as Promise; + } +} diff --git a/e2e/tsconfig.json b/e2e/tsconfig.json new file mode 100644 index 0000000..39b800f --- /dev/null +++ b/e2e/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/e2e", + "module": "commonjs", + "target": "es5", + "types": [ + "jasmine", + "jasminewd2", + "node" + ] + } +} diff --git a/karma.conf.js b/karma.conf.js new file mode 100644 index 0000000..8c274a5 --- /dev/null +++ b/karma.conf.js @@ -0,0 +1,32 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + dir: require('path').join(__dirname, './coverage/ZendionInc'), + reports: ['html', 'lcovonly', 'text-summary'], + fixWebpackSourcePaths: true + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false, + restartOnFileChange: true + }); +}; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..918df2e --- /dev/null +++ b/package-lock.json @@ -0,0 +1,12078 @@ +{ + "name": "zendion-inc", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.801.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.801.3.tgz", + "integrity": "sha512-gg6ZyJMiRYuzzmbpuDszrsE/hpwzoUnlOVoLNNzbACGBSDiqelC1mvGHb9JQM56Sy8gSjZn6RT0K2/Og79GoSg==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.1.3", + "rxjs": "6.4.0" + } + }, + "@angular-devkit/build-angular": { + "version": "0.801.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.801.3.tgz", + "integrity": "sha512-BmN48xepRzQN2h2L7k9MhEWSAmEJj8celtD9Tu9Gn2DeM0yh2TFW9OKFKJlqyF3vGd3at24bqHOXI4MtDeltQQ==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.801.3", + "@angular-devkit/build-optimizer": "0.801.3", + "@angular-devkit/build-webpack": "0.801.3", + "@angular-devkit/core": "8.1.3", + "@ngtools/webpack": "8.1.3", + "ajv": "6.10.0", + "autoprefixer": "9.6.0", + "browserslist": "4.6.3", + "caniuse-lite": "1.0.30000979", + "circular-dependency-plugin": "5.0.2", + "clean-css": "4.2.1", + "copy-webpack-plugin": "5.0.3", + "core-js": "3.1.4", + "file-loader": "4.0.0", + "glob": "7.1.4", + "istanbul-instrumenter-loader": "3.0.1", + "karma-source-map-support": "1.4.0", + "less": "3.9.0", + "less-loader": "5.0.0", + "license-webpack-plugin": "2.1.1", + "loader-utils": "1.2.3", + "mini-css-extract-plugin": "0.7.0", + "minimatch": "3.0.4", + "open": "6.4.0", + "parse5": "4.0.0", + "postcss": "7.0.17", + "postcss-import": "12.0.1", + "postcss-loader": "3.0.0", + "raw-loader": "1.0.0", + "rxjs": "6.4.0", + "sass": "1.22.2", + "sass-loader": "7.1.0", + "semver": "6.2.0", + "source-map-loader": "0.2.4", + "source-map-support": "0.5.12", + "speed-measure-webpack-plugin": "1.3.1", + "style-loader": "0.23.1", + "stylus": "0.54.5", + "stylus-loader": "3.0.2", + "terser-webpack-plugin": "1.3.0", + "tree-kill": "1.2.1", + "webpack": "4.35.2", + "webpack-dev-middleware": "3.7.0", + "webpack-dev-server": "3.7.2", + "webpack-merge": "4.2.1", + "webpack-sources": "1.3.0", + "webpack-subresource-integrity": "1.1.0-rc.6", + "worker-plugin": "3.1.0" + }, + "dependencies": { + "caniuse-lite": { + "version": "1.0.30000979", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000979.tgz", + "integrity": "sha512-gcu45yfq3B7Y+WB05fOMfr0EiSlq+1u+m6rPHyJli/Wy3PVQNGaU7VA4bZE5qw+AU2UVOBR/N5g1bzADUqdvFw==", + "dev": true + } + } + }, + "@angular-devkit/build-optimizer": { + "version": "0.801.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.801.3.tgz", + "integrity": "sha512-5wyzek1Ls7T9bh24yGDC/3Ss1YePpnOyBu0D8mJkByjPJjQr0xXR6UPx/7Idq6Y8BMeGO/+MiMOLZoUTPTIa0w==", + "dev": true, + "requires": { + "loader-utils": "1.2.3", + "source-map": "0.5.6", + "typescript": "3.4.5", + "webpack-sources": "1.3.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + } + } + }, + "@angular-devkit/build-webpack": { + "version": "0.801.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.801.3.tgz", + "integrity": "sha512-IuR1WKldZwrAQWlKCLv+MnNeR1tWFCSJ9wXAgKqvlAPiYHEvTvazRVbWerxgVFvL4MCOt2wYVz/AqQWVYAhwlQ==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.801.3", + "@angular-devkit/core": "8.1.3", + "rxjs": "6.4.0", + "webpack-merge": "4.2.1" + } + }, + "@angular-devkit/core": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.1.3.tgz", + "integrity": "sha512-Vj5fowuz27J+S74U1+MrSrJ7vI+OZC5HBOp4m7rrh/GcYlujcX3BUu0Bxi7LI1v90yDsr0s/iEAKsff05ByXiw==", + "dev": true, + "requires": { + "ajv": "6.10.0", + "fast-json-stable-stringify": "2.0.0", + "magic-string": "0.25.3", + "rxjs": "6.4.0", + "source-map": "0.7.3" + } + }, + "@angular-devkit/schematics": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-8.1.3.tgz", + "integrity": "sha512-nz3b0uXu3w3PPLq4D+ersjeX/AyW3Amq7UwXa8lZFoJ0oc8cPjXW+h4D56rNw2GbOGZX7aaNe/Cxd9SBt0wF2A==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.1.3", + "rxjs": "6.4.0" + } + }, + "@angular/animations": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-8.1.3.tgz", + "integrity": "sha512-IdWz2EcF+8ZM7LSZ+Kc64RNoLQK7t7hJr+3nKuiTZDncIwMcV3yPn98Jz5BncLNcK0vkYju/hPqnWJgI/0+w6A==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/cdk": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-8.2.3.tgz", + "integrity": "sha512-ZwO5Sn720RA2YvBqud0JAHkZXjmjxM0yNzCO8RVtRE9i8Gl26Wk0j0nQeJkVm4zwv2QO8MwbKUKGTMt8evsokA==", + "requires": { + "parse5": "^5.0.0", + "tslib": "^1.7.1" + }, + "dependencies": { + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "optional": true + } + } + }, + "@angular/cli": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-8.1.3.tgz", + "integrity": "sha512-8BuN+UW1etRGS2U8rnxLagcA/zCxAmrtH6cB943CecPkr3p9+VUlVXtrRU8lkQE/wdrGmJjS5qkG9TybTIPRwg==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.801.3", + "@angular-devkit/core": "8.1.3", + "@angular-devkit/schematics": "8.1.3", + "@schematics/angular": "8.1.3", + "@schematics/update": "0.801.3", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.0", + "debug": "^4.1.1", + "ini": "1.3.5", + "inquirer": "6.4.1", + "npm-package-arg": "6.1.0", + "open": "6.4.0", + "pacote": "9.5.1", + "read-package-tree": "5.3.1", + "semver": "6.2.0", + "symbol-observable": "1.2.0", + "universal-analytics": "^0.4.20", + "uuid": "^3.3.2" + }, + "dependencies": { + "ansi-colors": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.0.tgz", + "integrity": "sha512-3NkLpm6I6kEgC8J0I9EZ0fouXc/mm5J9zqJFCgA2jGqmsL0O64I7Uvi3AmUMnnRqc6u7uLgVVnY4pyBQ03nCiw==", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@angular/common": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-8.1.3.tgz", + "integrity": "sha512-AnTlYV+Y3HYjJsAIt2AkIJ63qphvu9RNIJSZS61zQ4YBty29aslAJ/jh3PSWD0Yj9UT/AgzquJhfhhNEuImDRw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/compiler": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-8.1.3.tgz", + "integrity": "sha512-mKeRkpPy/iBPGBCVQIPF9x4f1S68ilEYaQTTfHoLR0OfivEQsyGuf2GEegwbTosEBX3JF+0JHfCNvsAE1zI5Og==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/compiler-cli": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-8.1.3.tgz", + "integrity": "sha512-rzlKU/xo6AzSPBLnJ/jeSwgojn/MaByTaGFG4THLRUizfGPqAsmppQ12Nmqr9faIiuG0k/izGSoWmppCJEK8FA==", + "dev": true, + "requires": { + "canonical-path": "1.0.0", + "chokidar": "^2.1.1", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.7.2", + "magic-string": "^0.25.0", + "minimist": "^1.2.0", + "reflect-metadata": "^0.1.2", + "source-map": "^0.6.1", + "tslib": "^1.9.0", + "yargs": "13.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "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" + } + }, + "chokidar": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", + "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", + "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" + } + }, + "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" + } + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": 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-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": 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" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "is-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-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" + } + }, + "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" + } + }, + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "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" + } + }, + "yargs": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.1.0.tgz", + "integrity": "sha512-1UhJbXfzHiPqkfXNHYhiz79qM/kZqjTE8yGlEjZa85Q+3+OwcV6NRkV7XOV1W2Eom2bzILeUn55pQYffjVOLAg==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.0.0" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "@angular/core": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-8.1.3.tgz", + "integrity": "sha512-45ocymDkXhmgluhaIX/O6IgqGPCLOlSYEXYpJ660QS1JgprKU7Ae9mWiNSmbBmT0OGV/sKKF8SNMQAGOHgio6Q==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/forms": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-8.1.3.tgz", + "integrity": "sha512-NabNiUsR1XgrI1/T8hFwbTH0BMqhKd1riSTU+xyJ3qVbdmORq1xnf6/dLbljNGxViMU28P8hBXvyf1BoTS+HyQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/language-service": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-8.1.3.tgz", + "integrity": "sha512-9s2LWlRlBhUXZ0oWh5ojYKnQgXgYH/VifEXteRWmEJ0dlwDApgw5Jk6usstDhv09XQvLdoumMQwOXf07zjcJrQ==", + "dev": true + }, + "@angular/material": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-8.2.3.tgz", + "integrity": "sha512-SOczkIaqes+r+9XF/UUiokidfFKBpHkOPIaFK857sFD0FBNPvPEpOr5oHKCG3feERRwAFqHS7Wo2ohVEWypb5A==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/platform-browser": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-8.1.3.tgz", + "integrity": "sha512-ihjoJd3OCmn/LBpYEDeCYnYJ1JRzeY6xYySNBEHNHLc07FX0TTiNwiZJHjbKoxdjr7qe6cj6gpT51M77pRlKKw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/platform-browser-dynamic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-8.1.3.tgz", + "integrity": "sha512-tsZWp8aFZNvbJ1TgP75GEfrwLe4SFW02kzEF12o7XlGU/iwnMjEs356rGHeueJZuWMFGS8PLL4mqPic7R5p53Q==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/router": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-8.1.3.tgz", + "integrity": "sha512-MOalKqqWcTaosHLNE5nmk5rsLRp3jE1PobGaFtbUJKTTZW0vS4rcr6iiRg2bZRv/srGixDXvNLenvYjTpzzTdw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "dev": true, + "requires": { + "@babel/types": "^7.5.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + } + } + }, + "@babel/parser": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", + "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", + "dev": true + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "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=", + "dev": true + } + } + }, + "@ngtools/webpack": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-8.1.3.tgz", + "integrity": "sha512-gSsLMdCJsQp7ZKF5Tl/yfns1eMtmc89J+yoWiOLoSHb8cupP2G4o7DL8wGkylsyALu5eomF/RSnivC9SGvdxYQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.1.3", + "enhanced-resolve": "4.1.0", + "rxjs": "6.4.0", + "tree-kill": "1.2.1", + "webpack-sources": "1.3.0" + } + }, + "@schematics/angular": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-8.1.3.tgz", + "integrity": "sha512-DsR/LDC7Vifw78pDew4HhUYvhKM5gyY8muvJqqfAU9DLq4yZ5ixus7jpqWXNeL3ZalFcH1/yQW20nzLQiLETkA==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.1.3", + "@angular-devkit/schematics": "8.1.3" + } + }, + "@schematics/update": { + "version": "0.801.3", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.801.3.tgz", + "integrity": "sha512-Y4HlG1eMUMlu62Kw2ic1+hF9+kKJlP35o+DO4t2LHKe/Kw+P+HJUeEpr/jocUxV56LDxF43BT3hkc9yJGIQ/Yw==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.1.3", + "@angular-devkit/schematics": "8.1.3", + "@yarnpkg/lockfile": "1.1.0", + "ini": "1.3.5", + "pacote": "9.5.1", + "rxjs": "6.4.0", + "semver": "6.2.0", + "semver-intersect": "1.4.0" + } + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "dev": true + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/jasmine": { + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.3.16.tgz", + "integrity": "sha512-Nveep4zKGby8uIvG2AEUyYOwZS8uVeHK9TgbuWYSawUDDdIgfhCKz28QzamTo//Jk7Ztt9PO3f+vzlB6a4GV1Q==", + "dev": true + }, + "@types/jasminewd2": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.8.tgz", + "integrity": "sha512-d9p31r7Nxk0ZH0U39PTH0hiDlJ+qNVGjlt1ucOoTUptxb2v+Y5VMnsxfwN+i3hK4yQnqBi3FMmoMFcd1JHDxdg==", + "dev": true, + "requires": { + "@types/jasmine": "*" + } + }, + "@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/node": { + "version": "8.9.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.9.5.tgz", + "integrity": "sha512-jRHfWsvyMtXdbhnz5CVHxaBgnV6duZnPlQuRSo/dm/GnmikNcmZhxIES4E9OZjUmQ8C+HCl4KJux+cXN/ErGDQ==", + "dev": true + }, + "@types/q": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "dev": true + }, + "@types/selenium-webdriver": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz", + "integrity": "sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw==", + "dev": true + }, + "@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/swiper": { + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@types/swiper/-/swiper-4.4.11.tgz", + "integrity": "sha512-o+tYRUyVK0g2k2NGOPdn671RHoKiVjzvt+aaPkKbf6lyDfKWmAKQ7ThCs1u+5GLBWAnJsHdE/aitykpms1P7jQ==", + "dev": true + }, + "@types/webpack-sources": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.5.tgz", + "integrity": "sha512-zfvjpp7jiafSmrzJ2/i3LqOyTYTuJ7u1KOXlKgDlvsj9Rr0x7ZiYu5lZbXwobL7lmsRNtPXlBfmaUD8eU2Hu8w==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "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 + } + } + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@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" + } + }, + "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": "6.2.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.1.tgz", + "integrity": "sha512-JD0xT5FCRDNyjDda3Lrg/IxFscp9q4tiYtxE1/nOzlKCk7hIRuYjhq1kCNkbPjMRMZuFq20HNQn1I9k8Oj0E+Q==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", + "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", + "dev": true + }, + "adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", + "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" + } + }, + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "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.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "angular2-useful-swiper": { + "version": "8.0.1-beta.1", + "resolved": "https://registry.npmjs.org/angular2-useful-swiper/-/angular2-useful-swiper-8.0.1-beta.1.tgz", + "integrity": "sha512-vz3tagg/tgRHNzUPnmnhEsEhiOoQYlVEGu4tZ4PIynUzQedADaYykTjY9y+HvjbMgKhPQVH4TW6R2CcXrhJEXw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "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 + }, + "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-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": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.0.3.tgz", + "integrity": "sha512-c6IvoeBECQlMVuYUjSwimnhmztImpErfxJzWZhIQinIvQWoGOnB0dLIgifbPHQt5heS6mNlaZG16f06H3C8t1g==", + "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 + }, + "append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "dev": true, + "requires": { + "default-require-extensions": "^2.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "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" + } + }, + "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-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "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" + } + }, + "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": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "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": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "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 + }, + "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" + } + }, + "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-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "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.6.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.0.tgz", + "integrity": "sha512-kuip9YilBqhirhHEGHaBTZKXL//xxGnzvsD0FtBQa6z+A69qZD6s/BAX9VzDF1i9VKDquTJDQaPLSEhOnL6FvQ==", + "dev": true, + "requires": { + "browserslist": "^4.6.1", + "caniuse-lite": "^1.0.30000971", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.16", + "postcss-value-parser": "^3.3.1" + } + }, + "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.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "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-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "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" + } + }, + "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 + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "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 + } + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "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": { + "core-js": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", + "dev": true + } + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "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=", + "dev": true + }, + "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.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "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" + } + }, + "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.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "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 + }, + "blocking-proxy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", + "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "bluebird": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", + "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "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": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "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 + } + } + }, + "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" + } + }, + "bootstrap": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.0.tgz", + "integrity": "sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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 + }, + "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" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-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.6.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.3.tgz", + "integrity": "sha512-CNBqTCq22RKM8wKJNowcqihHJ4SkI8CGeK7KOR9tPboXUuS5Zk5lQgzzTbs4oxD8x+6HUshZUa2OyNI9lR93bQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000975", + "electron-to-chromium": "^1.3.164", + "node-releases": "^1.1.23" + } + }, + "browserstack": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.6.1.tgz", + "integrity": "sha512-GxtFjpIaKdbAyzHfFDKixKO8IBT7wR3NjbzrGc78nNs/Ciys9wU3/nBtsqsWv5nDSrdI5tz0peKuzCPuNXNUiw==", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "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.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", + "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", + "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", + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001197", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001197.tgz", + "integrity": "sha512-8aE+sqBqtXz4G8g35Eg/XEaFr2N7rd/VQ6eABGBmNtcB8cN6qNJhMi6oSFy4UWWZgqgL3filHT8Nha4meu3tsw==", + "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 + }, + "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==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chart.js": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.7.3.tgz", + "integrity": "sha512-3+7k/DbR92m6BsMUYP6M0dMsMVZpMnwkUyNSAbqolHKsbIzH2Q4LWVEHHYq7v0fmEV8whXE0DrjANulw9j2K5g==", + "requires": { + "chartjs-color": "^2.1.0", + "moment": "^2.10.2" + } + }, + "chartjs-color": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chartjs-color/-/chartjs-color-2.4.1.tgz", + "integrity": "sha512-haqOg1+Yebys/Ts/9bLo/BqUcONQOdr/hoEr2LLTRl6C5LXctUdHxsCYfvQVg5JIxITrfCNUDr4ntqmQk9+/0w==", + "requires": { + "chartjs-color-string": "^0.6.0", + "color-convert": "^1.9.3" + } + }, + "chartjs-color-string": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/chartjs-color-string/-/chartjs-color-string-0.6.0.tgz", + "integrity": "sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A==", + "requires": { + "color-name": "^1.0.0" + } + }, + "chokidar": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.0.2.tgz", + "integrity": "sha512-c4PR2egjNjI1um6bamCQ6bUNPDiyofNQruHvKgHQ4gDUP/ITSVSzNsiI5OWtHOsX323i5ha/kk4YmOZ1Ktg7KA==", + "dev": true, + "requires": { + "anymatch": "^3.0.1", + "braces": "^3.0.2", + "fsevents": "^2.0.6", + "glob-parent": "^5.0.0", + "is-binary-path": "^2.1.0", + "is-glob": "^4.0.1", + "normalize-path": "^3.0.0", + "readdirp": "^3.1.1" + }, + "dependencies": { + "glob-parent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz", + "integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "chownr": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", + "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==", + "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" + } + }, + "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" + } + }, + "circular-dependency-plugin": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.0.2.tgz", + "integrity": "sha512-oC7/DVAyfcY3UWKm0sN/oVoDedQDQiw/vIiAnuTWTpE5s0zWf7l3WY417Xw/Fbi/QbAjctAkxgMiS9P0s3zkmA==", + "dev": true + }, + "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.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "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 + } + } + }, + "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" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-deep": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", + "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.0", + "shallow-clone": "^1.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "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" + }, + "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 + }, + "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 + } + } + }, + "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-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=" + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "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.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "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.5.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.5.0.tgz", + "integrity": "sha512-hX+4kt2Rcwu+x1U0SsEFCn1quURjEjPEGH/cPBlpME/IidGimAdwfMU+B+xDr7et/KTR7VH2+ZqWGerv4NGs2w==", + "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.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "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.17", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", + "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", + "dev": true, + "requires": { + "mime-db": ">= 1.40.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" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "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" + } + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + } + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "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.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "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 + }, + "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" + } + }, + "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": "5.0.3", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.0.3.tgz", + "integrity": "sha512-PlZRs9CUMnAVylZq+vg2Juew662jWtwOXOqH4lbQD9ZFhRG9R7tVStOgHt21CBGVq7k5yIJaz8TXDLSjV+Lj8Q==", + "dev": true, + "requires": { + "cacache": "^11.3.2", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.7.0", + "webpack-log": "^2.0.0" + } + }, + "core-js": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.1.4.tgz", + "integrity": "sha512-YNZN8lt82XIMLnLirj9MhKDFZHalwzzrL9YLt6eb0T5D0EDl4IQ90IGkua8mHbnxNrkj1d8hbdizMc0Qmg1WnQ==", + "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": "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" + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.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" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } + }, + "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" + } + }, + "css-parse": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", + "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=", + "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" + } + }, + "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 + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "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 + }, + "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" + } + }, + "date-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", + "dev": true + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "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" + } + }, + "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=", + "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 + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", + "dev": true + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + }, + "default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "dev": true, + "requires": { + "strip-bom": "^3.0.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "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": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "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 + } + } + } + } + }, + "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 + }, + "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.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "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-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "detect-passive-events": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/detect-passive-events/-/detect-passive-events-1.0.5.tgz", + "integrity": "sha512-foW7Q35wwOCxVzW0xLf5XeB5Fhe7oyRgvkBYdiP9IWgLMzjqUqTvsJv9ymuEWGjY6AoDXD3OC294+Z9iuOw0QA==" + }, + "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" + } + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "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 + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "dom7": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/dom7/-/dom7-2.1.5.tgz", + "integrity": "sha512-xnhwVgyOh3eD++/XGtH+5qBwYTgCm0aW91GFgPJ3XG+jlsRLyJivnbP0QmUBFhI+Oaz9FV0s7cxgXHezwOEBYA==", + "requires": { + "ssr-window": "^2.0.0" + }, + "dependencies": { + "ssr-window": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-2.0.0.tgz", + "integrity": "sha512-NXzN+/HPObKAx191H3zKlYomE5WrVIkoCB5IaSdvKokxTpjBdWfr0RaP+1Z5KOfDT0ZVz+2tdtiBkhsEQ9p+0A==" + } + } + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.206", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.206.tgz", + "integrity": "sha512-djq9Ehxs2rwPh7pyY1GMf8vkOWPoK8eoMp913E4t0UaEXvbnOsiSowBBHI8YoN4aKVQJjvxQp5I0LdZkT3Uzmw==", + "dev": true + }, + "elliptic": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.0.tgz", + "integrity": "sha512-eFOJTMyCYb7xtE/caJ6JJu+bhi67WCYNbkGSknu20pmM8Ke/bqOfdnZWxyoGN26JgfxTbXrsCkEw4KheCT/KGg==", + "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" + } + }, + "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 + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "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.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "dev": true, + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "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": { + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "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" + }, + "dependencies": { + "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 + }, + "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" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "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 + }, + "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-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" + } + }, + "es-abstract": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "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" + } + }, + "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=", + "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" + } + }, + "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 + }, + "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.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "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": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", + "dev": true + }, + "events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", + "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" + } + }, + "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 + }, + "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": { + "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" + } + } + } + }, + "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": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "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 + } + } + }, + "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" + } + }, + "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 + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, + "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" + } + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "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" + } + }, + "file-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.0.0.tgz", + "integrity": "sha512-roAbL6IdSGczwfXxhMi6Zq+jD4IfUpL0jWHD7fvmjdOVb7xBfdRUHe4LpBgO23VtVK5AW1OlWZo0p34Jvx3iWg==", + "dev": true, + "requires": { + "loader-utils": "^1.2.2", + "schema-utils": "^1.0.0" + } + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "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.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" + } + }, + "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" + } + }, + "flatted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "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" + } + }, + "follow-redirects": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz", + "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", + "dev": true, + "requires": { + "debug": "^3.2.6" + }, + "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" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "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 + }, + "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-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "dev": true, + "requires": { + "null-check": "^1.0.0" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.6.tgz", + "integrity": "sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ==", + "dev": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "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=", + "dev": true + }, + "fsevents": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.0.7.tgz", + "integrity": "sha512-a7YT0SV3RB+DjYcppwVDLtn13UQnmg0SWZS7ezZD0UjnLwXmy8Zm21GMVGLaFGimIqcvyMQaOJBrop8MyOp1kQ==", + "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 + }, + "genfun": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", + "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", + "dev": 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 + }, + "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" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "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" + } + } + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.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 + } + } + }, + "graceful-fs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", + "dev": true + }, + "hammerjs": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", + "integrity": "sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==" + }, + "handle-thing": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", + "dev": true + }, + "handlebars": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", + "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "dev": true, + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "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 + } + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "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" + } + }, + "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=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "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.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "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" + } + }, + "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" + } + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "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" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "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.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" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", + "dev": true + }, + "http-proxy": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "dev": true, + "requires": { + "eventemitter3": "^3.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "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" + } + } + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "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.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz", + "integrity": "sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg==", + "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" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "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" + } + }, + "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" + } + }, + "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": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "ignore-walk": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "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": "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" + } + }, + "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" + } + }, + "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" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "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": "6.4.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.4.1.tgz", + "integrity": "sha512-/Jw+qPZx4EDYsaT6uz7F4GJRNFMRdKNeUZw3ZnKV8lyuUgz/YWRCSUAJMZSVhSq4Ec0R2oYnyi6b3d4JXcL5Nw==", + "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.11", + "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" + }, + "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" + } + } + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "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.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", + "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-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.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "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.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "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-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-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^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-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-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-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-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-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "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-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "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-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": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "^1.2.0" + } + }, + "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-api": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.1.6.tgz", + "integrity": "sha512-x0Eicp6KsShG1k1rMgBAi/1GgY7kFGEBwQpw3PXGEmu+rBcBNhqU8g2DgY9mlepAsLPzrzrbqSgCGANnki4POA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "compare-versions": "^3.4.0", + "fileset": "^2.0.3", + "istanbul-lib-coverage": "^2.0.5", + "istanbul-lib-hook": "^2.0.7", + "istanbul-lib-instrument": "^3.3.0", + "istanbul-lib-report": "^2.0.8", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^2.2.4", + "js-yaml": "^3.13.1", + "make-dir": "^2.1.0", + "minimatch": "^3.0.4", + "once": "^1.4.0" + }, + "dependencies": { + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "dev": true, + "requires": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + } + } + } + }, + "istanbul-instrumenter-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz", + "integrity": "sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==", + "dev": true, + "requires": { + "convert-source-map": "^1.5.0", + "istanbul-lib-instrument": "^1.7.3", + "loader-utils": "^1.1.0", + "schema-utils": "^0.3.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "^5.0.0" + } + } + } + }, + "istanbul-lib-coverage": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", + "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", + "dev": true, + "requires": { + "append-transform": "^1.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", + "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", + "dev": true, + "requires": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.1", + "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "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" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "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": "2.2.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", + "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", + "dev": true, + "requires": { + "handlebars": "^4.1.2" + } + }, + "jasmine": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", + "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", + "dev": true, + "requires": { + "exit": "^0.1.2", + "glob": "^7.0.6", + "jasmine-core": "~2.8.0" + }, + "dependencies": { + "jasmine-core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", + "dev": true + } + } + }, + "jasmine-core": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.4.0.tgz", + "integrity": "sha512-HU/YxV4i6GcmiH4duATwAbJQMlE0MsDIR5XmSVxURxKHn3aGAdbY1/ZJFmVRbKtnLwIxxMJD7gYaPsypcbYimg==", + "dev": true + }, + "jasmine-spec-reporter": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", + "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==", + "dev": true, + "requires": { + "colors": "1.1.2" + } + }, + "jasminewd2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", + "dev": true + }, + "jquery": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "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-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-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": "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" + } + }, + "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" + } + }, + "jszip": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.6.0.tgz", + "integrity": "sha512-jgnQoG9LKnWO3mnVNBnfhkh0QknICd1FGSrXcgrl67zioyJ4wgx25o9ZqwNtrROSflGBCGYnJfjrIyRIby1OoQ==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, + "karma": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/karma/-/karma-4.1.0.tgz", + "integrity": "sha512-xckiDqyNi512U4dXGOOSyLKPwek6X/vUizSy2f3geYevbLj+UIdvNwbn7IwfUIL2g1GXEPWt/87qFD1fBbl/Uw==", + "dev": true, + "requires": { + "bluebird": "^3.3.0", + "body-parser": "^1.16.1", + "braces": "^2.3.2", + "chokidar": "^2.0.3", + "colors": "^1.1.0", + "connect": "^3.6.0", + "core-js": "^2.2.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.0", + "flatted": "^2.0.0", + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "http-proxy": "^1.13.0", + "isbinaryfile": "^3.0.0", + "lodash": "^4.17.11", + "log4js": "^4.0.0", + "mime": "^2.3.1", + "minimatch": "^3.0.2", + "optimist": "^0.6.1", + "qjobs": "^1.1.4", + "range-parser": "^1.2.0", + "rimraf": "^2.6.0", + "safe-buffer": "^5.0.1", + "socket.io": "2.1.1", + "source-map": "^0.6.1", + "tmp": "0.0.33", + "useragent": "2.3.0" + }, + "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" + }, + "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" + } + }, + "chokidar": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", + "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "core-js": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", + "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" + } + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": 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-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": 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" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": 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-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" + } + }, + "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" + } + }, + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "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" + } + }, + "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 + }, + "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" + } + } + } + }, + "karma-chrome-launcher": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", + "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", + "dev": true, + "requires": { + "fs-access": "^1.0.0", + "which": "^1.2.1" + } + }, + "karma-coverage-istanbul-reporter": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.0.6.tgz", + "integrity": "sha512-WFh77RI8bMIKdOvI/1/IBmgnM+Q7NOLhnwG91QJrM8lW+CIXCjTzhhUsT/svLvAkLmR10uWY4RyYbHMLkTglvg==", + "dev": true, + "requires": { + "istanbul-api": "^2.1.6", + "minimatch": "^3.0.4" + } + }, + "karma-jasmine": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-2.0.1.tgz", + "integrity": "sha512-iuC0hmr9b+SNn1DaUD2QEYtUxkS1J+bSJSn7ejdEexs7P8EYvA1CWkEdrDQ+8jVH3AgWlCNwjYsT1chjcNW9lA==", + "dev": true, + "requires": { + "jasmine-core": "^3.3" + } + }, + "karma-jasmine-html-reporter": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.4.tgz", + "integrity": "sha512-PtilRLno5O6wH3lDihRnz0Ba8oSn0YUJqKjjux1peoYGwo0AQqrWRbdWk/RLzcGlb+onTyXAnHl6M+Hu3UxG/Q==", + "dev": true + }, + "karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dev": true, + "requires": { + "source-map-support": "^0.5.5" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "less": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz", + "integrity": "sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==", + "dev": true, + "requires": { + "clone": "^2.1.2", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.4.1", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "^2.83.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, + "optional": true + } + } + }, + "less-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-5.0.0.tgz", + "integrity": "sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "loader-utils": "^1.1.0", + "pify": "^4.0.1" + } + }, + "license-webpack-plugin": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.1.1.tgz", + "integrity": "sha512-TiarZIg5vkQ2rGdYJn2+5YxO/zqlqjpK5IVglr7OfmrN1sBCakS+PQrsP2uC5gtve1ZDb9WMSUMlmHDQ0FoW4w==", + "dev": true, + "requires": { + "@types/webpack-sources": "^0.1.5", + "webpack-sources": "^1.2.0" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, + "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": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.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" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.tail": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", + "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", + "dev": true + }, + "log4js": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.5.1.tgz", + "integrity": "sha512-EEEgFcE9bLgaYUKuozyFfytQM2wDHtXn4tAN41pkaxpNjAykv11GVdeI4tHtmPWW4Xrgh9R/2d7XYghDVjbKKw==", + "dev": true, + "requires": { + "date-format": "^2.0.0", + "debug": "^4.1.1", + "flatted": "^2.0.0", + "rfdc": "^1.1.4", + "streamroller": "^1.0.6" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "loglevel": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.3.tgz", + "integrity": "sha512-LoEDv5pgpvWgPF4kNYuIp0qqSJVWak/dML0RY74xlzMZiT9w77teNAwKYKWBTYjlokMirg+o3jBwp+vlLrcfAA==", + "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" + } + }, + "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" + } + }, + "magic-string": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", + "integrity": "sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "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" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "dev": true + }, + "make-fetch-happen": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-4.0.2.tgz", + "integrity": "sha512-YMJrAjHSb/BordlsDEcVcPyTbiJKkzqMf48N8dAJZT9Zjctrkb6Yg4TY9Sq2AwSIQJFn5qBBKVTYt3vP5FMIHA==", + "dev": true, + "requires": { + "agentkeepalive": "^3.4.1", + "cacache": "^11.3.3", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", + "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" + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, + "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-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" + } + }, + "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" + } + }, + "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": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.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" + } + }, + "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 + }, + "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" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "dev": true + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "dev": true, + "requires": { + "mime-db": "1.40.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 + }, + "mini-css-extract-plugin": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.7.0.tgz", + "integrity": "sha512-RQIw6+7utTYn8DBGsf/LpRgZCJMpZt+kuawJ/fju0KiOL6nAaTBNmCJwS7HtwSCXfS47gCkmtBFS7HdsquhdxQ==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.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==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "minipass": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "dev": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "dev": true, + "requires": { + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", + "dev": true + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + }, + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "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 + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": 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" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "ng5-slider": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/ng5-slider/-/ng5-slider-1.2.6.tgz", + "integrity": "sha512-xu3qfnCqVNndRY8DsdlsU4jKayJ6KTVlUQwSTWqRqplxY0d6QhK1V1mseWwcovZG7mOTqKBYymJL3zmX8+SbHQ==", + "requires": { + "detect-passive-events": "^1.0.4", + "rxjs": "^5.5.6", + "rxjs-compat": "^6.5.2", + "tslib": "^1.7.1" + }, + "dependencies": { + "rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "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": "sha512-Kb3PrPYz4HanVF1LVGuAdW6LoVgIwjUYJGzFe7NDrBLCN4lsV/5J0MFurV+ygS4bRVwrCEt2c7MQ1R2a72oJDw==" + } + } + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-fetch-npm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", + "integrity": "sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==", + "dev": true, + "requires": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + } + }, + "node-forge": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", + "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==", + "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": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-releases": { + "version": "1.1.26", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.26.tgz", + "integrity": "sha512-fZPsuhhUHMTlfkhDLGtfY80DSJTjOcx+qD1j5pqPkuhUHVS7xHZIg9EE4DHK8O3f0zTxXHX5VIkDG8pu98/wfQ==", + "dev": true, + "requires": { + "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } + }, + "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": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "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-bundled": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", + "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", + "dev": true + }, + "npm-package-arg": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz", + "integrity": "sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.6.0", + "osenv": "^0.1.5", + "semver": "^5.5.0", + "validate-npm-package-name": "^3.0.0" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } + }, + "npm-packlist": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.4.tgz", + "integrity": "sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw==", + "dev": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz", + "integrity": "sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } + }, + "npm-registry-fetch": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-3.9.1.tgz", + "integrity": "sha512-VQCEZlydXw4AwLROAXWUR7QDfe2Y8Id/vpAgp6TI1/H78a4SiQ1kQrKZALm5/zxM5n4HIi+aYb+idUAV/RuY0Q==", + "dev": true, + "requires": { + "JSONStream": "^1.3.4", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^4.0.2", + "npm-package-arg": "^6.1.0" + } + }, + "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" + } + }, + "null-check": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", + "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", + "dev": true + }, + "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 + }, + "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-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-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.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.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" + } + }, + "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=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "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" + }, + "dependencies": { + "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 + } + } + }, + "open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dev": true, + "requires": { + "is-wsl": "^1.1.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" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + } + } + }, + "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": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "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-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.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "p-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" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pacote": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.1.tgz", + "integrity": "sha512-Zqvczvf/zZ7QNosdE9uTC7SRuvSs9tFqRkF6cJl+2HH7COBnx4BRAGpeXJlrbN+mM0CMHpbi620xdEHhCflghA==", + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "cacache": "^11.3.2", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^4.0.1", + "minimatch": "^3.0.4", + "minipass": "^2.3.5", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^2.2.3", + "npm-registry-fetch": "^3.8.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.8", + "unique-filename": "^1.1.1", + "which": "^1.3.1" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } + }, + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", + "dev": true + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dev": true, + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parse-asn1": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", + "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-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" + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "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 + }, + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-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==", + "dev": true + }, + "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": "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 + } + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "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.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz", + "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==", + "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 + }, + "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" + } + }, + "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" + } + }, + "popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" + }, + "portfinder": { + "version": "1.0.21", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.21.tgz", + "integrity": "sha512-ESabpDCzmBS3ekHbmpAIiESq3udRsCBGiBZLsC+HgBKv2ezb0R4oG+7RnYEVZ/ZCfhel5Tx3UzdNWA0Lox2QCA==", + "dev": true, + "requires": { + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } + } + }, + "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.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "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-import": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", + "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "postcss-value-parser": "^3.2.3", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "primeng": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/primeng/-/primeng-8.1.0.tgz", + "integrity": "sha512-jttemCtRq4LJf8WE5HaVqpdmPAecOqFCJIc53OqZrUfaChX7V7OV3evFIvscWqK7wQecv7uS31ROqQT87VGzvA==" + }, + "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 + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "optional": true, + "requires": { + "asap": "~2.0.3" + } + }, + "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" + }, + "dependencies": { + "retry": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "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" + } + }, + "protractor": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.4.tgz", + "integrity": "sha512-BaL4vePgu3Vfa/whvTUAlgaCAId4uNSGxIFSCXMgj7LMYENPWLp85h5RBi9pdpX/bWQ8SF6flP7afmi2TC4eHw==", + "dev": true, + "requires": { + "@types/q": "^0.0.32", + "@types/selenium-webdriver": "^3.0.0", + "blocking-proxy": "^1.0.0", + "browserstack": "^1.5.1", + "chalk": "^1.1.3", + "glob": "^7.0.3", + "jasmine": "2.8.0", + "jasminewd2": "^2.1.0", + "q": "1.4.1", + "saucelabs": "^1.5.0", + "selenium-webdriver": "3.6.0", + "source-map-support": "~0.4.0", + "webdriver-js-extender": "2.1.0", + "webdriver-manager": "^12.0.6", + "yargs": "^12.0.5" + }, + "dependencies": { + "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" + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + } + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.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" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, + "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 + }, + "webdriver-manager": { + "version": "12.1.8", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.8.tgz", + "integrity": "sha512-qJR36SXG2VwKugPcdwhaqcLQOD7r8P2Xiv9sfNbfZrKBnX243iAkOueX1yAmeNgIKhJ3YAT/F2gq6IiEZzahsg==", + "dev": true, + "requires": { + "adm-zip": "^0.4.9", + "chalk": "^1.1.1", + "del": "^2.2.0", + "glob": "^7.0.3", + "ini": "^1.3.4", + "minimist": "^1.2.0", + "q": "^1.4.1", + "request": "^2.87.0", + "rimraf": "^2.5.2", + "semver": "^5.3.0", + "xml2js": "^0.4.17" + } + } + } + }, + "proxy-addr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.2.0.tgz", + "integrity": "sha512-GEn74ZffufCmkDDLNcl3uuyF/aSD6exEyh1v/ZSdAomB82t6G9hzJVRx0jBmLDW+VfZqks3aScmMw9DszwUalA==", + "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" + } + }, + "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.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", + "dev": true + }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "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.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", + "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.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" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } + } + }, + "raw-loader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-1.0.0.tgz", + "integrity": "sha512-Uqy5AqELpytJTRxYT4fhltcKPj0TyaEpzJDcGz7DFJi+pQOOi3GjR/DOdxTkTsF+NzhnldIoG6TORaBlInUuqA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0" + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-package-json": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.13.tgz", + "integrity": "sha512-/1dZ7TRZvGrYqE0UAfN6qQb5GYBsNcqS1C0tNK601CFOJmtHI7NIGXwetEPU/OtoFHZL3hDxm4rolFFVE9Bnmg==", + "dev": true, + "requires": { + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "json-parse-better-errors": "^1.0.1", + "normalize-package-data": "^2.0.0", + "slash": "^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" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.1.1.tgz", + "integrity": "sha512-XXdSXZrQuvqoETj50+JAitxz1UPdt5dupjT6T5nVB+WvjMv2XKYj+s7hPeAVCXvmJrL36O4YYyWlIC3an2ePiQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.4" + } + }, + "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 + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "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" + } + }, + "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 + }, + "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 + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "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.0", + "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.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "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 + }, + "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.11.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", + "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "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 + }, + "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 + }, + "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" + } + }, + "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.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "rfdc": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", + "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", + "dev": true + }, + "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" + } + }, + "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" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "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" + } + }, + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "rxjs-compat": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs-compat/-/rxjs-compat-6.6.7.tgz", + "integrity": "sha512-szN4fK+TqBPOFBcBcsR0g2cmTTUF/vaFEOZNuSdfU8/pGFnNmmn2u8SystYXG1QMrjOPBc6XTKHMVfENDf6hHw==" + }, + "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==", + "dev": true + }, + "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 + }, + "sass": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.22.2.tgz", + "integrity": "sha512-enuQuy/CbfrZLA2vOy9tB7CK7pP5bZllnMbr5nPGWCFelwt0EMUVGC11gsv9rybkWc8pp/NKVY/c5+AKyjbnXg==", + "dev": true, + "requires": { + "chokidar": ">=2.0.0 <4.0.0" + } + }, + "sass-loader": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.1.0.tgz", + "integrity": "sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w==", + "dev": true, + "requires": { + "clone-deep": "^2.0.1", + "loader-utils": "^1.0.1", + "lodash.tail": "^4.1.1", + "neo-async": "^2.5.0", + "pify": "^3.0.0", + "semver": "^5.5.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 + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } + }, + "saucelabs": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", + "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, + "sax": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", + "dev": true + }, + "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" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selenium-webdriver": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", + "dev": true, + "requires": { + "jszip": "^3.1.3", + "rimraf": "^2.5.4", + "tmp": "0.0.30", + "xml2js": "^0.4.17" + }, + "dependencies": { + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + } + } + }, + "selfsigned": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz", + "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==", + "dev": true, + "requires": { + "node-forge": "0.7.5" + } + }, + "semver": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", + "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==", + "dev": true + }, + "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" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "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" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } + }, + "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 + } + } + }, + "serialize-javascript": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz", + "integrity": "sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==", + "dev": true + }, + "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": { + "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 + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "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" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "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": "1.0.0", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", + "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", + "dev": true, + "requires": { + "is-extendable": "^0.1.1", + "kind-of": "^5.0.0", + "mixin-object": "^2.0.1" + }, + "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 + } + } + }, + "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 + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "smart-buffer": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.0.2.tgz", + "integrity": "sha512-JDhEpTKzXusOqXZ0BUIdH+CjFdO/CR3tLlf5CN34IypI+xMmXW1uB16OOY8z3cICbJlDAVJzNbwBhNO0wt9OAw==", + "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": { + "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" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "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" + } + } + } + }, + "socket.io-adapter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", + "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", + "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" + }, + "dependencies": { + "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 + }, + "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" + } + } + } + }, + "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" + }, + "dependencies": { + "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 + }, + "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 + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "sockjs-client": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", + "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", + "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" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "socks": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.2.tgz", + "integrity": "sha512-pCpjxQgOByDHLlNqlnh/mNSAxIUkyBBuwwhTcV+enZGbDaClPvHdvm6uvOwZfFJkam7cGhBNbb4JxiP8UZkRvQ==", + "dev": true, + "requires": { + "ip": "^1.1.5", + "smart-buffer": "4.0.2" + } + }, + "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.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + }, + "source-map-loader": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz", + "integrity": "sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ==", + "dev": true, + "requires": { + "async": "^2.5.0", + "loader-utils": "^1.1.0" + } + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "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.12", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "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.6", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz", + "integrity": "sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg==", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "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.1", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", + "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", + "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" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "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": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "speed-measure-webpack-plugin": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.1.tgz", + "integrity": "sha512-qVIkJvbtS9j/UeZumbdfz0vg+QfG/zxonAjzefZrqzkr7xOncLVXkeGbTpzd1gjCBM4PmVNkWlkeTVhgskAGSQ==", + "dev": true, + "requires": { + "chalk": "^2.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.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "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" + } + }, + "ssr-window": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-1.0.1.tgz", + "integrity": "sha512-dgFqB+f00LJTEgb6UXhx0h+SrG50LJvti2yMKMqAgzfUmUXZrLSv2fjULF7AWGwK25EXu8+smLR3jYsJQChPsg==" + }, + "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" + } + }, + "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.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "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.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "streamroller": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.6.tgz", + "integrity": "sha512-3QC47Mhv3/aZNFpDDVO44qQb9gwB9QggMEE0sQmkTAwBVYdBRWISdsywlkfm5II1Q5y/pmrHflti/IgmIzdDBg==", + "dev": true, + "requires": { + "async": "^2.6.2", + "date-format": "^2.0.0", + "debug": "^3.2.6", + "fs-extra": "^7.0.1", + "lodash": "^4.17.14" + }, + "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" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "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-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" + } + } + } + }, + "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" + } + }, + "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" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "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 + }, + "style-loader": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", + "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0" + } + }, + "stylus": { + "version": "0.54.5", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz", + "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", + "dev": true, + "requires": { + "css-parse": "1.7.x", + "debug": "*", + "glob": "7.0.x", + "mkdirp": "0.5.x", + "sax": "0.5.x", + "source-map": "0.1.x" + }, + "dependencies": { + "glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "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" + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "stylus-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz", + "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "lodash.clonedeep": "^4.5.0", + "when": "~3.6.x" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "swiper": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/swiper/-/swiper-4.5.1.tgz", + "integrity": "sha512-se6I7PWWu950NAMXXT+ENtF/6SVb8mPyO+bTfNxbQBILSeLqsYp3Ndap+YOA0EczOIUlea274PKejT6gKZDseA==", + "requires": { + "dom7": "^2.1.3", + "ssr-window": "^1.0.1" + } + }, + "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 + }, + "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.10", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.10.tgz", + "integrity": "sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.5", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "terser": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.1.2.tgz", + "integrity": "sha512-jvNoEQSPXJdssFwqPSgWjsOrb+ELoE+ILpHPKXC83tIxOlh2U75F1KuB2luLD/3a6/7K3Vw5pDn+hvu0C4AzSw==", + "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": "1.3.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.3.0.tgz", + "integrity": "sha512-W2YWmxPjjkUcOWa4pBEv4OP4er1aeQJlSo2UhtCFQCuRXEHjOFscO8VyWHj9JLlA0RzQb8Y2/Ta78XZvT54uGg==", + "dev": true, + "requires": { + "cacache": "^11.3.2", + "find-cache-dir": "^2.0.0", + "is-wsl": "^1.1.0", + "loader-utils": "^1.2.3", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.7.0", + "source-map": "^0.6.1", + "terser": "^4.0.0", + "webpack-sources": "^1.3.0", + "worker-farm": "^1.7.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 + } + } + }, + "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.0.3", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", + "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", + "dev": true + }, + "timers-browserify": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "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" + } + }, + "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": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "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" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "tree-kill": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz", + "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "dev": true, + "requires": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "tslint": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.15.0.tgz", + "integrity": "sha512-6bIEujKR21/3nyeoX2uBnE8s+tMXCQXhqMmaIPJpHmXJoBJPTLcI7/VHRtUwMhnLVdwLqqY3zmd8Dxqa5CVdJA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.22.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^3.2.0", + "glob": "^7.1.1", + "js-yaml": "^3.13.0", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.29.0" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } + }, + "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" + } + }, + "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-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 + }, + "typescript": { + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.5.tgz", + "integrity": "sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==", + "dev": true + }, + "uglify-js": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", + "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", + "dev": true, + "optional": true, + "requires": { + "commander": "~2.20.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, + "optional": 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 + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "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 + }, + "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 + } + } + }, + "upath": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", + "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", + "dev": true + }, + "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.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 + } + } + }, + "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" + } + }, + "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 + }, + "useragent": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", + "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", + "dev": true, + "requires": { + "lru-cache": "4.1.x", + "tmp": "0.0.x" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "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" + } + }, + "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": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "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 + }, + "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" + } + }, + "vm-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", + "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", + "dev": true + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "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" + }, + "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" + } + }, + "chokidar": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", + "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", + "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" + } + }, + "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" + } + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": 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-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": 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" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": 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-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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "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" + } + }, + "webdriver-js-extender": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", + "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", + "dev": true, + "requires": { + "@types/selenium-webdriver": "^3.0.0", + "selenium-webdriver": "^3.0.1" + } + }, + "webpack": { + "version": "4.35.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.35.2.tgz", + "integrity": "sha512-TZAmorNymV4q66gAM/h90cEjG+N3627Q2MnkSgKlX/z3DlNVKUtqy57lz1WmZU2+FUZwzM+qm7cGaO95PyrX5A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.0.5", + "acorn-dynamic-import": "^4.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.0", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^1.0.0", + "tapable": "^1.1.0", + "terser-webpack-plugin": "^1.1.0", + "watchpack": "^1.5.0", + "webpack-sources": "^1.3.0" + } + }, + "webpack-core": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", + "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", + "dev": true, + "requires": { + "source-list-map": "~0.1.7", + "source-map": "~0.4.1" + }, + "dependencies": { + "source-list-map": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", + "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", + "dev": true + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz", + "integrity": "sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.2", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.7.2.tgz", + "integrity": "sha512-mjWtrKJW2T9SsjJ4/dxDC2fkFVUw8jlpemDERqV0ZJIkjjjamR2AbQlr3oz+j4JLhYCHImHnXZK5H06P2wvUew==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.6", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.2.1", + "http-proxy-middleware": "^0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "killable": "^1.0.1", + "loglevel": "^1.6.3", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.20", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.4", + "semver": "^6.1.1", + "serve-index": "^1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.3.0", + "spdy": "^4.0.0", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.0", + "webpack-log": "^2.0.0", + "yargs": "12.0.5" + }, + "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" + }, + "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" + } + }, + "chokidar": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", + "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", + "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" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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" + } + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": 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-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": 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" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": 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-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" + } + }, + "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" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "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" + } + }, + "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" + } + } + } + }, + "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" + } + }, + "webpack-merge": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.1.tgz", + "integrity": "sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw==", + "dev": true, + "requires": { + "lodash": "^4.17.5" + } + }, + "webpack-sources": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", + "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "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 + } + } + }, + "webpack-subresource-integrity": { + "version": "1.1.0-rc.6", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.1.0-rc.6.tgz", + "integrity": "sha512-Az7y8xTniNhaA0620AV1KPwWOqawurVVDzQSpPAeR5RwNbL91GoBSJAAo9cfd+GiFHwsS5bbHepBw1e6Hzxy4w==", + "dev": true, + "requires": { + "webpack-core": "^0.6.8" + } + }, + "websocket-driver": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", + "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true + }, + "when": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz", + "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "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" + } + }, + "worker-plugin": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-3.1.0.tgz", + "integrity": "sha512-iQ9KTTmmN5fhfc2KMR7CcDblvcrg1QQ4pXymqZ3cRZF8L0890YLBcEqlIsGPdxoFwghyN8RA1pCEhCKuTF4Lkw==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0" + } + }, + "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" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "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" + } + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "dependencies": { + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + } + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "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==", + "dev": true + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "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 + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true + }, + "zone.js": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.9.1.tgz", + "integrity": "sha512-GkPiJL8jifSrKReKaTZ5jkhrMEgXbXYC+IPo1iquBjayRa0q86w3Dipjn8b415jpitMExe9lV8iTsv8tk3DGag==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..c79616e --- /dev/null +++ b/package.json @@ -0,0 +1,59 @@ +{ + "name": "zendion-inc", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "test": "ng test", + "lint": "ng lint", + "e2e": "ng e2e" + }, + "private": true, + "dependencies": { + "@angular/animations": "~8.1.3", + "@angular/cdk": "~8.2.3", + "@angular/common": "~8.1.3", + "@angular/compiler": "~8.1.3", + "@angular/core": "~8.1.3", + "@angular/forms": "~8.1.3", + "@angular/material": "^8.2.3", + "@angular/platform-browser": "~8.1.3", + "@angular/platform-browser-dynamic": "~8.1.3", + "@angular/router": "~8.1.3", + "angular2-useful-swiper": "^8.0.1-beta.1", + "bootstrap": "^4.6.0", + "chart.js": "^2.7.3", + "hammerjs": "^2.0.8", + "jquery": "^3.6.0", + "ng5-slider": "^1.2.6", + "popper.js": "^1.16.1", + "primeng": "^8.1.0", + "rxjs": "~6.4.0", + "swiper": "^4.5.1", + "tslib": "^1.14.1", + "zone.js": "~0.9.1" + }, + "devDependencies": { + "@angular-devkit/build-angular": "~0.801.3", + "@angular/cli": "~8.1.3", + "@angular/compiler-cli": "~8.1.3", + "@angular/language-service": "~8.1.3", + "@types/jasmine": "~3.3.8", + "@types/jasminewd2": "^2.0.8", + "@types/node": "~8.9.4", + "@types/swiper": "^4.4.11", + "codelyzer": "^5.2.2", + "jasmine-core": "~3.4.0", + "jasmine-spec-reporter": "~4.2.1", + "karma": "~4.1.0", + "karma-chrome-launcher": "~2.2.0", + "karma-coverage-istanbul-reporter": "~2.0.1", + "karma-jasmine": "~2.0.1", + "karma-jasmine-html-reporter": "^1.5.4", + "protractor": "^5.4.4", + "ts-node": "~7.0.0", + "tslint": "~5.15.0", + "typescript": "~3.4.3" + } +} diff --git a/privacidade.html b/privacidade.html new file mode 100644 index 0000000..26ef38b --- /dev/null +++ b/privacidade.html @@ -0,0 +1 @@ +

Política Privacidade

A sua privacidade é importante para nós. É política do Zendion Inc respeitar a sua privacidade em relação a qualquer informação sua que possamos coletar no site Zendion Inc, e outros sites que possuímos e operamos.

Solicitamos informações pessoais apenas quando realmente precisamos delas para lhe fornecer um serviço. Fazemo-lo por meios justos e legais, com o seu conhecimento e consentimento. Também informamos por que estamos coletando e como será usado.

Apenas retemos as informações coletadas pelo tempo necessário para fornecer o serviço solicitado. Quando armazenamos dados, protegemos dentro de meios comercialmente aceitáveis ​​para evitar perdas e roubos, bem como acesso, divulgação, cópia, uso ou modificação não autorizados.

Não compartilhamos informações de identificação pessoal publicamente ou com terceiros, exceto quando exigido por lei.

O nosso site pode ter links para sites externos que não são operados por nós. Esteja ciente de que não temos controle sobre o conteúdo e práticas desses sites e não podemos aceitar responsabilidade por suas respectivas políticas de privacidade.

Você é livre para recusar a nossa solicitação de informações pessoais, entendendo que talvez não possamos fornecer alguns dos serviços desejados.

O uso continuado de nosso site será considerado como aceitação de nossas práticas em torno de privacidade e informações pessoais. Se você tiver alguma dúvida sobre como lidamos com dados do usuário e informações pessoais, entre em contacto connosco.

Compromisso do Usuário

O usuário se compromete a fazer uso adequado dos conteúdos e da informação que o Zendion Inc oferece no site e com caráter enunciativo, mas não limitativo:

  • A) Não se envolver em atividades que sejam ilegais ou contrárias à boa fé a à ordem pública;
  • B) Não difundir propaganda ou conteúdo de natureza racista, xenofóbica, onde apostar ou azar, qualquer tipo de pornografia ilegal, de apologia ao terrorismo ou contra os direitos humanos;
  • C) Não causar danos aos sistemas físicos (hardwares) e lógicos (softwares) do Zendion Inc, de seus fornecedores ou terceiros, para introduzir ou disseminar vírus informáticos ou quaisquer outros sistemas de hardware ou software que sejam capazes de causar danos anteriormente mencionados.

Mais informações

Esperemos que esteja esclarecido e, como mencionado anteriormente, se houver algo que você não tem certeza se precisa ou não, geralmente é mais seguro deixar os cookies ativados, caso interaja com um dos recursos que você usa em nosso site.

Esta política é efetiva a partir de 5 December 2022 22:21

\ No newline at end of file diff --git a/privacidade.txt b/privacidade.txt new file mode 100644 index 0000000..cbcf476 --- /dev/null +++ b/privacidade.txt @@ -0,0 +1 @@ +Política PrivacidadeA sua privacidade é importante para nós. É política do Zendion Inc respeitar a sua privacidade em relação a qualquer informação sua que possamos coletar no site Zendion Inc, e outros sites que possuímos e operamos.Solicitamos informações pessoais apenas quando realmente precisamos delas para lhe fornecer um serviço. Fazemo-lo por meios justos e legais, com o seu conhecimento e consentimento. Também informamos por que estamos coletando e como será usado.Apenas retemos as informações coletadas pelo tempo necessário para fornecer o serviço solicitado. Quando armazenamos dados, protegemos dentro de meios comercialmente aceitáveis ​​para evitar perdas e roubos, bem como acesso, divulgação, cópia, uso ou modificação não autorizados.Não compartilhamos informações de identificação pessoal publicamente ou com terceiros, exceto quando exigido por lei.O nosso site pode ter links para sites externos que não são operados por nós. Esteja ciente de que não temos controle sobre o conteúdo e práticas desses sites e não podemos aceitar responsabilidade por suas respectivas políticas de privacidade.Você é livre para recusar a nossa solicitação de informações pessoais, entendendo que talvez não possamos fornecer alguns dos serviços desejados.O uso continuado de nosso site será considerado como aceitação de nossas práticas em torno de privacidade e informações pessoais. Se você tiver alguma dúvida sobre como lidamos com dados do usuário e informações pessoais, entre em contacto connosco.Compromisso do UsuárioO usuário se compromete a fazer uso adequado dos conteúdos e da informação que o Zendion Inc oferece no site e com caráter enunciativo, mas não limitativo:A) Não se envolver em atividades que sejam ilegais ou contrárias à boa fé a à ordem pública;B) Não difundir propaganda ou conteúdo de natureza racista, xenofóbica, onde apostar ou azar, qualquer tipo de pornografia ilegal, de apologia ao terrorismo ou contra os direitos humanos;C) Não causar danos aos sistemas físicos (hardwares) e lógicos (softwares) do Zendion Inc, de seus fornecedores ou terceiros, para introduzir ou disseminar vírus informáticos ou quaisquer outros sistemas de hardware ou software que sejam capazes de causar danos anteriormente mencionados.Mais informaçõesEsperemos que esteja esclarecido e, como mencionado anteriormente, se houver algo que você não tem certeza se precisa ou não, geralmente é mais seguro deixar os cookies ativados, caso interaja com um dos recursos que você usa em nosso site.Esta política é efetiva a partir de 5 December 2022 22:21 \ No newline at end of file diff --git a/server/.env b/server/.env new file mode 100644 index 0000000..b6934b2 --- /dev/null +++ b/server/.env @@ -0,0 +1,9 @@ +SMTP_HOST=email-smtp.sa-east-1.amazonaws.com +SMTP_PORT=587 +SMTP_SECURE=false + +SMTP_USER=AKIAWD3MQRM2CPUVNA4P +SMTP_PASS=BEfWvd2+A098qv5QlUSeUwyajG+ID8XSAwKslE3+qxRU + +SMTP_FROM_EMAIL=contato@zendioninc.com.br +SMTP_FROM_NAME=Zendion, INC. \ No newline at end of file diff --git a/server/connector.js b/server/connector.js new file mode 100644 index 0000000..91a9fea --- /dev/null +++ b/server/connector.js @@ -0,0 +1,126 @@ +var mysql = require('mysql'); + +//#region ZENDION INC +var MySQLConfig = { + connectionLimit : 10, + host : 'zendioninc.com.br', + port : '3306', + user : 'zendion', + password : 'Z210203!', + database : 'zendioninc', + debug : false, + multipleStatements : true +}; + +global.AbreConexaoMySQL = function AbreConexaoMySQL() { + global.mysqlConnection = mysql.createPool(MySQLConfig); + console.log("MySQL Conectado! ZENDION INC"); +} +AbreConexaoMySQL(); + +global.ExecuteQuery = function ExecuteQuery(sqlQuery, req, res, params = [], callback = null) { + mysqlConnection.query(sqlQuery, params, function (error, results, fields) { + console.log(`${new Date().toUTCString()} - ${req.originalUrl} ${(error) ? ' 500 error' : ' 200 success'}`); + res.send(JSON.stringify({ "status": ((error) ? 500 : 200), "error": error, "response": results })) + }); +} + +//#endregion + +//#region GCA Control +var ConfigMySQLGCA = { + connectionLimit : 10, + host : 'zendioninc.com.br', + port : '3306', + user : 'zendion', + password : 'Z210203!', + database : 'GCA', + debug : false, + multipleStatements : true +}; + +global.AbreConexaoGCAMySQL = function AbreConexaoGCAMySQL() { + global.ConexaoMySQL_GCA = mysql.createPool(ConfigMySQLGCA); + console.log("MySQL Conectado! GCA Control"); +} +AbreConexaoGCAMySQL(); + +global.ExecuteQueryGCA = function ExecuteQueryGCA(sqlQuery, req, res, params = [], callback = null) { + ConexaoMySQL_GCA.query(sqlQuery, params, function (error, results, fields) { + console.log(`${new Date().toUTCString()} - ${req.originalUrl} ${(error) ? ' 500 error' : ' 200 success'}`); + res.send(JSON.stringify({ "status": ((error) ? 500 : 200), "error": error, "response": results })) + }); +} + + +//#endregion + +//#region PRIORIE +var ConfigMySQLPriorie = { + connectionLimit : 10, + host : 'zendioninc.com.br', + port : '3306', + user : 'zendion', + password : 'Z210203!', + database : 'priorie', + debug : false, + multipleStatements : true +}; + +global.AbreConexaoPriorieMySQL = function AbreConexaoPriorieMySQL() { + global.ConexaoMySQL_Priorie = mysql.createPool(ConfigMySQLPriorie); + console.log("MySQL Conectado! Priorie"); +} +AbreConexaoPriorieMySQL(); + +global.ExecuteQueryPriorie = function ExecutarQuery(sqlQuery, req, res, callback = null) { + ConexaoMySQL_Priorie.query(sqlQuery, function(error, results, fields) { + let Status = 0; + if (!error) { + Status = 200; + console.log(req.originalUrl + " success 200"); + } + else { + Status = 500; + console.log(req.originalUrl + " error 500"); + results = []; + } + res.send(JSON.stringify({ "status": Status, "response": results, "error": error })); + try { + callback(Status, results['insertId']); + } + catch (e) {} + }); +} + + +//#endregion + +//#region AGROBASE +var ConfigMySQLAgro = { + connectionLimit : 10, + host : 'zendioninc.com.br', + port : '3306', + user : 'zendion', + password : 'Z210203!', + database : 'agrobase', + debug : false, + multipleStatements : true +}; + +global.AbreConexaoAgroMySQL = function AbreConexaoAgroMySQL() { + global.ConexaoMySQL_Agro = mysql.createPool(ConfigMySQLAgro); + console.log("MySQL Conectado! AgroBase"); +} +AbreConexaoAgroMySQL(); + +global.ExecuteQueryAgro = function ExecuteQueryAgro(sqlQuery, req, res, params = [], callback = null) { + ConexaoMySQL_Agro.query(sqlQuery, params, function (error, results, fields) { + console.log(`${new Date().toUTCString()} - ${req.originalUrl} ${(error) ? ' 500 error' : ' 200 success'}`); + res.send(JSON.stringify({ "status": ((error) ? 500 : 200), "error": error, "response": results })) + }); +} + + +//#endregion + diff --git a/server/controllers/agrobaseController.js b/server/controllers/agrobaseController.js new file mode 100644 index 0000000..8f2e8ca --- /dev/null +++ b/server/controllers/agrobaseController.js @@ -0,0 +1,168 @@ +const express = require('express'); +const router = express.Router(); +const formidable = require('formidable'); +const unzipper = require('unzipper'); +const fs = require('fs'); +const path = require('path'); + +// Defina o caminho do arquivo .vsf +const vsfFilePath = path.join('/var/www/html/agrobase/downloads/version_files.vsf'); + +var routes = function () { + + router.get('/getVsfData', (req, res) => { + fs.readFile(vsfFilePath, 'utf8', (err, data) => { + if (err) { + console.error("Erro ao ler o arquivo .vsf:", err); + return res.status(500).json({ message: "Erro ao ler o arquivo .vsf" }); + } + + // Tenta converter o conteúdo em JSON + try { + const jsonData = JSON.parse(data); + res.json(jsonData); + } catch (parseError) { + console.error("Erro ao analisar o arquivo .vsf:", parseError); + res.status(500).json({ message: "Erro ao analisar o conteúdo do arquivo .vsf" }); + } + }); + }); + + router.post('/uploadTrainFiles', (req, res) => { + let form = new formidable.IncomingForm(); + form.maxFileSize = 600 * 1024 * 1024; // Limite de tamanho do arquivo + form.parse(req, async function (err, fields, files) { + if (err) { + console.error("Erro ao processar o arquivo:", err); + return res.status(500).send("Erro no processamento"); + } + + const nomeOperacao = fields.operacaoId; + const arquivoZipPath = files['imagens.zip'].path; + const dirDestino = '/var/www/html/agrobase/trainfiles/'; + + try { + // Certifique-se de que o diretório de destino existe + if (!fs.existsSync(dirDestino)) { + fs.mkdirSync(dirDestino, { recursive: true }); + } + + // Caminho completo do diretório para esta operação específica + const dirOperacao = path.join(dirDestino, nomeOperacao); + + // Certifique-se de que o diretório da operação existe + if (!fs.existsSync(dirOperacao)) { + fs.mkdirSync(dirOperacao, { recursive: true }); + } + + // Abrir o arquivo zip e extrair as imagens com as subpastas + fs.createReadStream(arquivoZipPath) + .pipe(unzipper.Parse()) + .on('entry', async function (entry) { + const fileName = entry.path; + const type = entry.type; // 'Directory' ou 'File' + + if (type === 'File' && fileName.endsWith('.jpg')) { + // Caminho de destino da imagem extraída (mantém a subpasta, se houver) + const caminhoImagem = path.join(dirOperacao, fileName); + const dirImagem = path.dirname(caminhoImagem); + + // Certifique-se de que a subpasta da imagem existe + if (!fs.existsSync(dirImagem)) { + fs.mkdirSync(dirImagem, { recursive: true }); + } + + // Salvar a imagem no diretório correto + entry.pipe(fs.createWriteStream(caminhoImagem)); + } else { + entry.autodrain(); // Ignorar diretórios ou arquivos não suportados + } + }) + .on('close', () => { + console.log("Arquivo descompactado com sucesso e imagens sincronizadas."); + res.send(true); + }); + } catch (error) { + console.error("Erro ao descompactar o arquivo:", error); + res.status(500).send("Erro no processamento do arquivo ZIP"); + } + }); + }); + + router.post('/uploadVersionFiles', (req, res) => { + let form = new formidable.IncomingForm(); + form.maxFileSize = 600 * 1024 * 1024; // Limite de tamanho do arquivo + + form.parse(req, async function (err, fields, files) { + if (err) { + console.error("Erro ao processar o arquivo:", err); + return res.status(500).send("Erro no processamento"); + } + + const file = files.file; + const fileName = fields.fileName; // Nome do arquivo formatado + const destino = `/var/www/html/agrobase/downloads/${fileName}`; + + fs.copyFile(file.path, destino, (err) => { + if (err) { + console.error("Erro ao salvar o arquivo:", err); + return res.status(500).send("Erro ao salvar o arquivo"); + } + res.status(200).send({ filePath: destino }); + }); + }); + }); + + router.post('/deleteVersionFile', (req, res) => { + const { filePath } = req.body; + + if (!filePath) { + return res.status(400).send("Caminho do arquivo não fornecido."); + } + + const downloadsDir = '/var/www/html/agrobase/downloads'; + const fullPath = path.join(downloadsDir, path.basename(filePath)); + + fs.access(fullPath, fs.constants.F_OK, (err) => { + if (err) { + console.error("Arquivo não encontrado:", err); + return res.status(404).send("Arquivo não encontrado."); + } + + fs.unlink(fullPath, (err) => { + if (err) { + console.error("Erro ao excluir o arquivo:", err); + return res.status(500).send("Erro ao excluir o arquivo."); + } + + res.status(200).send({ message: "Arquivo excluído com sucesso." }); + }); + }); + }); + + router.post('/updateVsfFile', (req, res) => { + const jsonData = req.body.data; // Dados JSON do Angular + + fs.writeFile(vsfFilePath, jsonData, 'utf8', (err) => { + if (err) { + console.error("Erro ao atualizar o arquivo .vsf:", err); + return res.status(500).send("Erro ao salvar o arquivo .vsf"); + } + res.status(200).send("Arquivo .vsf atualizado com sucesso"); + }); + }); + + router.post('/login', function (req, res) { + let usuario = req.body.usuario; + let senha = req.body.senha; + const sqlQuery = `SELECT + nome + FROM usuarios + WHERE usuario = '${usuario}' AND senha = '${senha}';`; + ExecuteQueryAgro(sqlQuery, req, res); + }); + + return router; +} + +module.exports = routes; diff --git a/server/controllers/allteeth/sincroniaController.js b/server/controllers/allteeth/sincroniaController.js new file mode 100644 index 0000000..5f0b2c4 --- /dev/null +++ b/server/controllers/allteeth/sincroniaController.js @@ -0,0 +1,27 @@ +const express = require('express'); +const router = express.Router(); + +var routes = function () { + + router.get('/backupDump/:idusuarios', (req, res) => { + const idusuarios = parseInt(req.params.idusuarios); + const fs = require('fs'); + const shell = require('shelljs'); + const Diretorio = '/var/www/html/sistemas/5/backups/usuario_' + idusuarios + '/'; + if (!fs.existsSync(Diretorio)) { + fs.mkdirSync(Diretorio); + } + const Arquivo = Diretorio + 'dump.sql'; + shell.exec('mysqldump -uroot -pZ210203! Allteeth > ' + Arquivo, function(sucesso) { + fs.readFile(Arquivo, (err, data) => { + console.log("/backupDump success 200"); + res.send(JSON.stringify({"arquivo": Buffer.from(data).toString()})); + }); + + }); + }); + + return router; +} + +module.exports = routes; \ No newline at end of file diff --git a/server/controllers/allteeth/usuariosController.js b/server/controllers/allteeth/usuariosController.js new file mode 100644 index 0000000..d0a47c4 --- /dev/null +++ b/server/controllers/allteeth/usuariosController.js @@ -0,0 +1,141 @@ +const express = require('express'); +const router = express.Router(); + +var routes = function () { + + router.get('/getUsuarios', function (req, res, next) { + const sqlQuery = `SELECT * FROM usuarios;`; + connection.query(sqlQuery, function (error, results, fields) { + if (error) { + res.send(JSON.stringify({ "status": 500, "error": error, "response": null })) + console.log("/users/getUsuarios error 500"); + } + else { + res.send(JSON.stringify({ "status": 200, "error": null, "response": results })) + console.log("/users/getUsuarios success 200"); + } + }); + }); + + router.get('/getUsuarioByID/:idusuarios', function (req, res, next) { + let idusuarios = req.params.idusuarios; + const sqlQuery = `SELECT * FROM usuarios WHERE idusuarios = ${idusuarios};`; + connection.query(sqlQuery, function (error, results, fields) { + if (error) { + res.send(JSON.stringify({ "status": 500, "error": error, "response": null })) + console.log("/users/getUsuarioByID error 500"); + } + else { + res.send(JSON.stringify({ "status": 200, "error": null, "response": results })) + console.log("/users/getUsuarioByID success 200"); + } + }); + }); + + router.post('/authUser', function (req, res, next) { + let usuario = req.body.Usuario; + let senha = req.body.Senha; + const sqlQuery = ` + SELECT + idusuarios AS IDUsuario, + nome AS Nome, + data_cadastramento AS DataCadastramento, + null AS Permissoes + FROM + usuarios + WHERE + usuario = '${usuario}' + AND + senha = '${senha}' + AND + habilitado = 1;`; + connection.query(sqlQuery, function (error, results, fields) { + if (error) { + res.send(null) + console.log("/users/authUser error 500"); + } + else { + res.send(results[0]); + console.log("/users/authUser success 200"); + } + }); + }); + + router.post('/insertUsuarios', function (req, res, next) { + let idusuarios = req.body.idusuarios; + let usuario = req.body.usuario; + let senha = req.body.senha; + let habilitado = req.body.habilitado ? 1 : 0; + let nome = req.body.nome; + let data_cadastramento = req.body.data_cadastramento; + + const sqlQuery = `INSERT INTO + usuarios (usuario, senha, habilitado, nome, data_cadastramento) + VALUES (UPPER('${usuario}'), UPPER('${senha}'), ${habilitado}, '${nome}', '${data_cadastramento}');`; + connection.query(sqlQuery, function (error, results, fields) { + if (error) { + res.send(JSON.stringify({ "status": 500, "error": error, "response": null })) + console.log("/users/insertUsuarios error 500"); + } + else { + res.send(JSON.stringify({ "status": 200, "error": null, "response": results })) + console.log("/users/insertUsuarios success 200"); + } + }); + }); + + router.patch('/updateUsuarios', function (req, res, next) { + let idusuarios = req.body.idusuarios; + let usuario = req.body.usuario; + let senha = req.body.senha; + let habilitado = req.body.habilitado ? 1 : 0; + let nome = req.body.nome; + let data_cadastramento = req.body.data_cadastramento; + + const sqlQuery = ` + UPDATE + usuarios + SET + usuario = UPPER('${usuario}'), + senha = UPPER('${senha}'), + habilitado = ${habilitado}, + nome = '${nome}', + data_cadastramento = '${data_cadastramento}' + WHERE + idusuarios = ${idusuarios};`; + connection.query(sqlQuery, function (error, results, fields) { + if (error) { + res.send(JSON.stringify({ "status": 500, "error": error, "response": null })) + console.log("/users/updateUsuarios error 500"); + } + else { + res.send(JSON.stringify({ "status": 200, "error": null, "response": results })) + console.log("/users/updateUsuarios success 200"); + } + }); + }); + + router.delete('/deleteUsuarios/:idusuarios', function (req, res, next) { + let idusuarios = req.params.idusuarios; + + const sqlQuery = ` + DELETE FROM + usuarios + WHERE + idusuarios = ${idusuarios};`; + connection.query(sqlQuery, function (error, results, fields) { + if (error) { + res.send(JSON.stringify({ "status": 500, "error": error, "response": null })) + console.log("/users/deleteUsuarios error 500"); + } + else { + res.send(JSON.stringify({ "status": 200, "error": null, "response": results })) + console.log("/users/deleteUsuarios success 200"); + } + }); + }); + + return router; +} + +module.exports = routes; \ No newline at end of file diff --git a/server/controllers/arquivosController.js b/server/controllers/arquivosController.js new file mode 100644 index 0000000..237763f --- /dev/null +++ b/server/controllers/arquivosController.js @@ -0,0 +1,40 @@ +require('../connector'); +const express = require('express'); +const router = express.Router(); +const formidable = require('formidable'); + +var routes = function () { + router.post('/copy', (req, res) => { + let form = new formidable.IncomingForm(); + form.maxFileSize = 600 * 1024 * 1024; + form.parse(req, function(err,fields,files){ + const fs = require('fs'); + var nome = fields.nome; + var pathImagem = files.arquivo.path; + var dir = '/var/www/html/' + fields.caminho; + + fs.rename(pathImagem, dir + nome, function (err) { + console.log("arquivo copiado com sucesso"); + res.send(true); + }) + }); + }); + + router.post('/editaConfig', (req, res) => { + var fs = require('fs'); + var content = req.body.content; + var path = "/var/www/html/assets/Enderecos.txt"; + fs.writeFile(path, content, function (erro) { + if (erro) { + throw erro; + } + else { + res.send(true); + } + }); + }); + + return router; +} + +module.exports = routes; \ No newline at end of file diff --git a/server/controllers/bingoController.js b/server/controllers/bingoController.js new file mode 100644 index 0000000..bd21144 --- /dev/null +++ b/server/controllers/bingoController.js @@ -0,0 +1,105 @@ +require('../connector'); +const express = require('express'); +const router = express.Router(); + +var routes = function () { + + router.get('/getAllSorteios', function (req, res) { + ExecuteQuery(`SELECT idbingosorteios, descricao, rodada, date_format(data_sorteio, '%d/%m/%Y') as data_sorteio, n_max, participantes_max FROM bingosorteios;`, req, res); + }); + + router.get('/getSorteiosRealizar', function (req, res) { + ExecuteQuery(`SELECT * FROM bingosorteios where realizado = 0;`, req, res); + }); + + router.get('/getAllCartelas', function (req, res) { + ExecuteQuery(`SELECT * FROM bingocartelas;`, req, res); + }); + + router.get('/getCartelasSorteio/:idbingosorteios', function (req, res) { + const idbingosorteios = parseInt(req.params.idbingosorteios); + ExecuteQuery(`SELECT * FROM bingocartelas where idbingosorteios = ? order by canhoto asc;`, req, res, [idbingosorteios]); + }); + + router.get('/getCartelasVendidasSorteio/:idbingosorteios', function (req, res) { + const idbingosorteios = parseInt(req.params.idbingosorteios); + ExecuteQuery(`SELECT *, 1 as 'Acertos' FROM bingocartelas where idbingosorteios = ? and nome is not null order by canhoto asc;`, req, res, [idbingosorteios]); + }); + + router.post('/insertBingoSorteio', function (req, res) { + const descricao = req.body.descricao; + const rodada = parseInt(req.body.rodada); + const data_sorteio = req.body.data_sorteio; + const n_max = parseInt(req.body.n_max); + const participantes_max = parseInt(req.body.participantes_max); + ExecuteQuery(`insert into bingosorteios (descricao, rodada, data_sorteio, n_max, participantes_max) values (?, ?, ?, ?, ?);`, req, res, [descricao, rodada, data_sorteio, n_max, participantes_max]); + }); + + router.post('/updateBingoSorteio', function (req, res) { + const idbingosorteios = parseInt(req.body.idbingosorteios); + const descricao = req.body.descricao; + const rodada = parseInt(req.body.rodada); + const data_sorteio = req.body.data_sorteio; + const n_max = parseInt(req.body.n_max); + const participantes_max = parseInt(req.body.participantes_max); + const realizado = req.body.realizado ? 1 : 0; + ExecuteQuery(`update bingosorteios set descricao = ?, rodada = ?, data_sorteio = ?, n_max = ?, participantes_max = ?, realizado = ? where idbingosorteios = ?;`, req, res, [descricao, rodada, data_sorteio, n_max, participantes_max, realizado, idbingosorteios]); + }); + + router.delete('/deleteBingoSorteio/:idbingosorteios', function (req, res) { + const idbingosorteios = parseInt(req.params.idbingosorteios); + ExecuteQuery(`delete FROM bingosorteios where idbingosorteios = ${idbingosorteios};`, req, res); + }); + + router.post('/insertBingoCartela', function (req, res) { + const idbingosorteios = parseInt(req.body.idbingosorteios); + const Cartelas = req.body.Cartelas; + let SQLCartelas = `insert into bingocartelas (canhoto, idbingosorteios, numeros) values `; + for (let i = 0; i < Cartelas.length; i++) { + Cartelas[i]['numeros'] = Cartelas[i]['numeros'].toString().replace('passaros.png', 'LIVRE'); + SQLCartelas += `(${Cartelas[i]['canhoto']},${idbingosorteios},'${Cartelas[i]['numeros']}'),` + } + SQLCartelas = SQLCartelas.substring(0, SQLCartelas.length - 1); + //console.log(SQLCartelas); + ExecuteQuery(SQLCartelas, req, res); + }); + + router.patch('/updateBingoCartela', function (req, res) { + const canhoto = req.body.canhoto; + const nome = req.body.nome; + const endereco = req.body.endereco; + const telefone = req.body.telefone; + const bingo = req.body.bingo ? 1 : 0; + const cinquina1 = req.body.cinquina1 ? 1 : 0; + const cinquina2 = req.body.cinquina2 ? 1 : 0; + const cinquina3 = req.body.cinquina3 ? 1 : 0; + ExecuteQuery(`update bingocartelas set nome = ?, endereco = ?, telefone = ?, bingo = ?, cinquina1 = ?, cinquina2 = ?, cinquina3 = ? where canhoto = ?;`, req, res, [nome, endereco, telefone, bingo, cinquina1, cinquina2, cinquina3, canhoto]); + }); + + + router.post('/exportarExcel', function (req, res) { + const Cartelas = req.body.Cartelas; + const idbingosorteios = req.body.idbingosorteios; + let Texto2 = `Canhoto;Numeros;Nome;Endereco;Telefone;\r\n`; + for (let i = 0; i < Cartelas.length; i++) { + Texto2 += `${Cartelas[i]['canhoto']};${Cartelas[i]['numeros']};${Cartelas[i]['nome']};${Cartelas[i]['telefone']};\r\n`; + } + const fs = require('fs'); + fs.writeFile('/var/www/html/Jogos/Bingo/Gerador/Cartelas/' + idbingosorteios + '.csv', Texto2, 'utf8', function (err) { + let Sucesso = false; + if (err) { + console.log("Erro ao salvar cartelas"); + } + else { + console.log("Cartelas salvas com sucesso"); + Sucesso = true; + } + res.send(Sucesso); + }); + }); + + + return router; +} + +module.exports = routes; \ No newline at end of file diff --git a/server/controllers/checkoutController.js b/server/controllers/checkoutController.js new file mode 100644 index 0000000..7cb671f --- /dev/null +++ b/server/controllers/checkoutController.js @@ -0,0 +1,265 @@ +const { MercadoPagoConfig, Preference, Payment } = require('mercadopago'); + +const express = require('express'); +const router = express.Router(); + +//const client = new MercadoPagoConfig({ accessToken: 'TEST-7218616229800258-090908-d403b108f1f9c31e432f525c8abb14b3-115139428' }); +const client = new MercadoPagoConfig({ accessToken: 'APP_USR-7218616229800258-090908-6281afa294bbb2de7f68e1e336539ba1-115139428' }); + +var routes = function () { + + + + router.post('/buy', function (req, res) { + console.log(`${new Date().toUTCString()} - ${req.originalUrl} ${' called'}`); + const idprodutos = parseInt(req.body.idprodutos); + const idusuarios = parseInt(req.body.idusuarios); + const qtd = parseInt(req.body.qtd); + + const sqlQuery = `SELECT + pdt.idprodutos, + pdt.valor, + sis.idsistemas, + sis.nome, + tpl.idtiposlicenca, + tpl.descricao, + (SELECT us.cpf from usuarios us WHERE us.idusuarios = ?) as cpf + FROM produtos pdt + INNER JOIN sistemas sis ON sis.idsistemas = pdt.idsistemas + INNER JOIN tiposlicenca tpl ON tpl.idtiposlicenca = pdt.idtiposlicenca + WHERE pdt.idprodutos = ?`; + + mysqlConnection.query(sqlQuery, [idusuarios, idprodutos], function (error, results, fields) { + if (error) { + return res.status(500).send({ error: 'Erro ao consultar o banco de dados.' }); + } + + const produto = results[0]; + if (produto['idtiposlicenca'] == 6) { + const sqlGerarChave = `CALL GerarInserirChave(?, ?, ?, @SerialKey, @idChave);`; + mysqlConnection.query(sqlGerarChave, [produto['cpf'], 30, produto['idsistemas']], function (chaveError, resChave) { + if (chaveError) { + return res.status(500).send({ error: 'Erro ao gerar chave.' }); + } + else { + const serial = resChave[0]?.[0]['SerialKey'] + res.status(200).send({url: null, chave: serial}); + } + }) + } + else { + const sqlGetVenda = `SELECT * FROM produtosvendas WHERE idprodutos = ? AND idusuarios = ? AND quantidade = ? AND status IS NULL;`; + mysqlConnection.query(sqlGetVenda, [produto.idprodutos, idusuarios, qtd], function (getError, getVenda) { + if (getError) { + return res.status(500).send({ error: 'Erro ao consultar venda no banco de dados.' }); + } + + if (getVenda.length == 0) { + const sqlCreate = `INSERT INTO produtosvendas (idprodutos, idusuarios, quantidade, valor) VALUES (?, ?, ?, ?)`; + mysqlConnection.query(sqlCreate, [produto.idprodutos, idusuarios, qtd, qtd * produto.valor], function (createError, venda) { + if (createError) { + return res.status(500).send({ error: 'Erro ao criar venda no banco de dados.' }); + } + + const preference = new Preference(client); + const pref = { + body: { + items: [ + { + title: produto.nome + " " + produto.descricao, + quantity: qtd, + unit_price: produto.valor + } + ], + notification_url: 'https://zendioninc.com.br/api/checkout/webhook', + external_reference: "" + venda.insertId + } + }; + //console.log(pref); + preference.create(pref) + .then(response => { + //console.log(response); + const newPreferenceId = response.id; // ID da nova preferência criada + + // Atualiza o campo preference_id no banco de dados + const updateQuery = `UPDATE produtosvendas SET preference_id = ? WHERE idprodutosvendas = ?`; + mysqlConnection.query(updateQuery, [newPreferenceId, venda.insertId], function (updateError) { + if (updateError) { + return res.status(500).send({ error: 'Erro ao atualizar o preference_id no banco de dados.' }); + } + + // Redireciona para o checkout com a nova preferência + res.status(200).send({url: response.init_point}); + //res.redirect(response.init_point); + }); + }) + .catch(error => { + console.error('Erro ao criar a preferência:', error); + return res.status(500).send({ error: 'Erro ao criar a preferência de pagamento.' }); + }); + }); + } + else { + // Se já existir, redireciona para o checkout utilizando o preference_id existente + const init_point = `https://www.mercadopago.com.br/checkout/v1/redirect?pref_id=${getVenda[0].preference_id}`; + res.status(200).send({url: init_point}); + //return res.redirect(init_point); + } + }); + } + }); + }); + + router.post('/webhook', function (req, res) { + const paymentData = req.body; + + //console.log(paymentData); + + // Verifica o tipo de notificação recebida + if (paymentData.type === 'payment') { + const paymentId = paymentData.data.id; + //console.log(paymentId); + + // Consultar o status do pagamento no Mercado Pago usando o ID + const payment = new Payment(client); + payment.get({ + id: paymentId, + }) + .then(response => { + //console.log(response); + const vendaId = response.external_reference; + const status = response.status; + + if (vendaId == null) { + console.error('ID da venda nao informado!'); + return res.status(500).send('ID da venda nao informado!'); + } + + const updateQuery = `UPDATE produtosvendas SET status = ? WHERE idprodutosvendas = ?;`; + mysqlConnection.query(updateQuery, [status, vendaId], function (error) { + if (error) { + console.error('Erro ao atualizar status do pagamento no banco de dados:', error); + return res.status(500).send('Erro ao atualizar banco de dados.'); + } + + if (status === 'approved') { + // Pagamento foi aprovado, agora você pode liberar a licença + console.log('Pagamento aprovado!'); + + const getQuery = `SELECT + pdt.idsistemas, + usu.idusuarios, + usu.cpf, + tpl.dias + FROM produtosvendas pdv + INNER JOIN usuarios usu ON usu.idusuarios = pdv.idusuarios + INNER JOIN produtos pdt ON pdt.idprodutos = pdv.idprodutos + INNER JOIN tiposlicenca tpl ON tpl.idtiposlicenca = pdt.idtiposlicenca + WHERE pdv.idprodutosvendas = ?;`; + mysqlConnection.query(getQuery, [vendaId], function (errGet, resGet) { + if (errGet) { + console.error('Erro ao consultar dados do usuario no banco de dados:', errGet); + return res.status(500).send('Erro ao consultar dados do usuario no banco de dados'); + } + const dados = resGet[0]; + const sqlGenerateSerial = `CALL GerarChave(?, ?, @serialKey); SELECT @serialKey AS serial;`; + mysqlConnection.query(sqlGenerateSerial, [dados.cpf, dados.dias], function (err, results) { + if (err) { + console.error('Erro ao gerar serial:', err); + return res.status(500).send('Erro ao gerar serial'); + } + const serial = results[1][0].serial; + const sqlInsertSerial = ` + INSERT INTO chaves (licenca, data_criacao, data_validade, idusuarios, usada, idsistemas) + VALUES (?, NOW(), DATE_ADD(NOW(), INTERVAL ? DAY), ?, 0, ?); + `; + mysqlConnection.query(sqlInsertSerial, [serial, dados.dias, dados.idusuarios, dados.idsistemas], function (errInsert) { + if (errInsert) { + console.error('Erro ao registrar serial:', errInsert); + return res.status(500).send('Erro ao registrar serial'); + } + res.status(200).send('Licença liberada com sucesso!'); + }); + }); + }); + } else { + // Se o status for diferente de "approved", trate adequadamente (pendente, recusado, etc.) + console.log('Status do pagamento:', status); + res.status(200).send('Pagamento não aprovado.'); + } + }); + }) + .catch(error => { + console.error('Erro ao consultar o pagamento:', error); + res.status(500).send('Erro ao consultar o pagamento.'); + }); + } else { + res.status(400).send('Tipo de notificação não suportado.'); + } + }); + + + router.get('/getProductsSell/:idsistemas', function (req, res) { + const idsistemas = parseInt(req.params.idsistemas); + ExecuteQuery(`SELECT + pdt.idprodutos, + pdt.valor, + tpl.descricao + FROM produtos pdt + INNER JOIN tiposlicenca tpl ON tpl.idtiposlicenca = pdt.idtiposlicenca + WHERE pdt.idsistemas = ${idsistemas} AND pdt.ativado = 1 + ORDER BY tpl.dias ASC;;`, req, res); + }); + + router.get('/getAllProducts/:idsistemas', function (req, res) { + const idsistemas = parseInt(req.params.idsistemas); + ExecuteQuery(`SELECT + pdt.idprodutos, + pdt.valor, + pdt.ativado, + tpl.idtiposlicenca, + tpl.descricao, + (SELECT COUNT(1) FROM produtosvendas pdv WHERE pdv.idprodutos = pdt.idprodutos) AS vendas, + (SELECT COUNT(1) FROM produtosvendas pdv WHERE pdv.idprodutos = pdt.idprodutos AND pdv.status = 'approved') AS compensados + FROM produtos pdt + INNER JOIN tiposlicenca tpl ON tpl.idtiposlicenca = pdt.idtiposlicenca + WHERE pdt.idsistemas = ${idsistemas} + ORDER BY pdt.valor ASC;`, req, res); + }); + + router.post('/insertProduto', function (req, res, next) { + const idsistemas = parseInt(req.body.idsistemas); + const idtiposlicenca = parseInt(req.body.idtiposlicenca); + const valor = req.body.valor; + const ativado = req.body.ativado ? 1 : 0; + + const sqlQuery = `INSERT INTO produtos (idsistemas, idtiposlicenca, valor, ativado) + VALUES (${idsistemas}, ${idtiposlicenca}, ${valor}, ${ativado});`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.patch('/updateProduto', function (req, res, next) { + const idprodutos = parseInt(req.body.idprodutos); + const idsistemas = parseInt(req.body.idsistemas); + const idtiposlicenca = parseInt(req.body.idtiposlicenca); + const valor = req.body.valor; + const ativado = req.body.ativado ? 1 : 0; + const sqlQuery = `update produtos set + idtiposlicenca = ${idtiposlicenca}, + valor = ${valor}, + ativado = ${ativado} + where idprodutos = ${idprodutos};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.delete('/deleteProduto/:idprodutos', function (req, res, next) { + const idprodutos = req.params.idprodutos; + const sqlQuery = `DELETE FROM produtos WHERE idprodutos = ${idprodutos};`; + ExecuteQuery(sqlQuery, req, res); + }); + + + return router; +} + +module.exports = routes; \ No newline at end of file diff --git a/server/controllers/emailController.js b/server/controllers/emailController.js new file mode 100644 index 0000000..b596833 --- /dev/null +++ b/server/controllers/emailController.js @@ -0,0 +1,100 @@ +require('dotenv').config(); + +const express = require('express'); +const router = express.Router(); +const nodemailer = require('nodemailer'); + +const transporter = nodemailer.createTransport({ + host: process.env.SMTP_HOST, + port: Number(process.env.SMTP_PORT || 587), + secure: process.env.SMTP_SECURE === 'true', + auth: { + user: process.env.SMTP_USER, + pass: process.env.SMTP_PASS + } +}); + +// Teste de conexão SMTP ao iniciar +transporter.verify(function (error, success) { + if (error) { + console.error('[SMTP] Falha na conexão:', error); + } else { + console.log('[SMTP] Servidor pronto para enviar emails'); + } +}); + +async function EnviarEmailFunc(Para, Assunto, Conteudo, res) { + try { + if (!Para || !Assunto || !Conteudo) { + throw new Error('Para, Assunto e Conteudo são obrigatórios.'); + } + + const fromEmail = (process.env.SMTP_FROM_EMAIL || '').trim(); + const fromName = (process.env.SMTP_FROM_NAME || 'Zendion, INC.').trim(); + + if (!fromEmail) { + throw new Error('SMTP_FROM_EMAIL não configurado no .env.'); + } + + const msg = { + to: Para, + from: { + name: fromName, + address: fromEmail + }, + subject: Assunto, + text: Conteudo.replace(/<[^>]*>/g, ''), + html: Conteudo + }; + + const info = await transporter.sendMail(msg); + + console.log('[EMAIL] Enviado:', info.messageId); + + if (res) { + return res.status(200).send({ + sucesso: true, + message: 'Email enviado com sucesso', + messageId: info.messageId + }); + } + + return { + sucesso: true, + messageId: info.messageId + }; + + } catch (error) { + console.error('[EMAIL] Erro ao enviar:', error); + + if (res) { + return res.status(500).send({ + sucesso: false, + message: 'Erro ao enviar o e-mail', + detalhe: error.message + }); + } + + return { + sucesso: false, + erro: error.message + }; + } +} + +router.post('/enviarEmail', function (req, res) { + const { Para, Assunto, Conteudo } = req.body; + + if (!Para || !Assunto || !Conteudo) { + return res.status(400).send({ + error: 'Os campos "Para", "Assunto" e "Conteudo" são obrigatórios.' + }); + } + + EnviarEmailFunc(Para, Assunto, Conteudo, res); +}); + +module.exports = { + router, + EnviarEmailFunc +}; \ No newline at end of file diff --git a/server/controllers/gcaController.js b/server/controllers/gcaController.js new file mode 100644 index 0000000..83046b1 --- /dev/null +++ b/server/controllers/gcaController.js @@ -0,0 +1,406 @@ +require('../connector'); +const express = require('express'); +const router = express.Router(); +const nodemailer = require('nodemailer'); +const formidable = require('formidable'); +const shell = require('shelljs'); +var admin = require("firebase-admin"); +var serviceAccount = require("./../gca-control-bcb9b-firebase-adminsdk-pf0od-2e672cfd0a.json"); + + +var routes = function () { + + //#region EMAIL + const Email = 'gcacontrol@gmail.com'; + const Senha = 'gcaCtrl123'; + var transporter = nodemailer.createTransport({ + service: 'gmail', + //host: "email-ssl.com.br", + //port: 465, + //secure: true, + auth: { + user: Email, + pass: Senha, + //user: 'iyrconline@myrobot.com.br', + //pass: 'iyrcMyrobot@2255', + //user: 'myrobotschool@gmail.com', + //pass: 'myrobot2020**==', + } + }); + + function EnviarEmail(Dados, idemail) { + ConexaoMySQL_GCA.query(`SELECT + em.* + FROM emails em + where em.idemails = ${idemail};`, function (error, results, fields) { + if (!error && results.length > 0) { + let Mensagem = results[0]['texto']; + for (let i = 0; i < 10; i++) { + if (Dados['descricao']) + Mensagem = Mensagem.replace('>DISPOSITIVO<', Dados['descricao']); + if (Dados['nome']) + Mensagem = Mensagem.replace('>CLIENTE<', Dados['nome']); + if (Dados['Segredo']) + Mensagem = Mensagem.replace('>SEGREDO<', Dados['Segredo']); + } + var mailOptions = { + from: "GCA Control ", + to: Dados['email'], + subject: results[0]['assunto'], + html: Mensagem + }; + transporter.sendMail(mailOptions, function (error, info) { + if (error) { + console.log(error); + } + else { + console.log('Email enviado para: ' + mailOptions.to + ' - ' + info.response); + ConexaoMySQL_GCA.query(`insert into emailsenviados (iddispositivos, idemails) values (${Dados['iddispositivos']}, ${idemail});`, function (error2, results2, fields2) { + }); + } + /* + // envia sms + const Hash = "0cc6fcb95a28d506def8259e1e8dd90e"; + const https = require('https'); + https.get(`https://smsmobile.com.br/sms/shortcode/routes/sms.php?hash=${Hash}&mensagem=${encodeURI(Mensagem)}&numero=${Telefone}`, (resp) => { + let data = ''; + resp.on('data', (chunk) => { + data += chunk; + }); + resp.on('end', () => { + console.log("SMS enviado com sucesso para " + Dispositivo['telefone']); + }); + }).on("error", (err) => { + console.log("Erro ao enviar SMS: " + err.message); + }); + */ + }); + } + }); + } + + router.get('/sendEmail/:iddispositivos/:idemail', (req, res) => { + const iddispositivos = parseInt(req.params.iddispositivos); + const idemail = parseInt(req.params.idemail); + ConexaoMySQL_GCA.query(`SELECT di.iddispositivos, di.descricao, di.alarme, cl.email, cl.telefone, cl.token FROM dispositivos di inner join clientes cl on cl.idclientes = di.idclientes WHERE di.iddispositivos = ${iddispositivos};`, function (error2, results2, fields2) { + EnviarEmail(results2[0], idemail); + console.log(req.originalUrl + "/ success 200"); + res.send(true); + }); + }); + + //#endregion + + //#region DISPOSITIVOS + + router.get('/getDispositivos', (req, res) => { + ConexaoMySQL_GCA.query(`select + di.iddispositivos, + di.qrcode, + di.idkits, + ki.descricao as 'Kit', + di.insert_date + from dispositivos di + left join clientes cl on cl.idclientes = di.idclientes + inner join kits ki on ki.idkits = di.idkits + where cl.idclientes is null;`, function (error, results, fields) { + if (error) throw error; + if (results) { + console.log(req.originalUrl + "/ success 200"); + res.send(results); + } + else { + console.log(req.originalUrl + "/ success 500"); + res.send([]); + } + }); + }); + + router.get('/getDispositivosCliente/:segredo', (req, res) => { + const segredo = req.params.segredo; + ConexaoMySQL_GCA.query(`select + di.iddispositivos, + di.qrcode, + di.descricao, + di.idclientes, + cl.nome as 'Cliente', + di.idkits, + ki.descricao as 'Kit', + di.alarme, + di.statusalarme, + di.portao, + di.lampada, + di.statuslampada, + di.update_date + from dispositivos di + inner join clientes cl on cl.idclientes = di.idclientes + inner join kits ki on ki.idkits = di.idkits + where cl.segredo = '${segredo}';`, function (error, results, fields) { + if (error) throw error; + if (results) { + console.log(req.originalUrl + "/ success 200"); + res.send(results); + } + else { + console.log(req.originalUrl + "/ success 500"); + res.send([]); + } + }); + }); + + router.get('/getStatus/:segredo/:iddispositivos', (req, res) => { + const segredo = req.params.segredo; + const iddispositivos = parseInt(req.params.iddispositivos); + ConexaoMySQL_GCA.query(`select + di.alarme, + di.statusalarme, + di.portao, + di.lampada, + di.statuslampada + FROM dispositivos di + inner join clientes cl on cl.idclientes = di.idclientes + where cl.segredo = '${segredo}' and di.iddispositivos = ${iddispositivos};`, function (error, results, fields) { + if (error) throw error; + if (results[0]) { + console.log(req.originalUrl + "/ success 200"); + res.send(results[0]); + } + else { + console.log(req.originalUrl + "/ success 500"); + res.send(false); + } + }); + }); + + router.get('/setStatus/:segredo/:iddispositivos/:Atuador/:Estado', (req, res) => { + const segredo = req.params.segredo; + const iddispositivos = parseInt(req.params.iddispositivos); + const Atuador = parseInt(req.params.Atuador); + const Estado = parseInt(req.params.Estado); + ConexaoMySQL_GCA.query(`UPDATE dispositivos D + inner join clientes C on C.idclientes = D.idclientes + SET ${ + (Atuador == 0) ? 'alarme' : + (Atuador == 1) ? 'statusalarme' : + (Atuador == 2) ? 'portao' : + (Atuador == 3) ? 'lampada' : + (Atuador == 4) ? 'statuslampada' : + ''} = ${Estado} + WHERE D.iddispositivos = ${iddispositivos} and C.segredo = '${segredo}';`, function (error, results, fields) { + if (error) throw error; + console.log(req.originalUrl + "/ success 200"); + let Resposta = shell.exec(`sudo mosquitto_pub -h gcacontrol.mooo.com -p 1883 -t "${segredo}" -m "${Atuador}:${Estado}" -u "tht" -P "123"`); + if (Atuador == 1 && Estado == 1) { + ConexaoMySQL_GCA.query(`select di.iddispositivos, di.descricao, di.alarme, cl.email, cl.telefone, cl.token from dispositivos di inner join clientes cl on cl.idclientes = di.idclientes where di.iddispositivos = ${iddispositivos};`, function (error2, results2, fields2) { + if (results2[0]['alarme'] == 1) { + EnviarEmail(results2[0], 1); + + const DadosMensagem = { + title: "Alarme Acionado!", + message: "Seu alarme no dispositivo " + results2[0]['descricao'] + " foi acionado!" + }; + EnviarNotificacao(DadosMensagem, results2[0]['token']); + } + res.send(true); + }); + } + else { + res.send(true); + } + }); + }); + + router.post('/vincularDispositivo', (req, res) => { + const descricao = req.body.descricao; + const segredo = req.body.segredo; + const iddispositivos = parseInt(req.body.iddispositivos); + ConexaoMySQL_GCA.query(`UPDATE dispositivos set + descricao = '${descricao}', + idclientes = (select idclientes from clientes where segredo = '${segredo}') + where iddispositivos = ${iddispositivos};`, function (error, results, fields) { + if (!error) { + console.log(req.originalUrl + "/ success 200"); + res.send(true); + } + else { + console.log(error); + console.log(req.originalUrl + "/ error 500"); + res.send(false); + } + }); + }); + + //#endregion + + //#region CLIENTES + + router.post('/insertCliente', (req, res) => { + const nome = req.body.nome; + const cidade = req.body.cidade; + const telefone = req.body.telefone; + const email = req.body.email; + const cpf = req.body.cpf; + ConexaoMySQL_GCA.query(`select * from clientes where cpf = '${cpf}' or email = '${email}';`, function (errorS, resultsS, fieldsS) { + if (resultsS.length == 0) { + GeraSegredo(function(segredo) { + ConexaoMySQL_GCA.query(`insert into clientes (nome, cidade, telefone, email, segredo, cpf) + values ('${nome}', '${cidade}', '${telefone}', '${email}', '${segredo}', '${cpf}');`, function (error, results, fields) { + if (error) throw error; + if (!error) { + console.log(req.originalUrl + "/ success 200"); + let Cliente = { + nome: nome, + email: email, + telefone: telefone, + Segredo: segredo + } + EnviarEmail(Cliente, 2); + res.redirect(`http://${req.headers.host.split(':')[0]}/cadastro.html?segredo=${segredo}`); + } + else { + console.log(req.originalUrl + "/ error 500"); + res.redirect(`http://${req.headers.host.split(':')[0]}/cadastro.html?erro=0`); + } + }); + }); + } + else { + res.redirect(`http://${req.headers.host.split(':')[0]}/cadastro.html?erro=1`); + } + }); + }); + + function GeraSegredo(callback) { + const caracteresPermitidos = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789!@$?_-"; + let secret = ""; + ConexaoMySQL_GCA.query(`select segredo from clientes;`, function (error, results, fields) { + for (let i = 0; i < 15; i++) { + secret += caracteresPermitidos[Math.floor(Math.random() * (caracteresPermitidos.length))]; + } + let Aprovado = true; + for (let i = 0; i < results.length; i++) { + if (results[i]['segredo'] == secret) + Aprovado = false; + } + if (Aprovado) + callback(secret); + else + GeraSegredo(callback); + }); + } + + router.get('/setClienteToken/:segredo/:token', (req, res) => { + const segredo = req.params.segredo; + const token = req.params.token; + ConexaoMySQL_GCA.query(`UPDATE clientes SET + token = '${token}' + where segredo = '${segredo}';`, function (error, results, fields) { + if (error) throw error; + if (results) { + console.log(req.originalUrl + "/ success 200"); + res.send(true); + } + else { + console.log(req.originalUrl + "/ success 500"); + res.send(false); + } + }); + }); + + router.post('/salvarConfigCliente', (req, res) => { + const Segredo = req.body.Segredo; + const NomeRede = req.body.NomeRede; + const SenhaRede = req.body.SenhaRede; + const Dispositivo = parseInt(req.body.Dispositivo); + ConexaoMySQL_GCA.query(`UPDATE clientes set + nomeRede = '${NomeRede}', + senhaRede = '${SenhaRede}', + indexDispositivo = ${Dispositivo} + where segredo = '${Segredo}';`, function (error, results, fields) { + if (!error) { + console.log(req.originalUrl + "/ success 200"); + res.send(true); + } + else { + console.log(error); + console.log(req.originalUrl + "/ error 500"); + res.send(false); + } + }); + }); + + //#endregion + + //#region CONFIGURACOES + + router.get('/getConfig', (req, res) => { + ConexaoMySQL_GCA.query(`select * from configuracoes;`, function (error, results, fields) { + if (error) throw error; + if (results) { + console.log(req.originalUrl + "/ success 200"); + res.send(results[0]); + } + else { + console.log(req.originalUrl + "/ success 500"); + res.send([]); + } + }); + }); + + //#endregion + + //#region PUSH NOTIFICATION FIREBASE + + admin.initializeApp({ + credential: admin.credential.cert(serviceAccount), + projectId: "gca-control-bcb9b" + }); + + function EnviarNotificacao(DadosMensagem, registrationToken) { + // This registration token comes from the client FCM SDKs. + + const message = { + data: DadosMensagem, + token: registrationToken + }; + + // Send a message to the device corresponding to the provided + // registration token. + admin.messaging().send(message).then((response) => { + // Response is a message ID string. + console.log('Successfully sent message:', response); + }).catch((error) => { + console.log('Error sending message:', error); + }); + } + + router.post('/sendPushNotification', (req, res) => { + const titulo = req.body.titulo; + const mensagem = req.body.mensagem; + const segredo = req.body.segredo; + ConexaoMySQL_GCA.query(`SELECT token FROM clientes WHERE segredo = '${segredo}';`, function (error, results, fields) { + if (!error) { + + const DadosMensagem = { + title: titulo, + message: mensagem + }; + EnviarNotificacao(DadosMensagem, results[0]['token']); + + console.log(req.originalUrl + "/ success 200"); + res.send(true); + } + else { + console.log(error); + console.log(req.originalUrl + "/ error 500"); + res.send(false); + } + }); + }); + + //#endregion + + return router; +} + +module.exports = routes; \ No newline at end of file diff --git a/server/controllers/noticiasController.js b/server/controllers/noticiasController.js new file mode 100644 index 0000000..ba24d0a --- /dev/null +++ b/server/controllers/noticiasController.js @@ -0,0 +1,80 @@ +require('../connector'); +const express = require('express'); +const router = express.Router(); +const formidable = require('formidable'); + +var routes = function () { + + router.get('/getAllNoticias', function (req, res) { + ExecuteQuery(`SELECT * FROM noticias;`, req, res); + }); + + router.get('/getNoticiasEn', function (req, res, next) { + const sqlQuery = `select + idnoticias, + titulo, + descricao, + CASE WHEN habilitado = 1 THEN 'Sim' ELSE 'Não' END AS habilitado, + link + FROM noticias + WHERE habilitado = 1;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getNoticiaByID/:idnoticias', function (req, res, next) { + const idnoticias = req.params.idnoticias; + const sqlQuery = `SELECT * FROM noticias WHERE idnoticias = ${idnoticias};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.post('/insertNoticias', function (req, res, next) { + const idnoticias = req.body.idnoticias; + const titulo = req.body.titulo; + const descricao = req.body.descricao; + const habilitado = req.body.habilitado ? 1 : 0; + const link = req.body.link; + const sqlQuery = `INSERT INTO noticias (titulo, descricao, habilitado, link) + VALUES ('${titulo}', '${descricao}', ${habilitado}, '${link}');`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.patch('/updateNoticias', function (req, res, next) { + const idnoticias = req.body.idnoticias; + const titulo = req.body.titulo; + const descricao = req.body.descricao; + const habilitado = req.body.habilitado ? 1 : 0; + const link = req.body.link; + const sqlQuery = `update noticias set + titulo = '${titulo}', + descricao = '${descricao}', + habilitado = ${habilitado}, + link = '${link}' + where idnoticias = ${idnoticias};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.delete('/deleteNoticias/:idnoticias', function (req, res, next) { + const idnoticias = req.params.idnoticias; + const sqlQuery = `DELETE FROM noticias WHERE idnoticias = ${idnoticias};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.post('/copy', (req, res) => { + let form = new formidable.IncomingForm(); + form.maxFileSize = 600 * 1024 * 1024; + form.parse(req, function(err,fields,files){ + const fs = require('fs'); + var idnoticias = fields.idnoticias; + var pathImagem = files.imagem.path; + var dir = '/var/www/html/imagens/noticias/'; + fs.rename(pathImagem, dir + "noticia_" + idnoticias + ".jpg", function (err) { + console.log("arquivo copiado com sucesso"); + res.send(true); + }); + }); + }); + + return router; +} + +module.exports = routes; \ No newline at end of file diff --git a/server/controllers/oriontardproController.js b/server/controllers/oriontardproController.js new file mode 100644 index 0000000..52cf53e --- /dev/null +++ b/server/controllers/oriontardproController.js @@ -0,0 +1,24 @@ +require('../connector'); +const express = require('express'); +const router = express.Router(); + +var routes = function () { + + router.get('/getAllLogs', function (req, res) { + ExecuteQuery(`select * from vw_oriontard_logs where dataLog > DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 3 MONTH);`, req, res); + }); + + router.post('/insertLog', function (req, res) { + const cpf = req.body.cpf; + const perfil = req.body.perfil; + const latitude = req.body.longitude; + const longitude = req.body.latitude; + const log = req.body.log; + ExecuteQuery(`insert into orionTardProLogs (cpf, perfil, latitude, longitude, log) values (?, ?, ?, ?, ?);`, + req, res, [cpf, perfil, latitude, longitude, log]); + }); + + return router; +} + +module.exports = routes; \ No newline at end of file diff --git a/server/controllers/priorieController.js b/server/controllers/priorieController.js new file mode 100644 index 0000000..c691323 --- /dev/null +++ b/server/controllers/priorieController.js @@ -0,0 +1,585 @@ +require('../connector'); +const express = require('express'); +const router = express.Router(); + +var routes = function () { + + //#region LOGIN + + router.post('/login', function(req, res) { + const usuario = req.body.usuario; + const senha = req.body.senha; + ExecuteQueryPriorie(`select * from usuarios where usuario = '${usuario}' and senha = '${senha}' and habilitado = 1;`, req, res); + }); + + //#endregion + + //#region USUARIOS + + router.post('/cadastrarUsuario', function(req, res) { + const idusuarios = parseInt(req.body.idusuarios); + const iddepartamentos = req.body.iddepartamentos; + const nome = req.body.nome; + const usuario = req.body.usuario; + const senha = req.body.senha; + const habilitado = req.body.habilitado ? 1 : 0; + const email = req.body.email; + ExecuteQueryPriorie(`insert into usuarios (iddepartamentos, nome, senha, usuario, habilitado, email) values + (${iddepartamentos}, '${nome}', '${senha}', '${usuario}', ${habilitado}, '${email}');`, req, res); + }); + + router.patch('/atualizarUsuario', function(req, res) { + const idusuarios = parseInt(req.body.idusuarios); + const iddepartamentos = parseInt(req.body.iddepartamentos); + const nome = req.body.nome; + const usuario = req.body.usuario; + const senha = req.body.senha; + const habilitado = req.body.habilitado ? 1 : 0; + const email = req.body.email; + ExecuteQueryPriorie(`update usuarios set + iddepartamentos = ${iddepartamentos}, + nome = '${nome}', + senha = '${senha}', + usuario = '${usuario}', + habilitado = ${habilitado}, + email = '${email}' + where idusuarios = ${idusuarios};`, req, res); + }); + + router.delete('/removerUsuario/:idusuarios', function(req, res) { + const idusuarios = parseInt(req.params.idusuarios); + ExecuteQueryPriorie(`delete from usuarios + where idusuarios = ${idusuarios};`, req, res); + }); + + router.get('/getAllUsuarios', function(req, res) { + ExecuteQueryPriorie(`select + us.* , + dp.descricao as 'departamento' + from usuarios us + inner join departamentos dp on dp.iddepartamentos = us.iddepartamentos + order by nome asc;`, req, res); + }); + + router.get('/getUsuariosEnabled', function(req, res) { + ExecuteQueryPriorie(`select * from usuarios where habilitado = 1;`, req, res); + }); + + router.get('/getUsuario/:idusuarios', function(req, res) { + const idusuarios = parseInt(req.params.idusuarios); + ExecuteQueryPriorie(`select * from usuarios + where idusuarios = ${idusuarios};`, req, res); + }); + + //#endregion + + //#region TAREFAS + + router.post('/cadastrarTarefa', function(req, res) { + const idtarefas = parseInt(req.body.idtarefas); + const criadapor = parseInt(req.body.criadapor); + const descricao = fixApostrofe(req.body.descricao); + const idprojetos = parseInt(req.body.idprojetos); + const idtopicos = parseInt(req.body.idtopicos); + const idstatus = parseInt(req.body.idstatus); + const idtipotarefa = parseInt(req.body.idtipotarefa); + const previsaoinicio = req.body.previsaoinicio; + const iniciadoem = req.body.iniciadoem; + const previsaotermino = req.body.previsaotermino; + const concluidoem = req.body.concluidoem; + const prioridade = parseInt(req.body.prioridade); + const observacao = fixApostrofe(req.body.observacao); + ExecuteQueryPriorie(`insert into tarefas (criadapor, descricao, idprojetos, idtopicos, idstatus, idtipotarefa, ${(previsaoinicio) ? 'previsaoinicio,' : ''} ${(iniciadoem) ? 'iniciadoem,' : ''} ${(previsaotermino) ? 'previsaotermino,' : ''} ${(concluidoem) ? 'concluidoem,' : ''} prioridade, observacao) values + (${criadapor}, '${descricao}', ${idprojetos}, ${idtopicos}, ${idstatus}, ${idtipotarefa}, ${(previsaoinicio) ? "'" + previsaoinicio + "'," : ''} ${(iniciadoem) ? "'" + iniciadoem + "'," : ''} ${(previsaotermino) ? "'" + previsaotermino + "'," : ''} ${(concluidoem) ? "'" + concluidoem + "'," : ''} ${prioridade}, '${observacao}');`, req, res); + }); + + router.patch('/atualizarTarefa', function(req, res) { + const idtarefas = parseInt(req.body.idtarefas); + const criadapor = parseInt(req.body.criadapor); + const descricao = fixApostrofe(req.body.descricao); + const idprojetos = parseInt(req.body.idprojetos); + const idtopicos = parseInt(req.body.idtopicos); + const idstatus = parseInt(req.body.idstatus); + const idtipotarefa = parseInt(req.body.idtipotarefa); + const previsaoinicio = req.body.previsaoinicio; + const iniciadoem = req.body.iniciadoem; + const previsaotermino = req.body.previsaotermino; + const concluidoem = req.body.concluidoem; + const prioridade = parseInt(req.body.prioridade); + const observacao = fixApostrofe(req.body.observacao); + ExecuteQueryPriorie(`update tarefas set + criadapor = ${criadapor}, + descricao = '${descricao}', + idprojetos = ${idprojetos}, + idtopicos = ${idtopicos}, + idstatus = ${idstatus}, + idtipotarefa = ${idtipotarefa}, + ${(previsaoinicio) ? "previsaoinicio = '" + previsaoinicio + "',": ''} + ${(iniciadoem) ? "iniciadoem = '" + iniciadoem + "',": ''} + ${(previsaotermino) ? "previsaotermino = '" + previsaotermino + "',": ''} + ${(concluidoem) ? "concluidoem = '" + concluidoem + "',": ''} + prioridade = ${prioridade}, + observacao = '${observacao}' + where idtarefas = ${idtarefas};`, req, res, function(Status) { + if (Status == 200 && idstatus == 4) { + const SQLDados = `select + A.*, + us.nome as 'Gerente', + us.email as 'EmailGerente', + us2.nome + from (select distinct + ta.idtarefas, + date_format(ta.concluidoem, '%d/%m/%Y') as 'ConcluidaEm', + dm.idusuarios, + pr.descricao as 'Projeto', + tp.descricao as 'Topico', + ta.descricao as 'Tarefa' + from tarefas ta + inner join projetos pr on pr.idprojetos = ta.idprojetos + inner join topicos tp on tp.idtopicos = ta.idtopicos + inner join departamentosmembros dm on dm.iddepartamentos = pr.iddepartamentos + inner join usuarios us on us.iddepartamentos = dm.iddepartamentos and dm.gestor = 1 + where ta.idtarefas = ${idtarefas}) A + inner join usuarios us on us.idusuarios = A.idusuarios + inner join projetosmembros pm on pm.idtarefas = A.idtarefas + inner join usuarios us2 on us2.idusuarios = pm.idusuarios;`; + connection.query(SQLDados, function(error, Dados, fields) { + if (Dados && Dados[0]['EmailGerente'] != "" && Dados[0]['EmailGerente'] != null) { + let Membros = ""; + for (let i = 0; i < Dados.length; i++) { + if (i > 0) + Membros += ", "; + Membros += Dados[i]['nome']; + } + const Mensagem = `Olá ${Dados[0]['Gerente']}!
+ Uma tarefa do projeto ${Dados[0]['Projeto']} foi marcada com concluída:

+ Projeto: ${Dados[0]['Projeto']}
+ Tópico: ${Dados[0]['Topico']}
+ Tarefa: ${Dados[0]['Tarefa']}
+ Data de Conclusão: ${Dados[0]['ConcluidaEm']}
+ Membros: ${Membros}

+ Acesse o sistema para conferir!

+ Clique aqui para acessar o sistema`; + EnviarEmail(Mensagem, "Tarefa Concluída", Dados[0]['EmailGerente']); + } + }); + } + }); + }); + + router.delete('/removerTarefa/:idtarefas', function(req, res) { + const idtarefas = parseInt(req.params.idtarefas); + ExecuteQueryPriorie(`delete from tarefas + where idtarefas = ${idtarefas};`, req, res); + }); + + router.get('/getAllTarefas', function(req, res) { + ExecuteQueryPriorie(`select * from tarefas;`, req, res); + }); + + router.get('/getTarefa/:idtarefas', function(req, res) { + const idtarefas = parseInt(req.params.idtarefas); + ExecuteQueryPriorie(`select * from tarefas + where idtarefas = ${idtarefas};`, req, res); + }); + + router.get('/getTarefasUsuario/:idusuarios/:iddepartamentos/:IdsStatus/:idprojetos/:idtopicos', function(req, res) { + const idusuarios = parseInt(req.params.idusuarios); + const iddepartamentos = parseInt(req.params.iddepartamentos); + const idprojetos = parseInt(req.params.idprojetos); + const idtopicos = parseInt(req.params.idtopicos); + const IdsStatus = req.params.IdsStatus; + + let Condicao = `pr.iddepartamentos = ${iddepartamentos} /*${(idusuarios == 0) ? 'or' : 'and'}*/and ((`; + if (idusuarios == 0) + Condicao += `pm.idusuarios in (select distinct dm.idusuarios from departamentosmembros dm where dm.iddepartamentos = ${iddepartamentos})`; + else + Condicao += "pm.idusuarios = " + idusuarios; + Condicao += " and st.idstatus in " + IdsStatus; + if (idprojetos > 0) + Condicao += " and ta.idprojetos = " + idprojetos; + if (idtopicos > 0) + Condicao += " and ta.idtopicos = " + idtopicos; + if (IdsStatus.includes("100")) { + //Condicao += `) or (0 = (select count(*) from projetosmembros pm1 where pm1.idtarefas = ta.idtarefas)${(idprojetos > 0) ? ' and ta.idprojetos = ' + idprojetos : ''}))`; + Condicao += `) or (0 = (select count(*) from projetosmembros pm1 inner join tarefas ta1 on ta1.idtarefas = pm1.idtarefas inner join projetos pr1 on pr1.idprojetos = ta1.idprojetos where pm1.idtarefas = ta.idtarefas)${(idprojetos > 0) ? ' and ta.idprojetos = ' + idprojetos : ''}))`; + } + else + Condicao += "))"; + let sqlQuery = `select + A.*, + GROUP_CONCAT(us.nome SEPARATOR ', ') as 'Membros', + GROUP_CONCAT(us.idusuarios SEPARATOR ',') as 'MembrosIDs' + from ( + SELECT distinct + ta.idtarefas, + ta.descricao, + ta.criadapor, + (select us2.nome from usuarios us2 where us2.idusuarios = ta.criadapor) as 'criadapor_d', + ta.idprojetos, + pr.descricao as 'projeto', + pr.iddepartamentos, + ta.idtopicos, + tp.descricao as 'topico', + ta.idstatus, + ta.idstatus as 'idstatus_c', + st.descricao as 'status', + st.prioridade as 'prioridade_s', + st.color, + st.background, + ta.idtipotarefa, + tt.descricao as 'tipotarefa', + ta.previsaoinicio, + ta.iniciadoem, + ta.previsaotermino, + ta.concluidoem, + ta.prioridade, + pd.descricao as 'prioridade_d', + ta.observacao, + date_format(ta.insert_date, '%d/%m/%Y %H:%i') as 'insert_date', + (select count(*) from projetosmembros pm2 where pm2.idtarefas = ta.idtarefas) as 'QtdMembros' + FROM tarefas ta + inner join projetos pr on pr.idprojetos = ta.idprojetos + inner join topicos tp on tp.idtopicos = ta.idtopicos + inner join status st on st.idstatus = ta.idstatus + inner join tipotarefa tt on tt.idtipotarefa = ta.idtipotarefa + left join projetosmembros pm on pm.idtarefas = ta.idtarefas + inner join prioridades pd on pd.prioridade = ta.prioridade + where ${Condicao}) A + left join projetosmembros pm on pm.idtarefas = A.idtarefas + left join usuarios us on us.idusuarios = pm.idusuarios + group by A.idtarefas + order by A.prioridade_s desc, A.prioridade asc, A.idtipotarefa asc;`; + //console.log(sqlQuery); + ExecuteQueryPriorie(sqlQuery, req, res); + }); + + router.get('/getMembrosTarefa/:idtarefas', function(req, res) { + const idtarefas = parseInt(req.params.idtarefas); + ExecuteQueryPriorie(`SELECT + pm.idprojetosmembros, + pm.idusuarios, + pm.idtarefas, + us.nome + FROM projetosmembros pm + left join usuarios us on us.idusuarios = pm.idusuarios + where pm.idtarefas = ${idtarefas};`, req, res); + }); + + router.delete('/removerMembroTarefa/:idtarefas/:idusuarios', function(req, res) { + const idtarefas = parseInt(req.params.idtarefas); + const idusuarios = parseInt(req.params.idusuarios); + ExecuteQueryPriorie(`delete from projetosmembros + where idtarefas = ${idtarefas} and idusuarios = ${idusuarios};`, req, res); + }); + + router.post('/cadastrarTarefaMembros', function(req, res) { + const idtarefas = parseInt(req.body.idtarefas); + const idusuarios = parseInt(req.body.idusuarios); + ExecuteQueryPriorie(`insert into projetosmembros (idusuarios, idtarefas) + values (${idusuarios}, ${idtarefas});`, req, res, function(Status, idprojetosmembros) { + if (Status != 200) { + return; + } + const SQLDados = `select + pm.idusuarios, + us.nome, + us.email, + pr.descricao as 'Projeto', + tp.descricao as 'Topico', + ta.descricao as 'Tarefa', + date_format(ta.previsaoinicio, '%d/%m/%Y') as 'Inicio', + date_format(ta.previsaotermino, '%d/%m/%Y') as 'Previsao', + pd.descricao as 'Prioridade', + dp.descricao as 'Departamento' + from projetosmembros pm + inner join tarefas ta on ta.idtarefas = pm.idtarefas + inner join projetos pr on pr.idprojetos = ta.idprojetos + inner join topicos tp on tp.idtopicos = ta.idtopicos + inner join prioridades pd on pd.prioridade = ta.prioridade + inner join usuarios us on us.idusuarios = pm.idusuarios + inner join departamentos dp on dp.iddepartamentos = pr.iddepartamentos + where idprojetosmembros = ${idprojetosmembros};`; + connection.query(SQLDados, function(error, Dados, fields) { + if (Dados && Dados[0]['email'] != "" && Dados[0]['email'] != null) { + const Mensagem = `Olá ${Dados[0]['nome']}!
+ Você tem uma nova tarefa atribuída no sistema Priorie para o departamento ${Dados[0]['Departamento']}:

+ Projeto: ${Dados[0]['Projeto']}
+ Tópico: ${Dados[0]['Topico']}
+ Tarefa: ${Dados[0]['Tarefa']}
+ Prioridade: ${Dados[0]['Prioridade']}
+ Previsão de início: ${Dados[0]['Inicio']}
+ Previsão de término: ${Dados[0]['Previsao']}

+ Acesse o sistema para conferir!

+ Clique aqui para acessar o sistema`; + EnviarEmail(Mensagem, "Nova Tarefa Atribuída", Dados[0]['email']); + } + }); + }); + }); + + router.get('/getTarefasPorMembro/:IdsStatus/:idprojetos/:idtopicos', function(req, res) { + const IdsStatus = req.params.IdsStatus; + const idprojetos = parseInt(req.params.idprojetos); + const idtopicos = parseInt(req.params.idtopicos); + let Condicao = ""; + if (idprojetos > 0) + Condicao += " and ta.idprojetos = " + idprojetos; + if (idtopicos > 0) + Condicao += " and ta.idtopicos = " + idtopicos; + ExecuteQueryPriorie(`SELECT + pm.idusuarios, + pr.iddepartamentos, + ta.idstatus, + count(*) as 'QtdeTarefas' + FROM projetosmembros pm + inner join tarefas ta on ta.idtarefas = pm.idtarefas + inner join projetos pr on pr.idprojetos = ta.idprojetos + where ta.idstatus in ${IdsStatus}${Condicao} + group by pr.iddepartamentos, pm.idusuarios, ta.idstatus;`, req, res); + }); + + + //#endregion + + //#region STATUS + + router.get('/getAllStatus', function(req, res) { + ExecuteQueryPriorie(`select * from status;`, req, res); + }); + + //#endregion + + //#region DEPARTAMENTOS + + router.get('/getAllDepartamentos', function(req, res) { + ExecuteQueryPriorie(`SELECT * from departamentos order by descricao asc;`, req, res); + }); + + router.get('/getDepartamento/:iddepartamentos', function(req, res) { + const iddepartamentos = parseInt(req.params.iddepartamentos); + ExecuteQueryPriorie(`SELECT * from departamentos where iddepartamentos = ${iddepartamentos} order by descricao asc;`, req, res); + }); + + router.get('/getDepartamentosMembro/:idusuarios', function(req, res) { + const idusuarios = parseInt(req.params.idusuarios); + ExecuteQueryPriorie(`select * from departamentosmembros where idusuarios = ${idusuarios};`, req, res); + }); + + router.get('/getDepMembroDetalhe/:idusuarios', function(req, res) { + const idusuarios = parseInt(req.params.idusuarios); + ExecuteQueryPriorie(`SELECT + dm.iddepartamentosmembros, + dm.idusuarios, + us.nome, + us.iddepartamentos as 'iddepartamentos_u', + dm.iddepartamentos, + dp.descricao, + dm.gestor, + dm.permitecadastro + FROM departamentosmembros dm + inner join usuarios us on us.idusuarios = dm.idusuarios + inner join departamentos dp on dp.iddepartamentos = dm.iddepartamentos + where dm.idusuarios = ${idusuarios} + order by us.nome asc;`, req, res); + }); + + router.get('/getMemborsDepartamento/:iddepartamentos', function(req, res) { + const iddepartamentos = parseInt(req.params.iddepartamentos); + ExecuteQueryPriorie(`SELECT + dm.iddepartamentosmembros, + dm.idusuarios, + us.nome, + us.iddepartamentos as 'iddepartamentos_u', + dm.iddepartamentos, + dp.descricao, + dm.gestor, + dm.permitecadastro + FROM departamentosmembros dm + inner join usuarios us on us.idusuarios = dm.idusuarios + inner join departamentos dp on dp.iddepartamentos = dm.iddepartamentos + where dm.iddepartamentos = ${iddepartamentos} + order by us.nome asc;`, req, res); + }); + + + router.post('/cadastrarDepMembro', function(req, res) { + const iddepartamentosmembros = parseInt(req.body.iddepartamentosmembros); + const idusuarios = parseInt(req.body.idusuarios); + const iddepartamentos = parseInt(req.body.iddepartamentos); + const gestor = req.body.gestor ? 1 : 0; + const permitecadastro = req.body.permitecadastro ? 1 : 0; + ExecuteQueryPriorie(`insert into departamentosmembros (idusuarios, iddepartamentos, gestor, permitecadastro) + values (${idusuarios}, ${iddepartamentos}, ${gestor}, ${permitecadastro});`, req, res); + }); + + router.patch('/atualizarDepMembro', function(req, res) { + const iddepartamentosmembros = parseInt(req.body.iddepartamentosmembros); + const idusuarios = parseInt(req.body.idusuarios); + const iddepartamentos = parseInt(req.body.iddepartamentos); + const gestor = req.body.gestor ? 1 : 0; + const permitecadastro = req.body.permitecadastro ? 1 : 0; + ExecuteQueryPriorie(`update departamentosmembros set + idusuarios = ${idusuarios}, + iddepartamentos = ${iddepartamentos}, + gestpr = ${gestor}, + permitecadastro = ${permitecadastro} + where idtopicos = ${idtopicos};`, req, res); + }); + + router.delete('/removerDepMembro/:iddepartamentosmembros', function(req, res) { + const iddepartamentosmembros = parseInt(req.params.iddepartamentosmembros); + ExecuteQueryPriorie(`delete from departamentosmembros + where iddepartamentosmembros = ${iddepartamentosmembros};`, req, res); + }); + + + //#endregion + + //#region PROJETOS + + router.post('/cadastrarProjeto', function(req, res) { + const idprojetos = parseInt(req.body.idprojetos); + const iddepartamentos = parseInt(req.body.iddepartamentos); + const descricao = fixApostrofe(req.body.descricao); + ExecuteQueryPriorie(`insert into projetos (iddepartamentos, descricao) values + (${iddepartamentos}, '${descricao}');`, req, res); + }); + + router.patch('/atualizarProjeto', function(req, res) { + const idprojetos = parseInt(req.body.idprojetos); + const iddepartamentos = parseInt(req.body.iddepartamentos); + const descricao = fixApostrofe(req.body.descricao); + ExecuteQueryPriorie(`update projetos set + iddepartamentos = ${iddepartamentos}, + descricao = '${descricao}' + where idprojetos = ${idprojetos};`, req, res); + }); + + router.delete('/removerProjeto/:idprojetos', function(req, res) { + const idprojetos = parseInt(req.params.idprojetos); + ExecuteQueryPriorie(`delete from projetos + where idprojetos = ${idprojetos};`, req, res); + }); + + router.get('/getAllProjetos', function(req, res) { + ExecuteQueryPriorie(`select * from projetos;`, req, res); + }); + + router.get('/getProjetosDepartamento/:iddepartamentos', function(req, res) { + const iddepartamentos = parseInt(req.params.iddepartamentos); + ExecuteQueryPriorie(`select * from projetos where iddepartamentos = ${iddepartamentos} order by descricao asc;`, req, res); + }); + + router.get('/getAllTiposTarefas', function(req, res) { + ExecuteQueryPriorie(`select * from tipotarefa;`, req, res); + }); + + //#endregion + + //#region TOPICOS + + router.post('/cadastrarTopico', function(req, res) { + const idtopicos = parseInt(req.body.idtopicos); + const idprojetos = parseInt(req.body.idprojetos); + const descricao = fixApostrofe(req.body.descricao); + ExecuteQueryPriorie(`insert into topicos (idprojetos, descricao) values + (${idprojetos}, '${descricao}');`, req, res); + }); + + router.patch('/atualizarTopico', function(req, res) { + const idtopicos = parseInt(req.body.idtopicos); + const idprojetos = parseInt(req.body.idprojetos); + const descricao = fixApostrofe(req.body.descricao); + ExecuteQueryPriorie(`update topicos set + idprojetos = ${idprojetos}, + descricao = '${descricao}' + where idtopicos = ${idtopicos};`, req, res); + }); + + router.delete('/removerTopico/:idtopicos', function(req, res) { + const idtopicos = parseInt(req.params.idtopicos); + ExecuteQueryPriorie(`delete from topicos + where idtopicos = ${idtopicos};`, req, res); + }); + + router.get('/getAllTopicos', function(req, res) { + ExecuteQueryPriorie(`select * from topicos;`, req, res); + }); + + router.get('/getTopico/:idtopicos', function(req, res) { + const idtopicos = parseInt(req.params.idtopicos); + ExecuteQueryPriorie(`select * from topicos where idtopicos = ${idtopicos} order by descricao asc;`, req, res); + }); + + router.get('/getAllTopicosTarefa/:idprojetos', function(req, res) { + const idprojetos = parseInt(req.params.idprojetos); + ExecuteQueryPriorie(`select * from topicos where idprojetos = ${idprojetos} order by descricao asc;`, req, res); + }); + + //#endregion + + //#region PRIORIDADES + + router.get('/getAllPrioridades', function(req, res) { + ExecuteQueryPriorie(`select * from prioridades;`, req, res); + }); + + //#endregion + + //#region ENVIO DE NOTIFICACOES + + const nodemailer = require('nodemailer'); + const transporter = nodemailer.createTransport({ + service: 'gmail', + auth: { + user: "zendioninc.contato@gmail.com", + pass: "gmailzendioninc", + } + }); + /*var transporter = nodemailer.createTransport({ + host: "email-ssl.com.br", + port: 465, + secure: true, + auth: { + user: 'staff@myrobot.com.br', + pass: 'stAff66**' + } + });*/ + + function EnviarEmail(Mensagem, Assunto, Email) { + var mailOptions = { + from: '"Zendion, INC" ', + to: Email, + subject: Assunto, + html: Mensagem + }; + transporter.sendMail(mailOptions, function (error, info) { + if (error) { + console.log("Erro ao enviar e-mail para: " + mailOptions.to); + console.log(error); + } + else { + console.log('Email enviado com sucesso para: ' + mailOptions.to + ' - ' + info.response); + } + }); + } + + + //#endregion + + //#region FUNCOES + + function fixApostrofe(content) { + for (let i = 0; i < 20; i++) { + content = content.replace("'", '''); + } + return content; + } + + //#endregion + + return router; +} + +module.exports = routes; \ No newline at end of file diff --git a/server/controllers/sistemasController.js b/server/controllers/sistemasController.js new file mode 100644 index 0000000..83110d6 --- /dev/null +++ b/server/controllers/sistemasController.js @@ -0,0 +1,355 @@ +const express = require('express'); +const router = express.Router(); +const formidable = require('formidable'); + +var routes = function () { + + router.get('/getSistemas', function (req, res) { + const sqlQuery = `SELECT * FROM sistemas order by nome asc;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getSistemasEn', function (req, res) { + const sqlQuery = `SELECT * FROM sistemas WHERE habilitado = 1 order by nome asc;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getSistemaByID/:idsistemas', function (req, res) { + const idsistemas = parseInt(req.params.idsistemas); + const sqlQuery = `SELECT * FROM sistemas WHERE idsistemas = ${idsistemas};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getSistemaByIDLista/:idsistemas', function (req, res) { + const idsistemas = parseInt(req.params.idsistemas); + const sqlQuery = `SELECT + s.*, + p.descricao as plataforma, + t.descricao as tiposdesistema, + l.descricao as tiposlicenca + FROM sistemas s + INNER JOIN plataformas p ON s.idplataformas = p.idplataformas + INNER JOIN tiposdesistema t ON t.idtiposdesistema = s.idtiposdesistema + INNER JOIN tiposlicenca l ON s.idtiposlicenca = l.idtiposlicenca + WHERE idsistemas = ${idsistemas} + order by s.nome asc;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getSistemaVersao/:idsistemas', function (req, res) { + const idsistemas = parseInt(req.params.idsistemas); + const sqlQuery = `SELECT versaoatual as VersaoAtual, nome_install as NomeInstall FROM sistemas WHERE idsistemas = ${idsistemas};`; + //ExecuteQuery(sqlQuery, req, res); + mysqlConnection.query(sqlQuery, [], function (error, results, fields) { + console.log(`${new Date().toUTCString()} - ${req.originalUrl} ${(error) ? ' 500 error' : ' 200 success'}`); + res.send(results[0]) + }); + }); + + router.get('/getTiposdesistema', function (req, res) { + const sqlQuery = `SELECT * FROM tiposdesistema order by descricao asc;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getTiposdesistemaByID/:idtiposdesistema', function (req, res) { + const idtiposdesistema = parseInt(req.params.idtiposdesistema); + const sqlQuery = `SELECT * FROM tiposdesistema WHERE idtiposdesistema = ${idtiposdesistema};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getTiposdelicenca', function (req, res) { + const sqlQuery = `SELECT * FROM tiposlicenca order by descricao asc;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getTiposdelicencaByID/:idtiposlicenca', function (req, res) { + const idtiposlicenca = parseInt(req.params.idtiposlicenca); + const sqlQuery = `SELECT * FROM tiposlicenca WHERE idtiposlicenca = ${idtiposlicenca};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getPlataformas', function (req, res) { + const sqlQuery = `SELECT * FROM plataformas order by descricao asc;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getPlataformaByID/:idplataformas', function (req, res) { + let idplataformas = parseInt(req.params.idplataformas); + const sqlQuery = `SELECT * FROM plataformas WHERE idplataformas = ${idplataformas};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getDetalhesByID/:idsistemas', function (req, res) { + const idsistemas = parseInt(req.params.idsistemas); + const sqlQuery = `SELECT * FROM sistemasdetalhes WHERE idsistemas = ${idsistemas} order by ordem asc;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getDetalhesByIDEn/:idsistemas', function (req, res) { + const idsistemas = parseInt(req.params.idsistemas); + const sqlQuery = `SELECT * FROM sistemasdetalhes WHERE idsistemas = ${idsistemas} AND habilitado = 1 order by ordem asc;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.post('/insertSistemas', function (req, res) { + const idsistemas = req.body.idsistemas; + const nome = req.body.nome; + const descricao = req.body.descricao; + const versaoatual = req.body.versaoatual; + const habilitado = req.body.habilitado ? 1 : 0; + const idtiposdesistema = req.body.idtiposdesistema; + const idplataformas = req.body.idplataformas; + const nome_install = req.body.nome_install; + const notasdeatualizacao = req.body.notasdeatualizacao; + const idtiposlicenca = req.body.idtiposlicenca; + const sqlQuery = `INSERT INTO sistemas (nome, descricao, versaoatual, habilitado, downloads, idtiposdesistema, idplataformas, nome_install, notasdeatualizacao, idtiposlicenca) + VALUES ('${nome}', '${descricao}', '${versaoatual}', ${habilitado}, 0, ${idtiposdesistema}, ${idplataformas}, '${nome_install}', '${notasdeatualizacao}', ${idtiposlicenca});`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.patch('/updateSistemas', function (req, res) { + const idsistemas = parseInt(req.body.idsistemas); + const nome = req.body.nome; + const descricao = req.body.descricao; + const versaoatual = req.body.versaoatual; + const habilitado = req.body.habilitado ? 1 : 0; + const idtiposdesistema = req.body.idtiposdesistema; + const idplataformas = req.body.idplataformas; + const nome_install = req.body.nome_install; + const notasdeatualizacao = req.body.notasdeatualizacao; + const idtiposlicenca = req.body.idtiposlicenca; + const sqlQuery = `UPDATE sistemas SET + nome = '${nome}', + descricao = '${descricao}', + versaoatual = '${versaoatual}', + habilitado = ${habilitado}, + idtiposdesistema = ${idtiposdesistema}, + idplataformas = ${idplataformas}, + nome_install = '${nome_install}', + notasdeatualizacao = '${notasdeatualizacao}', + idtiposlicenca = ${idtiposlicenca} + WHERE idsistemas = ${idsistemas};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.delete('/deleteSistemas/:idsistemas', function (req, res) { + const idsistemas = parseInt(req.params.idsistemas); + const sqlQuery = `DELETE FROM sistemas WHERE idsistemas = ${idsistemas};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.delete('/deleteSistemaUsuario/:idsistemas/:idusuarios', function (req, res) { + const idsistemas = parseInt(req.params.idsistemas); + const idusuarios = parseInt(req.params.idusuarios); + const sqlQuery = `DELETE FROM sistemasusuario WHERE idsistemas = ${idsistemas} AND idusuarios = ${idusuarios};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.patch('/downloadSistema', function (req, res) { + const idsistemas = parseInt(req.body.idsistemas); + const sqlQuery = `UPDATE sistemas SET + downloads = downloads + 1 + WHERE idsistemas = ${idsistemas};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.post('/insertSistemaUsuario', function (req, res) { + const idsistemas = parseInt(req.body.idsistemas); + const idusuarios = parseInt(req.body.idusuarios); + const sqlQuery = `INSERT INTO sistemasusuario (idsistemas, idusuarios, data_download) + SELECT DISTINCT ${idsistemas} AS idsistemas, ${idusuarios} AS idusuarios, NOW() AS data_download + FROM sistemasusuario su WHERE (SELECT COUNT(*) qtdDown FROM sistemasusuario WHERE idsistemas = ${idsistemas} AND idusuarios = ${idusuarios}) = 0;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.post('/copy', (req, res) => { + let form = new formidable.IncomingForm(); + form.maxFileSize = 600 * 1024 * 1024; + form.parse(req, function(err,fields,files){ + const fs = require('fs'); + var nome_install = fields.nome; + var versaoatual = fields.versaoatual; + var idsistemas = fields.idsistemas; + var pathArquivo = ""; + var pathIcone = ""; + + try { + pathArquivo = files.arquivo.path; + } + catch(e) { + console.log("não copia arquivo"); + } + try { + pathIcone = files.icone.path; + } + catch(e) { + console.log("não copia icone"); + } + var dir = '/var/www/html/sistemas/'; + if (!fs.existsSync(dir + idsistemas + "/")) { + fs.mkdirSync(dir + idsistemas + "/"); + fs.mkdirSync(dir + idsistemas + "/detalhes/"); + fs.mkdirSync(dir + idsistemas + "/versoes/"); + fs.mkdirSync(dir + idsistemas + "/backups/"); + fs.mkdirSync(dir + idsistemas + "/versoes/" + versaoatual + "/"); + } + else if (!fs.existsSync(dir + idsistemas + "/versoes/" + versaoatual + "/")) { + fs.mkdirSync(dir + idsistemas + "/versoes/" + versaoatual + "/"); + } + if (pathArquivo != "") { + fs.rename(pathArquivo, dir + idsistemas + "/versoes/" + versaoatual + "/" + nome_install, function (err) { + console.log("arquivo copiado com sucesso"); + }); + } + if (pathIcone != "") { + fs.rename(pathIcone, dir + idsistemas + "/icone.png", function (err) { + console.log("icone copiado com sucesso!"); + }); + } + setTimeout(() => { + res.send(true); + }, 200); + }); + }); + + router.get('/getChavesSistema/:idsistemas/:idusuarios', function (req, res) { + const idsistemas = parseInt(req.params.idsistemas); + const idusuarios = parseInt(req.params.idusuarios); + const sqlQuery = `SELECT * FROM chaves + WHERE idsistemas = ${idsistemas} AND idusuarios = ${idusuarios};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getChavesSistemaLista/:idsistemas/:idusuarios', function (req, res) { + const idsistemas = parseInt(req.params.idsistemas); + const idusuarios = parseInt(req.params.idusuarios); + const sqlQuery = `SELECT + idchaves, + licenca as Chave, + data_criacao as DataCriacao, + data_validade as DataValidade, + CASE WHEN data_validade < NOW() THEN 'Expirada' ELSE 'Válida' END AS Status, + CASE WHEN usada = 0 THEN 'Não' ELSE 'Sim' END AS Ativada + FROM chaves + WHERE idsistemas = ${idsistemas} AND idusuarios = ${idusuarios};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.post('/insertChave', function (req, res) { + let licenca = req.body.licenca; + let idusuarios = req.body.idusuarios; + let idsistemas = req.body.idsistemas; + let data_validade = req.body.data_validade; + let newdate = data_validade.toString(); + newdate = newdate.substring(0, newdate.length - 1); + const sqlQuery = `INSERT INTO chaves (licenca, data_criacao, data_validade, idusuarios, usada, idsistemas) + VALUES ('${licenca}', NOW(), '${newdate}', ${idusuarios}, 0, ${idsistemas});`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.post('/insertDetalhe', function (req, res) { + const idsistemasdetalhes = req.body.idsistemasdetalhes; + const idsistemas = req.body.idsistemas; + const descricao = req.body.descricao; + const ordem = parseInt(req.body.ordem); + const habilitado = req.body.habilitado ? 1 : 0; + const sqlQuery = `INSERT INTO sistemasdetalhes (idsistemas, descricao, ordem, habilitado) + VALUES (${idsistemas}, '${descricao}', ${ordem}, ${habilitado});`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.patch('/updateDetalhe', function (req, res) { + const idsistemasdetalhes = req.body.idsistemasdetalhes; + const idsistemas = req.body.idsistemas; + const descricao = req.body.descricao; + const ordem = parseInt(req.body.ordem); + const habilitado = req.body.habilitado ? 1 : 0; + const sqlQuery = `UPDATE sistemasdetalhes SET + idsistemas = ${idsistemas}, + descricao = '${descricao}', + ordem = ${ordem}, + habilitado = ${habilitado} + WHERE idsistemasdetalhes = ${idsistemasdetalhes};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.delete('/deleteDetalhe/:idsistemasdetalhes/:idsistemas/:index', function (req, res) { + const idsistemasdetalhes = parseInt(req.params.idsistemasdetalhes); + const idsistemas = parseInt(req.params.idsistemas); + const index = parseInt(req.params.index); + const sqlQuery = `DELETE FROM sistemasdetalhes WHERE idsistemasdetalhes = ${idsistemasdetalhes};`; + ExecuteQuery(sqlQuery, req, res); + var Path = '/var/www/html/sistemas/' + idsistemas + "/detalhes/sistema_" + index + ".jpg"; + const fs = require('fs'); + if (fs.existsSync(Path)) { + fs.unlinkSync(Path); + } + }); + + router.post('/copyDetalhe', (req, res) => { + let form = new formidable.IncomingForm(); + form.maxFileSize = 600 * 1024 * 1024; + form.parse(req, function(err,fields,files) { + const fs = require('fs'); + var nome = fields.nome; + var idsistemas = fields.idsistemas; + var pathArquivo = files.arquivo.path; + var dir = '/var/www/html/sistemas/' + idsistemas + "/detalhes/"; + fs.rename(pathArquivo, dir + nome, function (err) { + if (err) + console.log(err); + else + console.log("arquivo copiado com sucesso"); + res.send(true); + }); + }); + }); + + router.get('/atualizarListaDetalhes/:idsistemas', (req, res) => { + const idsistemas = parseInt(req.params.idsistemas); + const fs = require('fs'); + var dir = '/var/www/html/sistemas/' + idsistemas + "/detalhes/"; + let i = 0; + fs.readdirSync(dir).forEach(file => { + fs.renameSync(dir + file, dir + file.split('_')[0] + "_" + i + '.jpg'); + i++; + }); + res.send(true); + }); + + router.get('/getSistemaVersoes/:idsistemas', function (req, res) { + const idsistemas = parseInt(req.params.idsistemas); + const fs = require('fs'); + const dir = '/var/www/html/sistemas/' + idsistemas + "/versoes/"; + if (!fs.existsSync(dir)) + fs.mkdirSync(dir); + const versoes = fs.readdirSync(dir); + var lista = []; + versoes.forEach(versao => { + const file = fs.readdirSync(dir + versao)[0]; + const arquivo = dir + versao + "/" + file; + const stats = fs.statSync(arquivo); + lista.push(arquivo + "¬" + stats.birthtime); + }); + res.send(lista); + }); + + router.get('/getSistemaDownloads/:idsistemas', function (req, res) { + const idsistemas = parseInt(req.params.idsistemas); + const fs = require('fs'); + const dir = '/var/www/html/sistemas/' + idsistemas + "/downloads/"; + if (!fs.existsSync(dir)) + fs.mkdirSync(dir); + const downloads = fs.readdirSync(dir); + var lista = []; + downloads.forEach(download => { + var stats = fs.statSync(dir + download); + lista.push(dir + download + "¬" + stats.birthtime); + }); + res.send(lista); + }); + + return router; +} + +module.exports = routes; \ No newline at end of file diff --git a/server/controllers/sliderController.js b/server/controllers/sliderController.js new file mode 100644 index 0000000..8347cc2 --- /dev/null +++ b/server/controllers/sliderController.js @@ -0,0 +1,75 @@ +const express = require('express'); +const router = express.Router(); +const formidable = require('formidable'); + +var routes = function () { + + router.get('/getAllSlides', function (req, res) { + const sqlQuery = `SELECT * FROM slides;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getSlidesEn', function (req, res) { + const sqlQuery = `select + idslides, + descricao, + CASE WHEN habilitado = 1 THEN 'Sim' ELSE 'Não' END AS habilitado, + link + FROM slides + WHERE habilitado = 1;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getSlideByID/:idslides', function (req, res) { + const idslides = parseInt(req.params.idslides); + const sqlQuery = `SELECT * FROM slides WHERE idslides = ${idslides};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.post('/insertSlides', function (req, res) { + const idslides = req.body.idslides; + const descricao = req.body.descricao; + const habilitado = req.body.habilitado ? 1 : 0; + const link = req.body.link; + const sqlQuery = `INSERT INTO slides (descricao, habilitado, link) VALUES ('${descricao}', ${habilitado}, '${link}');`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.patch('/updateSlides', function (req, res) { + const idslides = parseInt(req.body.idslides); + const descricao = req.body.descricao; + const habilitado = req.body.habilitado ? 1 : 0; + const link = req.body.link; + const sqlQuery = `UPDATE slides SET + descricao = '${descricao}', + habilitado = ${habilitado}, + link = '${link}' + WHERE idslides = ${idslides};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.delete('/deleteSlides/:idslides', function (req, res) { + const idslides = parseInt(req.params.idslides); + const sqlQuery = `DELETE FROM slides WHERE idslides = ${idslides};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.post('/copy', (req, res) => { + let form = new formidable.IncomingForm(); + form.maxFileSize = 600 * 1024 * 1024; + form.parse(req, function(err,fields,files){ + const fs = require('fs'); + var idslides = fields.idslides; + var pathImagem = files.imagem.path; + var dir = '/var/www/html/imagens/slides/'; + fs.rename(pathImagem, dir + "slide_" + idslides + ".jpg", function (err) { + console.log("arquivo copiado com sucesso"); + res.send(true); + }); + }); + }); + + return router; +} + +module.exports = routes; \ No newline at end of file diff --git a/server/controllers/usuariosController.js b/server/controllers/usuariosController.js new file mode 100644 index 0000000..1756f05 --- /dev/null +++ b/server/controllers/usuariosController.js @@ -0,0 +1,267 @@ +const express = require('express'); +const router = express.Router(); + +var routes = function () { + + router.get('/ativarUsuario/:idusuarios', function (req, res) { + const idusuarios = parseInt(req.params.idusuarios); + + if (!idusuarios || isNaN(idusuarios)) { + return res.status(400).send(RenderPaginaAtivacao({ + sucesso: false, + titulo: 'Link inválido', + mensagem: 'O link de ativação utilizado é inválido ou está incompleto.', + textoBotao: 'Voltar ao site' + })); + } + + const sqlQuery = ` + UPDATE usuarios + SET habilitado = 1 + WHERE idusuarios = ?; + `; + + mysqlConnection.query(sqlQuery, [idusuarios], function (error, results) { + console.log(`${new Date().toUTCString()} - ${req.originalUrl} ${(error) ? '500 error' : '200 success'}`); + + if (error) { + return res.status(500).send(RenderPaginaAtivacao({ + sucesso: false, + titulo: 'Erro ao ativar conta', + mensagem: 'Não foi possível ativar sua conta no momento. Tente novamente mais tarde ou entre em contato com o suporte.', + textoBotao: 'Voltar ao site' + })); + } + + if (!results || results.affectedRows === 0) { + return res.status(404).send(RenderPaginaAtivacao({ + sucesso: false, + titulo: 'Conta não encontrada', + mensagem: 'Não encontramos uma conta associada a este link de ativação.', + textoBotao: 'Voltar ao site' + })); + } + + return res.status(200).send(RenderPaginaAtivacao({ + sucesso: true, + titulo: 'Conta ativada com sucesso!', + mensagem: 'Sua conta foi ativada e você já pode acessar a plataforma Zendion, INC.', + textoBotao: 'Entrar agora' + })); + }); + }); + + function RenderPaginaAtivacao({ sucesso, titulo, mensagem, textoBotao }) { + const corPrincipal = sucesso ? '#071b63' : '#991b1b'; + const corFundoIcone = sucesso ? '#dcfce7' : '#fee2e2'; + const corIcone = sucesso ? '#15803d' : '#b91c1c'; + const icone = sucesso ? '✓' : '!'; + const linkBotao = sucesso ? 'https://zendioninc.com.br/login' : 'https://zendioninc.com.br/home'; + + return ` + + + + + + ${titulo} + + + +
+ +
+ +
+ Zendion, INC. +
+ +
+
+ ${icone} +
+ +

+ ${titulo} +

+ +

+ ${mensagem} +

+ + + ${textoBotao} + +
+ +
+

+ Zendion, INC. • Este é um processo automático de ativação de conta. +

+
+ +
+
+ + + `; + } + + router.get('/getUsuarios', function (req, res) { + const sqlQuery = `SELECT * FROM usuarios;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getUsuarioByID/:idusuarios', function (req, res) { + const idusuarios = parseInt(req.params.idusuarios); + const sqlQuery = `SELECT * FROM usuarios WHERE idusuarios = ${idusuarios};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getSistemasDoUsuario/:idusuarios', function (req, res) { + const idusuarios = parseInt(req.params.idusuarios); + const sqlQuery = `SELECT + s.idsistemas, + s.nome, + su.data_download, + su.idusuarios, + s.descricao, + (SELECT COUNT(1) FROM chaves cv WHERE cv.idsistemas = s.idsistemas AND cv.idusuarios = su.idusuarios AND cv.data_validade > CURRENT_DATE) AS chavesValidas, + CASE WHEN s.idtiposlicenca = 6 THEN 1 ELSE 0 END AS gratis + FROM sistemasusuario su + INNER JOIN sistemas s ON s.idsistemas = su.idsistemas + WHERE su.idusuarios = ${idusuarios};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.post('/authUser', function (req, res) { + let usuario = req.body.usuario; + let senha = req.body.senha; + const sqlQuery = `SELECT + idusuarios, + nome, + idtiposdeusuario, + habilitado + FROM usuarios + WHERE usuario = '${usuario}' AND senha = '${senha}';`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getTiposdeusuario', function (req, res) { + const sqlQuery = `SELECT * FROM tiposdeusuario;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.post('/insertUsuarios', function (req, res) { + let idusuarios = req.body.idusuarios; + let nome = req.body.nome; + let usuario = req.body.usuario; + let senha = req.body.senha; + let email = req.body.email; + let idtiposdeusuario = req.body.idtiposdeusuario; + let cpf = req.body.cpf; + let habilitado = req.body.habilitado ? 1 : 0; + const sqlQuery = `INSERT INTO usuarios (nome, usuario, senha, data_cadastro, cpf, habilitado, email, idtiposdeusuario) + VALUES ('${nome}', UPPER('${usuario}'), UPPER('${senha}'), now(), '${cpf}', ${habilitado}, '${email}', ${idtiposdeusuario});`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.patch('/updateUsuarios', function (req, res) { + let idusuarios = req.body.idusuarios; + let nome = req.body.nome; + let usuario = req.body.usuario; + let senha = req.body.senha; + let email = req.body.email; + let idtiposdeusuario = req.body.idtiposdeusuario; + let cpf = req.body.cpf; + let habilitado = req.body.habilitado ? 1 : 0; + const sqlQuery = `UPDATE usuarios SET + nome = '${nome}', + usuario = UPPER('${usuario}'), + senha = UPPER('${senha}'), + cpf = '${cpf}', + habilitado = ${habilitado}, + email = '${email}', + idtiposdeusuario = ${idtiposdeusuario} + WHERE idusuarios = ${idusuarios};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.delete('/deleteUsuarios/:idusuarios', function (req, res) { + let idusuarios = parseInt(req.params.idusuarios); + const sqlQuery = `DELETE FROM usuarios WHERE idusuarios = ${idusuarios};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.post('/setUsada', function (req, res) { + let chave = req.body.Chave; + const sqlQuery = `UPDATE chaves SET usada = 1 WHERE licenca = '${chave}';`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.post('/validaLicenca', function (req, res) { + let usuario = req.body.Usuario; + let senha = req.body.Senha; + let chave = req.body.Chave; + const sqlQuery = `SELECT + u.nome AS Nome, + u.cpf AS CPF, + c.usada AS Usada, + c.idsistemas AS IDSistema + FROM chaves c + INNER JOIN usuarios u ON c.idusuarios = u.idusuarios + WHERE c.licenca = '${chave}' AND u.usuario = '${usuario}' AND u.senha = '${senha}' AND u.habilitado = 1 AND c.usada = 0;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.post('/insertTrocasenha', function (req, res) { + let idusuarios = parseInt(req.body.idusuarios); + let tag = req.body.tag; + const sqlQuery = `INSERT INTO trocasenha (idusuarios, tag, usada) VALUES (${idusuarios}, '${tag}', 0);`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getTrocasenha', function (req, res, next) { + const sqlQuery = `SELECT * FROM trocasenha WHERE usada = 0;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.get('/getTrocasenhaByTag/:tag', function (req, res, next) { + let tag = req.params.tag; + const sqlQuery = `SELECT * FROM trocasenha WHERE tag = '${tag}' AND usada = 0;`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.post('/setExpirado', function (req, res, next) { + let tag = req.body.tag; + const sqlQuery = `UPDATE trocasenha SET usada = 1 WHERE tag = '${tag}';`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.patch('/trocaSenha', function (req, res, next) { + const idusuarios = parseInt(req.body.idusuarios); + const senha = req.body.senha; + const sqlQuery = `UPDATE usuarios SET + senha = UPPER('${senha}') + WHERE idusuarios = ${idusuarios};`; + ExecuteQuery(sqlQuery, req, res); + }); + + router.post('/validaLicencaByChave/:idsistemas', function (req, res, next) { + const idsistemas = parseInt(req.params.idsistemas); + const chave = req.body.Chave; + const sqlQuery = `SELECT + u.nome AS Nome, + u.cpf AS CPF, + c.usada AS Usada, + c.idsistemas AS IDSistema + FROM chaves c + INNER JOIN usuarios u ON c.idusuarios = u.idusuarios + WHERE c.licenca = '${chave}' AND c.idsistemas = ${idsistemas} AND u.habilitado = 1 AND c.usada = 0;`; + ExecuteQuery(sqlQuery, req, res); + }); + + return router; +} + +module.exports = routes; \ No newline at end of file diff --git a/server/forever.json b/server/forever.json new file mode 100644 index 0000000..b71c0be --- /dev/null +++ b/server/forever.json @@ -0,0 +1,10 @@ +[ + { + "uid": "zendioninc_api", + "append": true, + "watch": false, + "script": "server.js", + "sourceDir": "/var/www/html/server/", + "workingDir": "/var/www/html/server/" + } +] diff --git a/server/gca-control-bcb9b-firebase-adminsdk-pf0od-2e672cfd0a.json b/server/gca-control-bcb9b-firebase-adminsdk-pf0od-2e672cfd0a.json new file mode 100644 index 0000000..125fdd0 --- /dev/null +++ b/server/gca-control-bcb9b-firebase-adminsdk-pf0od-2e672cfd0a.json @@ -0,0 +1,12 @@ +{ + "type": "service_account", + "project_id": "gca-control-bcb9b", + "private_key_id": "2e672cfd0a80e4d837abe0b0588540954677e4f8", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDKqU5nsJGM5P8C\n4DUsrNYIbIVQxZRxL1mdEvAtYuLg8S6sEjIaxUQElDazQ9W8X4fdU/oVL9oziCCG\nwlJoEKsaPMiLIi4aBzgyCxSjsMk1uJonl++TkEPxUQa4gy8fq/UhHXkBROS9nBy2\n7VWqvcN176oPmYwhg5qLxfhYsZWwwZLBtntpQNaGdA0Ul7h+nwp5qsrkst3Qx2Su\nqfvUOYr8pvvzb+P+eU1Qw5aPBjGQQXcZ8rE4d3qyTSJ+xaZwblPViQhHAch/bt8n\n2uKN/rFjl3QpumzDuiF7z7+dFqf4vnCfpHbar1jLK3HIS6RE+y5iTqBeREzRSLts\n2VAN1PP1AgMBAAECggEACW4nQMIcWmpLJy2Fg+qXULqIrz7BFCLlgF6MewwuLanu\nEkyMH3yc7Y/zsKlK1ZJmGSmKdPhuUUtiZMA/mJSSpaynkfkunIBIADoi79AEOOH6\nGGFkoPZLrGZpEeZsJ6+Mf0nmuCVQyzWWYiO5QrHvBGVOgZ3TQbmk6XVLmQhLGcz+\n6LdO225096syWBvAelcv8iSs2D7mEv920TT5Hj1ZwOuEnfOca38fiBpi359VrbMd\nqEDDO3B3qoy3mrWxWLW1NqTdavLLvJhee651xrFq4f5Zy99uuHVs9DD+L5Yo56BD\nRZBKJOmMHMtvpe3ePyYfr8d1E0ijMuWwIStnRHgFSQKBgQDuKgGwGq54wvg0ybgK\ngqtP/2gGHjXnS1ii5vUxy2DverCv1FcI5ll7/1LcgKQSwFBZGYcg+p7ZMTh31CCe\nQPvIEeFuo0pJIdqcjANKi1V9tQLq2BzJMJ/KXQpkr97Bz9PNaBy877Or/Nsf95Ao\n6rdaCteox5FU1vmFay2rfW/8XQKBgQDZ1qeIFMUFqKnMFKokk/bWnuSeCnwf6IGu\naMKQY0lVV1Y1nM7Ti0fLZRrEpYnSjvwpPYvno+onGH5yUSlP3owJdvaqPdLSAy54\nHrm/YdUUBx+f2LUdcC7hIaS+2b3rXlO5tT98wqbqYvFf5QSVfknjKpAEJ0ADYm7M\n4+bizLaceQKBgGdjcOwkCQ1/hgRUdUKKyxelRmExiDDqMoY1QMfnBCOx3TXXNhk0\n9i+v/Saf6ZoCRl8Hh/O3GHIsvdi3C5nnl+WYbYZ7+Gma+q3u0hbwOaKii6urOYPV\nSeitTy+6cTcto0KOKbuTSyokUHOmIrzAd+vsvQYV7G8qC5PxnRfPEmg5AoGAJShr\nXVgFn4h8pjYkK6cdpNBnuNmbAKpdbI2sGosFGEyUhQKheQ46CeTOIxsFnmgLdVFt\nSu734wFXmFJl1JzmkDq9qp5vFqm6RH0hPBcJDKiGaXLCuinHpVliy7dCoSJu76+O\nC878P+DuwWfEV2e6XMiG1l6HmcwxkDuTx74ZrCkCgYEAsa0RwkyCvQBShW7BtZot\nd6iziBqI+gqSq4KYraWvvMVrjA00IKk0B/uzofnK/aX98HJM4NzO9EAbW0ARpn5D\nDv7FwBRT+fWG8CW+XvT5LiKO7KYILimFm4cvzuv5gztLGexlfFBiUn1+t6fzI5Yf\neCafFoJuPEDGHoIOAqd5PME=\n-----END PRIVATE KEY-----\n", + "client_email": "firebase-adminsdk-pf0od@gca-control-bcb9b.iam.gserviceaccount.com", + "client_id": "105026073302094660795", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-pf0od%40gca-control-bcb9b.iam.gserviceaccount.com" +} diff --git a/server/google-services.json b/server/google-services.json new file mode 100644 index 0000000..ec54517 --- /dev/null +++ b/server/google-services.json @@ -0,0 +1,39 @@ +{ + "project_info": { + "project_number": "274810216572", + "project_id": "gca-control-bcb9b", + "storage_bucket": "gca-control-bcb9b.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:274810216572:android:0d9250a6adb98f84f4a9f9", + "android_client_info": { + "package_name": "com.ZendionInc.GCAControl" + } + }, + "oauth_client": [ + { + "client_id": "274810216572-6c1qof9nb2gns24604s1narajuhfluh4.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyDTKEi1eHsF50y1KIMHY9x04OXXOVqs7ig" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "274810216572-6c1qof9nb2gns24604s1narajuhfluh4.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/server/package-lock.json b/server/package-lock.json new file mode 100644 index 0000000..76c45ac --- /dev/null +++ b/server/package-lock.json @@ -0,0 +1,2558 @@ +{ + "name": "server", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@firebase/app-types": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.7.0.tgz", + "integrity": "sha512-6fbHQwDv2jp/v6bXhBw2eSRbNBpxHcd1NBF864UksSMVIqIyri9qpJB1Mn6sGZE+bnDsSQBC5j2TbMxYsJQkQg==" + }, + "@firebase/auth-interop-types": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.6.tgz", + "integrity": "sha512-etIi92fW3CctsmR9e3sYM3Uqnoq861M0Id9mdOPF6PWIg38BXL5k4upCNBggGUpLIS0H1grMOvy/wn1xymwe2g==" + }, + "@firebase/component": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.5.10.tgz", + "integrity": "sha512-mzUpg6rsBbdQJvAdu1rNWabU3O7qdd+B+/ubE1b+pTbBKfw5ySRpRRE6sKcZ/oQuwLh0HHB6FRJHcylmI7jDzA==", + "requires": { + "@firebase/util": "1.4.3", + "tslib": "^2.1.0" + } + }, + "@firebase/database": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.12.5.tgz", + "integrity": "sha512-1Pd2jYqvqZI7SQWAiXbTZxmsOa29PyOaPiUtr8pkLSfLp4AeyMBegYAXCLYLW6BNhKn3zNKFkxYDxYHq4q+Ixg==", + "requires": { + "@firebase/auth-interop-types": "0.1.6", + "@firebase/component": "0.5.10", + "@firebase/logger": "0.3.2", + "@firebase/util": "1.4.3", + "faye-websocket": "0.11.4", + "tslib": "^2.1.0" + } + }, + "@firebase/database-compat": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-0.1.5.tgz", + "integrity": "sha512-UVxkHL24sZfsjsjs+yiKIdYdrWXHrLxSFCYNdwNXDlTkAc0CWP9AAY3feLhBVpUKk+4Cj0I4sGnyIm2C1ltAYg==", + "requires": { + "@firebase/component": "0.5.10", + "@firebase/database": "0.12.5", + "@firebase/database-types": "0.9.4", + "@firebase/logger": "0.3.2", + "@firebase/util": "1.4.3", + "tslib": "^2.1.0" + }, + "dependencies": { + "@firebase/database-types": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.9.4.tgz", + "integrity": "sha512-uAQuc6NUZ5Oh/cWZPeMValtcZ+4L1stgKOeYvz7mLn8+s03tnCDL2N47OLCHdntktVkhImQTwGNARgqhIhtNeA==", + "requires": { + "@firebase/app-types": "0.7.0", + "@firebase/util": "1.4.3" + } + } + } + }, + "@firebase/database-types": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.7.3.tgz", + "integrity": "sha512-dSOJmhKQ0nL8O4EQMRNGpSExWCXeHtH57gGg0BfNAdWcKhC8/4Y+qfKLfWXzyHvrSecpLmO0SmAi/iK2D5fp5A==", + "requires": { + "@firebase/app-types": "0.6.3" + }, + "dependencies": { + "@firebase/app-types": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.6.3.tgz", + "integrity": "sha512-/M13DPPati7FQHEQ9Minjk1HGLm/4K4gs9bR4rzLCWJg64yGtVC0zNg9gDpkw9yc2cvol/mNFxqTtd4geGrwdw==" + } + } + }, + "@firebase/logger": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.3.2.tgz", + "integrity": "sha512-lzLrcJp9QBWpo40OcOM9B8QEtBw2Fk1zOZQdvv+rWS6gKmhQBCEMc4SMABQfWdjsylBcDfniD1Q+fUX1dcBTXA==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@firebase/util": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.4.3.tgz", + "integrity": "sha512-gQJl6r0a+MElLQEyU8Dx0kkC2coPj67f/zKZrGR7z7WpLgVanhaCUqEsptwpwoxi9RMFIaebleG+C9xxoARq+Q==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@google-cloud/common": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-3.8.1.tgz", + "integrity": "sha512-FOs3NFU6bDt5mXE7IFpwIeqzLwRZNu9lJYl+bHVNkwmxX/w4VyDZAiGjQHhpV1Ek+muNKlX8HPchxaIxNTuOhw==", + "optional": true, + "requires": { + "@google-cloud/projectify": "^2.0.0", + "@google-cloud/promisify": "^2.0.0", + "arrify": "^2.0.1", + "duplexify": "^4.1.1", + "ent": "^2.2.0", + "extend": "^3.0.2", + "google-auth-library": "^7.9.2", + "retry-request": "^4.2.2", + "teeny-request": "^7.0.0" + } + }, + "@google-cloud/firestore": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-4.15.1.tgz", + "integrity": "sha512-2PWsCkEF1W02QbghSeRsNdYKN1qavrHBP3m72gPDMHQSYrGULOaTi7fSJquQmAtc4iPVB2/x6h80rdLHTATQtA==", + "optional": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "functional-red-black-tree": "^1.0.1", + "google-gax": "^2.24.1", + "protobufjs": "^6.8.6" + } + }, + "@google-cloud/paginator": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-3.0.6.tgz", + "integrity": "sha512-XCTm/GfQIlc1ZxpNtTSs/mnZxC2cePNhxU3X8EzHXKIJ2JFncmJj2Fcd2IP+gbmZaSZnY0juFxbUCkIeuu/2eQ==", + "optional": true, + "requires": { + "arrify": "^2.0.0", + "extend": "^3.0.2" + } + }, + "@google-cloud/projectify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-2.1.1.tgz", + "integrity": "sha512-+rssMZHnlh0twl122gXY4/aCrk0G1acBqkHFfYddtsqpYXGxA29nj9V5V9SfC+GyOG00l650f6lG9KL+EpFEWQ==", + "optional": true + }, + "@google-cloud/promisify": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-2.0.4.tgz", + "integrity": "sha512-j8yRSSqswWi1QqUGKVEKOG03Q7qOoZP6/h2zN2YO+F5h2+DHU0bSrHCK9Y7lo2DI9fBd8qGAw795sf+3Jva4yA==", + "optional": true + }, + "@google-cloud/storage": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-5.17.0.tgz", + "integrity": "sha512-qM2+ysRL+SpBuDLYmGGBi4E961VUp0floYTFGCoTwhZsk//vEzVrGQZ2ZXeiNbijcVQNv9iAG2fVvmiBT3jo+Q==", + "optional": true, + "requires": { + "@google-cloud/common": "^3.8.1", + "@google-cloud/paginator": "^3.0.0", + "@google-cloud/promisify": "^2.0.0", + "abort-controller": "^3.0.0", + "arrify": "^2.0.0", + "async-retry": "^1.3.3", + "compressible": "^2.0.12", + "configstore": "^5.0.0", + "date-and-time": "^2.0.0", + "duplexify": "^4.0.0", + "extend": "^3.0.2", + "gaxios": "^4.0.0", + "get-stream": "^6.0.0", + "google-auth-library": "^7.0.0", + "hash-stream-validation": "^0.2.2", + "mime": "^3.0.0", + "mime-types": "^2.0.8", + "p-limit": "^3.0.1", + "pumpify": "^2.0.0", + "snakeize": "^0.1.0", + "stream-events": "^1.0.4", + "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "optional": true + } + } + }, + "@grpc/grpc-js": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.5.0.tgz", + "integrity": "sha512-PDLazk94MFV5hFn/+aSrVj3d5UsOK9HU1xa0ywachvDh1jymBU/Cb+4nGa2NjpfcBoXlHioBC/qIB/XzELednw==", + "optional": true, + "requires": { + "@grpc/proto-loader": "^0.6.4", + "@types/node": ">=12.12.47" + } + }, + "@grpc/proto-loader": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.9.tgz", + "integrity": "sha512-UlcCS8VbsU9d3XTXGiEVFonN7hXk+oMXZtoHHG2oSA1/GcDP1q6OUgs20PzHDGizzyi8ufGSUDlk3O2NyY7leg==", + "optional": true, + "requires": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^6.10.0", + "yargs": "^16.2.0" + } + }, + "@panva/asn1.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@panva/asn1.js/-/asn1.js-1.0.0.tgz", + "integrity": "sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==" + }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=", + "optional": true + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "optional": true + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "optional": true + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=", + "optional": true + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "optional": true, + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=", + "optional": true + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=", + "optional": true + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=", + "optional": true + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=", + "optional": true + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", + "optional": true + }, + "@sendgrid/client": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@sendgrid/client/-/client-8.1.3.tgz", + "integrity": "sha512-mRwTticRZIdUTsnyzvlK6dMu3jni9ci9J+dW/6fMMFpGRAJdCJlivFVYQvqk8kRS3RnFzS7sf6BSmhLl1ldDhA==", + "requires": { + "@sendgrid/helpers": "^8.0.0", + "axios": "^1.6.8" + } + }, + "@sendgrid/helpers": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@sendgrid/helpers/-/helpers-8.0.0.tgz", + "integrity": "sha512-Ze7WuW2Xzy5GT5WRx+yEv89fsg/pgy3T1E3FS0QEx0/VvRmigMZ5qyVGhJz4SxomegDkzXv/i0aFPpHKN8qdAA==", + "requires": { + "deepmerge": "^4.2.2" + } + }, + "@sendgrid/mail": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@sendgrid/mail/-/mail-8.1.3.tgz", + "integrity": "sha512-Wg5iKSUOER83/cfY6rbPa+o3ChnYzWwv1OcsR8gCV8SKi+sUPIMroildimlnb72DBkQxcbylxng1W7f0RIX7MQ==", + "requires": { + "@sendgrid/client": "^8.1.3", + "@sendgrid/helpers": "^8.0.0" + } + }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "optional": true + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-jwt": { + "version": "0.0.42", + "resolved": "https://registry.npmjs.org/@types/express-jwt/-/express-jwt-0.0.42.tgz", + "integrity": "sha512-WszgUddvM1t5dPpJ3LhWNH8kfNN8GPIBrAGxgIYXVCEGx6Bx4A036aAuf/r5WH9DIEdlmp7gHOYvSM6U87B0ag==", + "requires": { + "@types/express": "*", + "@types/express-unless": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.28", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", + "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "@types/express-unless": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@types/express-unless/-/express-unless-0.5.2.tgz", + "integrity": "sha512-Q74UyYRX/zIgl1HSp9tUX2PlG8glkVm+59r7aK4KGKzC5jqKIOX6rrVLRQrzpZUQ84VukHtRoeAuon2nIssHPQ==", + "requires": { + "@types/express": "*" + } + }, + "@types/long": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==", + "optional": true + }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + }, + "@types/node": { + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", + "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "optional": true, + "requires": { + "event-target-shim": "^5.0.0" + } + }, + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "optional": true, + "requires": { + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "optional": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "optional": true + } + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "optional": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "optional": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "optional": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "optional": true, + "requires": { + "retry": "0.13.1" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "axios": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.5.tgz", + "integrity": "sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw==", + "requires": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "optional": true + }, + "bignumber.js": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.0.4.tgz", + "integrity": "sha512-LDXpJKVzEx2/OqNbG9mXBNvHuiRL4PzHCGfnANHMJ+fv68Ads3exDVJeGDJws+AoNEuca93bU3q+S0woeUaCdg==" + }, + "binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==" + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "body-parser": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "~2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + } + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "requires": { + "fill-range": "^7.1.1" + } + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "optional": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.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==", + "optional": 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==", + "optional": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "optional": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + }, + "dependencies": { + "mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "optional": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "optional": true, + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "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=" + }, + "cors": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", + "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "optional": true + }, + "date-and-time": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-2.1.0.tgz", + "integrity": "sha512-X/b2gM7e8zQ7siiE0DhRLeNMpuCkIqec5Jnx4GMk/HWB71a6e5Lz48mH9/GIS/hpLsBRFZfMF1gjXBkY0vq5oA==", + "optional": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "dicer": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.1.tgz", + "integrity": "sha512-ObioMtXnmjYs3aRtpIJt9rgQSPCIhKVkFPip+E9GUDyWl8N435znUxK/JfNwGZJ2wnn5JKQ7Ly3vOK5Q5dylGA==", + "requires": { + "streamsearch": "^1.1.0" + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "optional": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "dotenv": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz", + "integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==" + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "requires": { + "readable-stream": "^2.0.2" + } + }, + "duplexify": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", + "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", + "optional": true, + "requires": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.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==", + "optional": 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==", + "optional": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "optional": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "ecdsa-sig-formatter": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.10.tgz", + "integrity": "sha1-HFlQAPBKiJffuFAAiSoPTDOvhsM=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "optional": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "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==", + "optional": true, + "requires": { + "once": "^1.4.0" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "optional": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "optional": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "optional": true + }, + "express": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", + "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", + "requires": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.3", + "qs": "6.5.1", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.1", + "http-errors": "~1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "~2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "~1.6.15" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": ">= 1.3.1 < 2" + } + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + } + } + } + } + }, + "express-formidable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/express-formidable/-/express-formidable-1.0.0.tgz", + "integrity": "sha1-3JIvBFUTIyJFip7BowHYkbP/yo0=", + "requires": { + "formidable": "^1.0.17" + } + }, + "express-jwt": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/express-jwt/-/express-jwt-5.3.1.tgz", + "integrity": "sha512-1C9RNq0wMp/JvsH/qZMlg3SIPvKu14YkZ4YYv7gJQ1Vq+Dv8LH9tLKenS5vMNth45gTlEUGx+ycp9IHIlaHP/g==", + "requires": { + "async": "^1.5.0", + "express-unless": "^0.3.0", + "jsonwebtoken": "^8.1.0", + "lodash.set": "^4.0.0" + } + }, + "express-unless": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/express-unless/-/express-unless-0.3.1.tgz", + "integrity": "sha1-JVfBRudb65A+LSR/m1ugFFJpbiA=" + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "optional": 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==", + "optional": true + }, + "fast-text-encoding": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz", + "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==", + "optional": true + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" + } + }, + "firebase-admin": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-10.0.1.tgz", + "integrity": "sha512-p8nrhNJyuAj/Pc3M0TWVU8rd4rPoeCREfRt7dJ+EwkMvFCdJ6Cb21y3ZlN3Qsbok8PEQjuWLNy+C3LQMTfUOcQ==", + "requires": { + "@firebase/database-compat": "^0.1.1", + "@firebase/database-types": "^0.7.2", + "@google-cloud/firestore": "^4.5.0", + "@google-cloud/storage": "^5.3.0", + "@types/node": ">=12.12.47", + "dicer": "^0.3.0", + "jsonwebtoken": "^8.5.1", + "jwks-rsa": "^2.0.2", + "node-forge": "^0.10.0" + }, + "dependencies": { + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "requires": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + } + }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "formidable": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", + "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==" + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "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.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "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=", + "optional": true + }, + "gaxios": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz", + "integrity": "sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q==", + "optional": true, + "requires": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.1" + } + }, + "gcp-metadata": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz", + "integrity": "sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==", + "optional": true, + "requires": { + "gaxios": "^4.0.0", + "json-bigint": "^1.0.0" + } + }, + "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==", + "optional": true + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "optional": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "google-auth-library": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.11.0.tgz", + "integrity": "sha512-3S5jn2quRumvh9F/Ubf7GFrIq71HZ5a6vqosgdIu105kkk0WtSqc2jGCRqtWWOLRS8SX3AHACMOEDxhyWAQIcg==", + "optional": true, + "requires": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^4.0.0", + "gcp-metadata": "^4.2.0", + "gtoken": "^5.0.4", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + }, + "dependencies": { + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "optional": true, + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "optional": true, + "requires": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + } + } + }, + "google-gax": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-2.29.3.tgz", + "integrity": "sha512-Knbg+SEFf31GxjjPm9asetQrqPWq0Yjmi4kW1WHE9UhG13y9avzfKnjuAW3Mz79y2LdZO/+LP9wZW2QN6T47SQ==", + "optional": true, + "requires": { + "@grpc/grpc-js": "~1.5.0", + "@grpc/proto-loader": "^0.6.1", + "@types/long": "^4.0.0", + "abort-controller": "^3.0.0", + "duplexify": "^4.0.0", + "fast-text-encoding": "^1.0.3", + "google-auth-library": "^7.6.1", + "is-stream-ended": "^0.1.4", + "node-fetch": "^2.6.1", + "object-hash": "^2.1.1", + "proto3-json-serializer": "^0.1.5", + "protobufjs": "6.11.2", + "retry-request": "^4.0.0" + } + }, + "google-p12-pem": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.1.3.tgz", + "integrity": "sha512-MC0jISvzymxePDVembypNefkAQp+DRP7dBE+zNUPaIjEspIlYg0++OrsNr248V9tPbz6iqtZ7rX1hxWA5B8qBQ==", + "optional": true, + "requires": { + "node-forge": "^1.0.0" + }, + "dependencies": { + "node-forge": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz", + "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==", + "optional": true + } + } + }, + "graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + }, + "gtoken": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.3.1.tgz", + "integrity": "sha512-yqOREjzLHcbzz1UrQoxhBtpk8KjrVhuqPE7od1K2uhyxG2BHjKZetlbLw/SPZak/QqTIQW+addS+EcjqQsZbwQ==", + "optional": true, + "requires": { + "gaxios": "^4.0.0", + "google-p12-pem": "^3.0.3", + "jws": "^4.0.0" + }, + "dependencies": { + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "optional": true, + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "optional": true, + "requires": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "hash-stream-validation": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.4.tgz", + "integrity": "sha512-Gjzu0Xn7IagXVkSu9cSFuK1fqzwtLwFhNhVL8IFJijRNMgUttFbBSIAzKuSIrsFMO1+g1RlsoN49zPIbwPDMGQ==", + "optional": true + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "http-parser-js": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz", + "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==" + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "optional": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "optional": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "optional": true + } + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "optional": true, + "requires": { + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "optional": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "optional": true + } + } + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "optional": 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.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "ipaddr.js": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", + "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=" + }, + "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==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "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==", + "optional": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "optional": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "optional": true + }, + "is-stream-ended": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", + "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==", + "optional": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "optional": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "jose": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/jose/-/jose-2.0.5.tgz", + "integrity": "sha512-BAiDNeDKTMgk4tvD0BbxJ8xHEHBZgpeRZ1zGPPsitSyMgjoMWiLGYAE7H7NpP5h0lPppQajQs871E8NHUrzVPA==", + "requires": { + "@panva/asn1.js": "^1.0.0" + } + }, + "json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "optional": true, + "requires": { + "bignumber.js": "^9.0.0" + }, + "dependencies": { + "bignumber.js": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", + "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==", + "optional": true + } + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsonwebtoken": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.3.0.tgz", + "integrity": "sha512-oge/hvlmeJCH+iIz1DwcO7vKPkNGJHhgkspk8OH3VKlw+mbi42WtD4ig1+VXRln765vxptAv+xT26Fd3cteqag==", + "requires": { + "jws": "^3.1.5", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1" + }, + "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==" + } + } + }, + "jwa": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.6.tgz", + "integrity": "sha512-tBO/cf++BUsJkYql/kBbJroKOgHWEigTKBAjjBEmrMGYd1QMBC74Hr4Wo2zCZw6ZrVhlJPvoMrkcOnlWR/DJfw==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.10", + "safe-buffer": "^5.0.1" + } + }, + "jwks-rsa": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-2.0.5.tgz", + "integrity": "sha512-fliHfsiBRzEU0nXzSvwnh0hynzGB0WihF+CinKbSRlaqRxbqqKf2xbBPgwc8mzf18/WgwlG8e5eTpfSTBcU4DQ==", + "requires": { + "@types/express-jwt": "0.0.42", + "debug": "^4.3.2", + "jose": "^2.0.5", + "limiter": "^1.1.5", + "lru-memoizer": "^2.1.4" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "jws": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.5.tgz", + "integrity": "sha512-GsCSexFADNQUr8T5HPJvayTjvPIfoyJPtLQBwn5a4WZQchcrPMPMAWcC1AzJVRDKyD6ZPROPAxgv6rfHViO4uQ==", + "requires": { + "jwa": "^1.1.5", + "safe-buffer": "^5.0.1" + } + }, + "limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", + "optional": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, + "lodash.set": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", + "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=" + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "optional": 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==", + "optional": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "lru-memoizer": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.1.4.tgz", + "integrity": "sha512-IXAq50s4qwrOBrXJklY+KhgZF+5y98PDaNo0gi/v2KQBFLyWr+JyFvijZXkGKjQj/h9c0OwoE+JZbwUXce76hQ==", + "requires": { + "lodash.clonedeep": "^4.5.0", + "lru-cache": "~4.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", + "integrity": "sha1-HRdnnAac2l0ECZGgnbwsDbN35V4=", + "requires": { + "pseudomap": "^1.0.1", + "yallist": "^2.0.0" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + } + } + }, + "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==", + "optional": true, + "requires": { + "semver": "^6.0.0" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "mercadopago": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/mercadopago/-/mercadopago-2.0.15.tgz", + "integrity": "sha512-sIV/Kow8i2raNrWT0CDjOLiEg92FiqgX55psWj4hEXcqmG3R9n5ST/yALN6awdgG0OzA/fq16YH0qYG/8y++Zg==", + "requires": { + "node-fetch": "^2.6.12", + "uuid": "^9.0.0" + }, + "dependencies": { + "uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==" + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "requires": { + "mime-db": "~1.33.0" + } + }, + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mysql": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.15.0.tgz", + "integrity": "sha512-C7tjzWtbN5nzkLIV+E8Crnl9bFyc7d3XJcBAvHKEVkjrYjogz3llo22q6s/hw+UcsE4/844pDob9ac+3dVjQSA==", + "requires": { + "bignumber.js": "4.0.4", + "readable-stream": "2.3.3", + "safe-buffer": "5.1.1", + "sqlstring": "2.3.0" + } + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" + }, + "nodemailer": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.10.1.tgz", + "integrity": "sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA==" + }, + "nodemon": { + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.14.tgz", + "integrity": "sha512-jakjZi93UtB3jHMWsXL68FXSAosbLfY0In5gtKq3niLSkrWznrVBzXFNOEMJUfc9+Ke7SHWoAZsiMkNP3vq6Jw==", + "requires": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^10.2.1", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "dependencies": { + "balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==" + }, + "brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "requires": { + "balanced-match": "^4.0.2" + } + }, + "debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "requires": { + "ms": "^2.1.3" + } + }, + "minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "requires": { + "brace-expansion": "^5.0.5" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "semver": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==" + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "optional": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "optional": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "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-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=" + }, + "picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==" + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "proto3-json-serializer": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-0.1.6.tgz", + "integrity": "sha512-tGbV6m6Kad8NqxMh5hw87euPS0YoZSAOIfvR01zYkQV8Gpx1V/8yU/0gCKCvfCkhAJsjvzzhnnsdQxA1w7PSog==", + "optional": true, + "requires": { + "protobufjs": "^6.11.2" + } + }, + "protobufjs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", + "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", + "optional": true, + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + } + }, + "proxy-addr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", + "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.6.0" + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "optional": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz", + "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==", + "optional": true, + "requires": { + "duplexify": "^4.1.1", + "inherits": "^2.0.3", + "pump": "^3.0.0" + } + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "optional": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "optional": true + }, + "retry-request": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.2.2.tgz", + "integrity": "sha512-xA93uxUD/rogV7BV59agW/JHPGXeREMWiZc9jhcwY4YdZ7QOtC7qbomYg0n4wyk2lJhggjvKvhNX8wln/Aldhg==", + "optional": true, + "requires": { + "debug": "^4.1.1", + "extend": "^3.0.2" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "optional": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "optional": true + } + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "optional": true + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "signal-exit": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", + "optional": true + }, + "simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "requires": { + "semver": "^7.5.3" + }, + "dependencies": { + "semver": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==" + } + } + }, + "snakeize": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz", + "integrity": "sha1-EMCI2LWOsHazIpu1oE4jLOEmQi0=", + "optional": true + }, + "sqlstring": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.0.tgz", + "integrity": "sha1-UluKT9Jtb3GqYegipsr5dtMa0qg=" + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + }, + "stream-events": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", + "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", + "optional": true, + "requires": { + "stubs": "^3.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==", + "optional": true + }, + "streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "optional": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "optional": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "stubs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", + "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=", + "optional": true + }, + "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" + } + }, + "teeny-request": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-7.1.3.tgz", + "integrity": "sha512-Ew3aoFzgQEatLA5OBIjdr1DWJUaC1xardG+qbPPo5k/y/3fMwXLxpjh5UB5dVfElktLaQbbMs80chkz53ByvSg==", + "optional": true, + "requires": { + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.1", + "stream-events": "^1.0.5", + "uuid": "^8.0.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==", + "requires": { + "is-number": "^7.0.0" + } + }, + "touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==" + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.18" + } + }, + "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==", + "optional": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "optional": true, + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unzipper": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.3.tgz", + "integrity": "sha512-PZ8hTS+AqcGxsaQntl3IRBw65QrBI6lxzqDEL7IAo/XCEqRTKGfOX56Vea5TH9SZczRVxuzk1re04z/YjuYCJA==", + "requires": { + "bluebird": "~3.7.2", + "duplexer2": "~0.1.4", + "fs-extra": "^11.2.0", + "graceful-fs": "^4.2.2", + "node-int64": "^0.4.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "optional": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "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==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "optional": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "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==", + "optional": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "optional": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "optional": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "optional": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "optional": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "optional": true + } + } +} diff --git a/server/package.json b/server/package.json new file mode 100644 index 0000000..a8efd91 --- /dev/null +++ b/server/package.json @@ -0,0 +1,30 @@ +{ + "name": "server", + "version": "1.0.0", + "description": "", + "main": "server.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "@sendgrid/mail": "^8.1.3", + "body-parser": "^1.18.3", + "cors": "^2.8.4", + "dotenv": "^17.4.2", + "express": "^4.16.3", + "express-formidable": "^1.0.0", + "express-jwt": "^5.3.1", + "firebase-admin": "^10.0.1", + "formidable": "^1.2.1", + "jsonwebtoken": "^8.3.0", + "lodash": "^4.17.10", + "mercadopago": "^2.0.15", + "mysql": "^2.15.0", + "nodemailer": "^6.10.1", + "nodemon": "^3.1.14", + "shelljs": "^0.8.4", + "unzipper": "^0.12.3" + } +} diff --git a/server/server.js b/server/server.js new file mode 100644 index 0000000..0bacfa2 --- /dev/null +++ b/server/server.js @@ -0,0 +1,37 @@ +var express = require('express'); +var http = require('http'); +var app = express(); +var cors = require('cors'); +var bodyParser = require('body-parser'); + +var corsOptions = { + origin: '*', + optionsSuccessStatus: 200 +} + +app.use(cors(corsOptions)); +app.use(bodyParser.urlencoded({ extended: true })); +app.use(bodyParser.json()); + +http.createServer(app).listen(1337, () => { + console.log(`API is listening on 1337`); +}); + +app.use('/users', require('./controllers/usuariosController')()); +app.use('/sistemas', require('./controllers/sistemasController')()); +app.use('/slides', require('./controllers/sliderController')()); +app.use('/noticias', require('./controllers/noticiasController')()); +app.use('/arquivos', require('./controllers/arquivosController')()); +app.use('/bingo', require('./controllers/bingoController')()); +app.use('/gca', require('./controllers/gcaController')()); +app.use('/priorie', require('./controllers/priorieController')()); +app.use('/email', require('./controllers/emailController').router); +app.use('/checkout', require('./controllers/checkoutController')()); + +app.use('/otp', require('./controllers/oriontardproController')()); + +// Allteeth +app.use('/api_5/sincronia', require('./controllers/allteeth/sincroniaController')()); +app.use('/api_5/users', require('./controllers/allteeth/usuariosController')()); + +app.use('/agrobase', require('./controllers/agrobaseController')()); diff --git a/src/app/agrobase/login/login.component.html b/src/app/agrobase/login/login.component.html new file mode 100644 index 0000000..8335716 --- /dev/null +++ b/src/app/agrobase/login/login.component.html @@ -0,0 +1 @@ +agrobase login \ No newline at end of file diff --git a/src/app/agrobase/login/login.component.scss b/src/app/agrobase/login/login.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/agrobase/login/login.component.ts b/src/app/agrobase/login/login.component.ts new file mode 100644 index 0000000..c7f82f6 --- /dev/null +++ b/src/app/agrobase/login/login.component.ts @@ -0,0 +1,19 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; + +@Component({ + selector: 'app-agrobase-login', + templateUrl: './login.component.html', + styleUrls: ['./login.component.scss'] +}) +export class AgrobaseLoginComponent implements OnInit { + + constructor( + private route: ActivatedRoute + ) { } + + ngOnInit() { + + } + +} diff --git a/src/app/agrobase/versionamento/versionamento.component.html b/src/app/agrobase/versionamento/versionamento.component.html new file mode 100644 index 0000000..44374fc --- /dev/null +++ b/src/app/agrobase/versionamento/versionamento.component.html @@ -0,0 +1,115 @@ + +

Gerenciamento de Arquivos de Versão

+ + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nome do Arquivo para Download{{ arquivo.ArquivoDownload }}Nome do Arquivo{{ arquivo.Arquivo }}Diretório{{ arquivo.Diretorio }}Extensão{{ arquivo.Extensao }}Versão{{ arquivo.Versao }}Tipo de Arquivo{{ arquivo.TipoArquivo | tipoArquivoNome }}Ações + + +
+ + + +

{{ data?.novo ? 'Adicionar Arquivo' : 'Editar Arquivo' }}

+
+ + + Nome do Arquivo Local + + + + + + Diretório + + + + + + Extensão + + + + + + Versão + + + + + + Tipo do Arquivo + + {{ tipo }} + + + + + + Nome do Arquivo para Download + + + + + + + +
+ + +
+
+
diff --git a/src/app/agrobase/versionamento/versionamento.component.scss b/src/app/agrobase/versionamento/versionamento.component.scss new file mode 100644 index 0000000..aa0c23a --- /dev/null +++ b/src/app/agrobase/versionamento/versionamento.component.scss @@ -0,0 +1,50 @@ +.agrobase-container { + background-color: #1A237E; /* Fundo azul escuro */ + color: #E3F2FD; /* Texto branco */ + padding: 20px; + border-radius: 8px; + display: flex; + flex-direction: column; + align-items: center; +} + +h1 { + color: #FFFFFF; /* Título branco */ + text-align: center; + margin-bottom: 20px; +} + +.table-container { + width: 100%; /* Largura total */ + background-color: #283593; /* Azul médio para destaque */ + color: #E3F2FD; /* Texto branco */ + border-radius: 8px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + margin-top: 20px; +} + +.mat-header-cell, .mat-cell { + color: #E3F2FD; /* Texto branco */ +} + +.mat-form-field { + color: #E3F2FD; /* Texto branco */ + background-color: #283593; /* Azul médio para contraste */ + border-radius: 4px; +} + +.mat-dialog-container { + background-color: #1E88E5; /* Fundo mais claro para o diálogo */ + color: #E3F2FD; + padding: 20px; + border-radius: 8px; +} + +.mat-button { + color: #E3F2FD; + background-color: #42A5F5; /* Botão azul claro */ +} + +.mat-button:hover { + background-color: #64B5F6; /* Azul mais claro para hover */ +} diff --git a/src/app/agrobase/versionamento/versionamento.component.ts b/src/app/agrobase/versionamento/versionamento.component.ts new file mode 100644 index 0000000..5c64e78 --- /dev/null +++ b/src/app/agrobase/versionamento/versionamento.component.ts @@ -0,0 +1,154 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { FormBuilder, FormGroup } from '@angular/forms'; +import { MatDialog, MatTableDataSource } from '@angular/material'; +import { ActivatedRoute } from '@angular/router'; +import { AgrobaseVersionFileModel, TiposArquivos } from 'src/app/models/agrobaseModel'; +import { AgrobaseService } from 'src/app/services/agrobase.service'; + +@Component({ + selector: 'app-agrobase-versionamento', + templateUrl: './versionamento.component.html', + styleUrls: ['./versionamento.component.scss'] +}) +export class AgrobaseVersionamentoComponent implements OnInit { + + displayedColumns: string[] = ['ArquivoDownload', 'Arquivo', 'Diretorio', 'Extensao', 'Versao', 'TipoArquivo', 'acoes']; + arquivos: MatTableDataSource = new MatTableDataSource(); + arquivoForm: FormGroup; + tiposArquivos = Object.values(TiposArquivos).filter(value => typeof value === 'string'); + arquivoSelecionado: File | null = null; + + @ViewChild('dialogoArquivo', null) dialogoArquivo; + + constructor( + private agrobaseService: AgrobaseService, + private dialog: MatDialog, + private fb: FormBuilder, + ) { + this.arquivoForm = this.fb.group({ + id: [''], + Arquivo: [''], + Diretorio: [''], + Extensao: [''], + Versao: [''], + TipoArquivo: [''], + ArquivoDownload: [''], + }); + } + + ngOnInit() { + this.carregarArquivos(); + } + + carregarArquivos() { + this.agrobaseService.getArquivosVersao().subscribe( + (data) => { + this.arquivos.data = data; + }, + (error) => { + console.error('Erro ao carregar dados de versão:', error); + } + ); + } + + abrirDialogoArquivo(arquivo?: AgrobaseVersionFileModel) { + const dialogRef = this.dialog.open(this.dialogoArquivo, { + data: arquivo ? { ...arquivo } : { novo: true } + }); + + if (arquivo) { + this.arquivoForm.patchValue(arquivo); + } else { + this.arquivoForm.reset(); + } + + dialogRef.afterClosed().subscribe(result => { + if (result) { + this.salvarArquivo(result); + } + }); + } + + onFileSelected(event: any) { + this.arquivoSelecionado = event.target.files[0] || null; + } + + // Este método irá enviar o arquivo .vsf atualizado para o servidor + atualizarArquivoVsf() { + const jsonData = JSON.stringify(this.arquivos.data); + + this.agrobaseService.atualizarVsfFile(jsonData).subscribe( + () => console.log("Arquivo .vsf atualizado com sucesso no servidor."), + (error) => console.error("Erro ao atualizar o arquivo .vsf:", error) + ); + } + + // Modifique o método salvarArquivo para incluir a atualização do .vsf após o upload do arquivo + salvarArquivo(dadosArquivo: AgrobaseVersionFileModel) { + if (this.arquivoSelecionado) { + this.agrobaseService.uploadFile(this.arquivoSelecionado, dadosArquivo.ArquivoDownload).subscribe(response => { + this.salvarNaTabela(dadosArquivo); + this.atualizarArquivoVsf(); // Chama a atualização do .vsf + }); + } else { + this.salvarNaTabela(dadosArquivo); + this.atualizarArquivoVsf(); // Atualiza o .vsf mesmo sem upload de arquivo + } + } + + salvarNaTabela(dadosArquivo: AgrobaseVersionFileModel) { + + console.log(dadosArquivo.TipoArquivo); + dadosArquivo.TipoArquivo = TiposArquivos[dadosArquivo.TipoArquivo as unknown as keyof typeof TiposArquivos]; + console.log(dadosArquivo.TipoArquivo); + + let index = this.arquivos.data.findIndex(a => + a.id === dadosArquivo.id || + (a.Arquivo === dadosArquivo.Arquivo && a.Diretorio === dadosArquivo.Diretorio) + ); + + if (index >= 0) { + // Substitui o item existente com os dados atualizados + this.arquivos.data[index] = dadosArquivo; + } else { + // Adiciona um novo item caso não exista na lista + dadosArquivo.id = this.gerarIdUnico(); // Gera um ID único + this.arquivos.data = [...this.arquivos.data, dadosArquivo]; + } + + this.arquivos._updateChangeSubscription(); // Atualiza a tabela + } + + // Função auxiliar para gerar IDs únicos + gerarIdUnico(): number { + return this.arquivos.data.length > 0 ? Math.max(...this.arquivos.data.map(a => a.id || 0)) + 1 : 1; + } + + excluirArquivo(arquivo: AgrobaseVersionFileModel) { + if (confirm("Tem certeza que deseja excluir o arquivo " + arquivo.Arquivo + "?")) { + this.agrobaseService.deleteVersionFile(arquivo.ArquivoDownload).subscribe( + (data) => { + this.arquivos.data = this.arquivos.data.filter(a => a !== arquivo); + this.arquivos._updateChangeSubscription(); // Atualiza a tabela + this.atualizarArquivoVsf(); + }, + (error) => { + console.error('Erro ao carregar dados de versão:', error); + } + ); + } + } + + onSubmit() { + if (this.arquivoForm.valid) { + const dadosArquivo: AgrobaseVersionFileModel = this.arquivoForm.value; + this.salvarArquivo(dadosArquivo); + this.dialog.closeAll(); + } + } + + onCancel() { + this.dialog.closeAll(); + } + +} diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts new file mode 100644 index 0000000..66be5cb --- /dev/null +++ b/src/app/app-routing.module.ts @@ -0,0 +1,174 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; +import { HomeComponent } from './home/home.component'; +import { LoginComponent } from './login/login.component'; +import { UsuariosService } from './services/usuarios.service'; +import { DashboardComponent } from './dashboard/dashboard.component'; +import { UsersComponent } from './users/users.component'; +import { ClientComponent } from './client/client.component'; +import { FuncoesGlobais } from 'src/environments/environment'; +import { SistemasComponent } from './sistemas/sistemas.component'; +import { SistemasService } from './services/sistemas.service'; +import { CriarcontaComponent } from './criarconta/criarconta.component'; +import { DetalhesSistemaComponent } from './detalhes-sistema/detalhes-sistema.component'; +import { BaseSiteComponent } from './base-site/base-site.component'; +import { ChavesComponent } from './chaves/chaves.component'; +import { EditHomeComponent } from './edit-home/edit-home.component'; +import { SliderComponent } from './slider/slider.component'; +import { NoticiasComponent } from './noticias/noticias.component'; +import { SliderService } from './services/slider.service'; +import { NoticiasService } from './services/noticias.service'; +import { GeralService } from './services/geral.service'; +import { CadDetSistemaComponent } from './cad-det-sistema/cad-det-sistema.component'; +import { EasyAVAComponent } from './easy-ava/easy-ava.component'; +import { EasyAVAService } from './services/easy-ava.service'; +import { BingoSortComponent } from './bingo-sort/bingo-sort.component'; +import { BingoComponent } from './bingo/bingo.component'; +import { BingoDashboardComponent } from './bingo-dashboard/bingo-dashboard.component'; +import { BingoService } from './services/bingoService'; +import { OrionDashboardComponent } from './orion-dashboard/orion-dashboard.component'; +import { OrionService } from './services/orionService'; +import { ProdutosComponent } from './produtos/produtos.component'; +import { ProdutosService } from './services/produtosService'; +import { AgrobaseLoginComponent } from './agrobase/login/login.component'; +import { AgrobaseVersionamentoComponent } from './agrobase/versionamento/versionamento.component'; +import { AgrobaseService } from './services/agrobase.service'; + + +const routes: Routes = [ + { path: '', redirectTo: 'home', pathMatch: 'full' }, + { + path: '', + component: BaseSiteComponent, + children: [ + { + path: 'home', + component: HomeComponent, + }, { + path: 'detalhes/:idsistemas', + component: DetalhesSistemaComponent, + }, + ] + }, { + path: 'login', + component: LoginComponent, + }, { + path: 'login/esqueci', + component: LoginComponent, + }, { + path: 'login/trocar/:tag', + component: LoginComponent, + }, { + path: 'criarconta', + component: CriarcontaComponent, + }, { + path: 'dashboard', + component: DashboardComponent, + children: [ + { + path: 'usuarios/cadastro', + component: UsersComponent, + }, { + path: 'usuarios/editar/:idusuarios', + component: UsersComponent, + }, { + path: 'usuarios/visualizar', + component: UsersComponent, + }, { + path: 'sistemas/cadastro', + component: SistemasComponent, + }, { + path: 'sistemas/editar/:idsistemas', + component: SistemasComponent, + }, { + path: 'sistemas/visualizar', + component: SistemasComponent, + }, { + path: 'sistemas/detalhes/:idsistemas', + component: CadDetSistemaComponent, + }, { + path: 'sistemas/produtos/:idsistemas', + component: ProdutosComponent, + }, { + path: 'cliente', + component: ClientComponent, + }, { + path: 'cliente/chave/:idsistemas', + component: ChavesComponent, + }, { + path: 'admin/home', + component: EditHomeComponent, + }, { + path: 'admin/slides', + component: SliderComponent, + }, { + path: 'admin/slides/visualizar', + component: SliderComponent, + }, { + path: 'admin/slides/editar/:idslides', + component: SliderComponent, + }, { + path: 'admin/noticias', + component: NoticiasComponent, + }, { + path: 'admin/noticias/visualizar', + component: NoticiasComponent, + }, { + path: 'admin/noticias/editar/:idnoticias', + component: NoticiasComponent, + } + ] + }, { + path: 'easyava', + component: EasyAVAComponent, + }, { + path: 'bingo', + //component: BingoComponent, + children: [ + { + path: 'dashboard', + component: BingoDashboardComponent, + }, { + path: 'sorteio', + component: BingoSortComponent, + }, + ] + }, { + path: 'orion-dashboard', + component: OrionDashboardComponent + }, { + path: 'agrobase', + children: [ + { + path: 'login', + component: AgrobaseLoginComponent, + }, { + path: 'versionamento', + component: AgrobaseVersionamentoComponent, + }, + ] + } +]; + +@NgModule({ + imports: [ + RouterModule.forRoot(routes), + ], + exports: [ + RouterModule, + ], + providers: [ + FuncoesGlobais, + UsuariosService, + SistemasService, + SliderService, + NoticiasService, + GeralService, + EasyAVAService, + BingoService, + OrionService, + ProdutosService, + AgrobaseService + ] +}) +export class AppRoutingModule { } diff --git a/src/app/app.component.html b/src/app/app.component.html new file mode 100644 index 0000000..90c6b64 --- /dev/null +++ b/src/app/app.component.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/app/app.component.scss b/src/app/app.component.scss new file mode 100644 index 0000000..a6de2da --- /dev/null +++ b/src/app/app.component.scss @@ -0,0 +1,186 @@ +.form-cabecalho { + border: 1px solid gray; + margin-right: 1em; + border-radius: 0.3em 0.3em 0 0; + background: gray; + padding-top: 0.4em; + padding-left: 2em; + height: 3em; + border-bottom: #d8d8d8; +} + +.form-corpo { + border: 1px solid gray; + margin-right: 1em; + background: lightgrey; + padding: 1em; + color: #000; +} + +.checkHabilitado { + width: 8em; + position: absolute; + right: 0; + margin-top: -2em; +} + +table { + font-family: arial, sans-serif; + border-collapse: collapse; + width: 100%; +} + +td, th { + border: 1px solid #dddddd; + text-align: left; + padding: 8px; +} + +tr:nth-child(even) { + background-color: #dddddd; +} + +.quadro-Branco { + color: #000; + margin: 1em; + padding: 1em; + background: #fff; + border-radius: 1em; +} + +.MyHR { + background: #eee; + height: 1px; + margin: auto; + margin-top: 1em; + margin-bottom: 1em; +} + +.FundoCheio { + position: absolute; + height: 100vh; + width: 100vw; + top: 0; + left: 0; + background: #fff; + color: #000; + padding: 1em; +} + + + +@mixin sp-layout { + @media screen and (max-width: 750px) { + @content; + } +} + +body { + display: flex; + justify-content: center; + align-items: center; + min-height: 100vh; + background: radial-gradient(ellipse at bottom, #0d1d31 0%, #0c0d13 100%); + overflow: hidden; +} + +@function random_range($min, $max) { + $rand: random(); + $random_range: $min + floor($rand * (($max - $min) + 1)); + @return $random_range; +} + +.stars { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 120%; + transform: rotate(-45deg); + z-index: -10; +} + +.star { + $star-count: 20; + --star-color: var(--primary-color); + --star-tail-length: 6em; + --star-tail-height: 2px; + --star-width: calc(var(--star-tail-length) / 6); + --fall-duration: 9s; + --tail-fade-duration: var(--fall-duration); + + position: absolute; + top: var(--top-offset); + left: 0; + width: var(--star-tail-length); + height: var(--star-tail-height); + color: var(--star-color); + background: linear-gradient(45deg, currentColor, transparent); + border-radius: 50%; + filter: drop-shadow(0 0 6px currentColor); + transform: translate3d(104em, 0, 0); + animation: fall var(--fall-duration) var(--fall-delay) linear infinite, tail-fade var(--tail-fade-duration) var(--fall-delay) ease-out infinite; + + @include sp-layout { + // For mobile performance, tail-fade animation will be removed QAQ + animation: fall var(--fall-duration) var(--fall-delay) linear infinite; + } + + @for $i from 1 through $star-count { + &:nth-child(#{$i}) { + --star-tail-length: #{random_range(500em, 750em) / 100}; + --top-offset: #{random_range(0vh, 10000vh) / 100}; + --fall-duration: #{random_range(6000, 12000s) / 1000}; + --fall-delay: #{random_range(0, 10000s) / 1000}; + } + } + + &::before, &::after { + position: absolute; + content: ''; + top: 0; + left: calc(var(--star-width) / -2); + width: var(--star-width); + height: 100%; + background: linear-gradient(45deg, transparent, currentColor, transparent); + border-radius: inherit; + animation: blink 2s linear infinite; + } + + &::before { + transform: rotate(45deg); + } + + &::after { + transform: rotate(-45deg); + } +} + +@keyframes fall { + to { + transform: translate3d(-30em, 0, 0); + } +} + +@keyframes tail-fade { + 0%, 50% { + width: var(--star-tail-length); + opacity: 1; + } + + 70%, 80% { + width: 0; + opacity: 0.4; + } + + 100% { + width: 0; + opacity: 0; + } +} + +@keyframes blink { + 50% { + opacity: 0.6; + } +} \ No newline at end of file diff --git a/src/app/app.component.ts b/src/app/app.component.ts new file mode 100644 index 0000000..73b2631 --- /dev/null +++ b/src/app/app.component.ts @@ -0,0 +1,22 @@ +import { Title } from '@angular/platform-browser'; +import { Component } from '@angular/core'; +import { GeralService } from './services/geral.service'; +import { environment } from 'src/environments/environment'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.scss'] +}) + +export class AppComponent { + + constructor( + private geralSerivice: GeralService, + private titleService: Title + ) { + this.titleService.setTitle(environment.Titulo); + } + + title = '"Zendion, Inc."'; +} diff --git a/src/app/app.module.ts b/src/app/app.module.ts new file mode 100644 index 0000000..3f17130 --- /dev/null +++ b/src/app/app.module.ts @@ -0,0 +1,109 @@ +import { BrowserModule, Title } from '@angular/platform-browser'; +import { LOCALE_ID, NgModule } from '@angular/core'; +import { registerLocaleData } from '@angular/common'; +import localePt from '@angular/common/locales/pt'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; + +import { AppRoutingModule } from './app-routing.module'; +import { AppComponent } from './app.component'; +import { HomeComponent } from './home/home.component'; +import { Angular2UsefulSwiperModule } from 'angular2-useful-swiper'; +import { LoginComponent } from './login/login.component'; +import { HttpClientModule } from '@angular/common/http'; +import { DashboardComponent } from './dashboard/dashboard.component'; +import { UsersComponent } from './users/users.component'; +import { ClientComponent } from './client/client.component'; +import { SistemasComponent } from './sistemas/sistemas.component'; +import { CriarcontaComponent } from './criarconta/criarconta.component'; +import { DetalhesSistemaComponent } from './detalhes-sistema/detalhes-sistema.component'; +import { BaseSiteComponent } from './base-site/base-site.component'; +import { ChavesComponent } from './chaves/chaves.component'; +import { EditHomeComponent } from './edit-home/edit-home.component'; +import { SliderComponent } from './slider/slider.component'; +import { NoticiasComponent } from './noticias/noticias.component'; +import { CadDetSistemaComponent } from './cad-det-sistema/cad-det-sistema.component'; +import { EasyAVAComponent } from './easy-ava/easy-ava.component'; +import { BingoSortComponent } from './bingo-sort/bingo-sort.component'; +import { BingoComponent } from './bingo/bingo.component'; +import { BingoDashboardComponent } from './bingo-dashboard/bingo-dashboard.component'; +import { OrionDashboardComponent } from './orion-dashboard/orion-dashboard.component'; + +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { MatDatepickerModule } from '@angular/material/datepicker'; +import { MatNativeDateModule } from '@angular/material/core'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatSelectModule } from '@angular/material/select'; +import { MatButtonModule } from '@angular/material/button'; +import { MatSidenavModule } from '@angular/material/sidenav'; +import { MatTabsModule } from '@angular/material/tabs'; +import { MatTableModule } from '@angular/material/table'; +import { MatPaginatorModule } from '@angular/material/paginator'; +import { MatIconModule } from '@angular/material/icon'; +import { MatDialogModule } from '@angular/material/dialog'; +import { Ng5SliderModule } from 'ng5-slider'; +import { ProdutosComponent } from './produtos/produtos.component'; +import { AgrobaseLoginComponent } from './agrobase/login/login.component'; +import { AgrobaseVersionamentoComponent } from './agrobase/versionamento/versionamento.component'; +import { TipoArquivoNomePipe } from './pipes/tipo-arquivo-nome.pipe'; + + +// Registrar a localidade pt-BR +registerLocaleData(localePt); + +@NgModule({ + declarations: [ + AppComponent, + HomeComponent, + LoginComponent, + DashboardComponent, + UsersComponent, + ClientComponent, + SistemasComponent, + CriarcontaComponent, + DetalhesSistemaComponent, + BaseSiteComponent, + ChavesComponent, + EditHomeComponent, + SliderComponent, + NoticiasComponent, + CadDetSistemaComponent, + EasyAVAComponent, + BingoSortComponent, + BingoComponent, + BingoDashboardComponent, + OrionDashboardComponent, + ProdutosComponent, + AgrobaseLoginComponent, + AgrobaseVersionamentoComponent, + TipoArquivoNomePipe + ], + imports: [ + BrowserModule, + AppRoutingModule, + Angular2UsefulSwiperModule, + FormsModule, + ReactiveFormsModule, + HttpClientModule, + BrowserAnimationsModule, + MatDatepickerModule, + MatNativeDateModule, + MatFormFieldModule, + MatInputModule, + MatSelectModule, + MatButtonModule, + MatSidenavModule, + MatTabsModule, + MatTableModule, + MatPaginatorModule, + MatIconModule, + MatDialogModule, + Ng5SliderModule + ], + providers: [ + Title, + { provide: LOCALE_ID, useValue: 'pt-BR' } + ], + bootstrap: [AppComponent] +}) +export class AppModule { } diff --git a/src/app/base-site/base-site.component.html b/src/app/base-site/base-site.component.html new file mode 100644 index 0000000..8b54c47 --- /dev/null +++ b/src/app/base-site/base-site.component.html @@ -0,0 +1,78 @@ +
+ + + +
+ +
+ +
+ + + +
+ +
\ No newline at end of file diff --git a/src/app/base-site/base-site.component.scss b/src/app/base-site/base-site.component.scss new file mode 100644 index 0000000..31a441f --- /dev/null +++ b/src/app/base-site/base-site.component.scss @@ -0,0 +1,242 @@ +.site-layout { + min-height: 100vh; + display: flex; + flex-direction: column; + background: #f4f6fb; +} + +.site-header { + position: sticky; + top: 0; + z-index: 1000; + background: rgba(7, 27, 99, 0.92); + border-bottom: 1px solid rgba(255, 255, 255, 0.12); + box-shadow: 0 12px 34px rgba(15, 23, 42, 0.18); + backdrop-filter: blur(14px); +} + +.header-content { + width: 100%; + max-width: 1220px; + min-height: 76px; + margin: 0 auto; + padding: 0 22px; + display: grid; + grid-template-columns: auto 1fr auto; + align-items: center; + gap: 26px; + box-sizing: border-box; +} + +.brand-link { + display: inline-flex; + align-items: center; + text-decoration: none; +} + +.logo { + display: block; + object-fit: contain; +} + +.logo-escrito { + height: 46px; +} + +.logo-favicon { + display: none; + height: 42px; +} + +.header-nav { + display: flex; + align-items: center; + justify-content: center; + gap: 24px; +} + +.header-nav a { + position: relative; + color: #dbeafe; + font-size: 14px; + font-weight: 700; + text-decoration: none; + transition: color 0.18s ease; +} + +.header-nav a::after { + content: ""; + position: absolute; + left: 0; + bottom: -7px; + width: 0; + height: 2px; + border-radius: 999px; + background: #ffffff; + transition: width 0.18s ease; +} + +.header-nav a:hover { + color: #ffffff; +} + +.header-nav a:hover::after { + width: 100%; +} + +.header-actions { + display: flex; + align-items: center; + gap: 10px; +} + +.btn-header { + min-height: 42px; + padding: 0 18px; + border-radius: 12px; + font-size: 13px; + font-weight: 800; + border: 1px solid transparent; + cursor: pointer; + transition: transform 0.18s ease, box-shadow 0.18s ease, background-color 0.18s ease, color 0.18s ease; + white-space: nowrap; +} + +.btn-header:hover { + transform: translateY(-1px); +} + +.btn-header-primary { + background: #ffffff; + color: #071b63; + box-shadow: 0 10px 24px rgba(0, 0, 0, 0.16); +} + +.btn-header-primary:hover { + background: #f8fafc; +} + +.btn-header-secondary { + background: rgba(255, 255, 255, 0.10); + color: #ffffff; + border-color: rgba(255, 255, 255, 0.22); +} + +.btn-header-secondary:hover { + background: rgba(255, 255, 255, 0.16); +} + +.site-main { + flex: 1; +} + +.site-footer { + margin-top: auto; + background: + radial-gradient(circle at top left, rgba(255, 255, 255, 0.10), transparent 30%), + linear-gradient(145deg, #071b63, #04113f); + color: #ffffff; +} + +.footer-content { + width: 100%; + max-width: 1220px; + margin: 0 auto; + padding: 48px 22px 36px 22px; + display: grid; + grid-template-columns: 1.4fr 0.8fr 0.9fr 1fr; + gap: 34px; + box-sizing: border-box; +} + +.footer-section h4 { + margin: 0 0 16px 0; + color: #ffffff; + font-size: 15px; + font-weight: 850; +} + +.footer-section p, +.footer-section a { + display: block; + margin: 0 0 10px 0; + color: #cbd5e1; + font-size: 14px; + line-height: 23px; + text-decoration: none; +} + +.footer-section a:hover { + color: #ffffff; + text-decoration: underline; +} + +.footer-logo { + height: 42px; + max-width: 220px; + object-fit: contain; + display: block; + margin-bottom: 18px; + filter: brightness(0) invert(1); +} + +.footer-bottom { + border-top: 1px solid rgba(255, 255, 255, 0.12); + padding: 18px 22px; + text-align: center; +} + +.footer-bottom p { + margin: 0; + color: #94a3b8; + font-size: 12px; + line-height: 18px; +} + +@media (max-width: 920px) { + .header-content { + grid-template-columns: auto auto; + justify-content: space-between; + } + + .header-nav { + display: none; + } + + .footer-content { + grid-template-columns: 1fr 1fr; + } +} + +@media (max-width: 576px) { + .header-content { + min-height: 68px; + padding: 0 14px; + gap: 12px; + } + + .logo-escrito { + display: none; + } + + .logo-favicon { + display: block; + height: 40px; + } + + .header-actions { + gap: 8px; + } + + .btn-header { + min-height: 38px; + padding: 0 12px; + font-size: 12px; + border-radius: 10px; + } + + .footer-content { + grid-template-columns: 1fr; + padding: 38px 20px 28px 20px; + } +} \ No newline at end of file diff --git a/src/app/base-site/base-site.component.ts b/src/app/base-site/base-site.component.ts new file mode 100644 index 0000000..c0e71a8 --- /dev/null +++ b/src/app/base-site/base-site.component.ts @@ -0,0 +1,78 @@ +import { Component, OnInit } from '@angular/core'; +import { Router, NavigationEnd } from '@angular/router'; +import { environment } from 'src/environments/environment'; + +@Component({ + selector: 'app-base-site', + templateUrl: './base-site.component.html', + styleUrls: ['./base-site.component.scss'] +}) +export class BaseSiteComponent implements OnInit { + + btnLoginText: string = "Entrar"; + btnSuperior: string = "Registrar"; + + emailContato: string = environment.emailContato; + foneContato: string = environment.telefoneContato; + currentYear: string = new Date().getFullYear().toString(); + + constructor( + private router: Router, + ) { } + + ngOnInit() { + this.CheckIsLogged(); + + this.router.events.subscribe(event => { + if (event instanceof NavigationEnd) { + this.CheckIsLogged(); + } + }); + } + + CheckIsLogged() { + if (localStorage.getItem("Session") == "1") { + this.btnLoginText = "Sair"; + + if (localStorage.getItem("Role") != "1") { + this.btnSuperior = "Meus sistemas"; + } else { + this.btnSuperior = "Painel administrativo"; + } + } else { + this.btnLoginText = "Entrar"; + this.btnSuperior = "Registrar"; + } + } + + btnLoginClick() { + if (this.btnLoginText == "Entrar") { + this.router.navigate(['login']); + } else { + this.Logout(); + } + } + + Logout() { + localStorage.removeItem("Session"); + localStorage.removeItem("UserName"); + localStorage.removeItem("Role"); + + this.CheckIsLogged(); + this.router.navigate(['home']); + } + + btnCriarcontaClick() { + if (this.btnSuperior == "Registrar") { + this.router.navigate(['criarconta']); + return; + } + + if (this.btnSuperior == "Painel administrativo") { + this.router.navigate(['dashboard/admin/home']); + return; + } + + this.router.navigate(['dashboard/cliente']); + } +} \ No newline at end of file diff --git a/src/app/bingo-dashboard/bingo-dashboard.component.html b/src/app/bingo-dashboard/bingo-dashboard.component.html new file mode 100644 index 0000000..bfa9955 --- /dev/null +++ b/src/app/bingo-dashboard/bingo-dashboard.component.html @@ -0,0 +1,112 @@ +
+
+
+

Sorteios

+
+ arrow_back +
+
+ +
+ +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+

Cartelas

+
+
+ +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
+ + + +
+ + +
+
+ +
+ +
+

Lista

+
+ + + + + + + + + + + + + + + + + +
DescicãoRodadaDataNumerosCartelasAção
{{Sorteio.descricao}}{{Sorteio.rodada}}{{Sorteio.data_sorteio}}{{Sorteio.n_max}}{{Sorteio.participantes_max}} + + + +
+
+
+
\ No newline at end of file diff --git a/src/app/bingo-dashboard/bingo-dashboard.component.scss b/src/app/bingo-dashboard/bingo-dashboard.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/bingo-dashboard/bingo-dashboard.component.ts b/src/app/bingo-dashboard/bingo-dashboard.component.ts new file mode 100644 index 0000000..9549489 --- /dev/null +++ b/src/app/bingo-dashboard/bingo-dashboard.component.ts @@ -0,0 +1,176 @@ +import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import { BingoCartelasModel, BingoSorteiosModel } from '../models/bingoModel'; +import { BingoService } from '../services/bingoService'; + +@Component({ + selector: 'app-bingo-dashboard', + templateUrl: './bingo-dashboard.component.html', + styleUrls: ['./bingo-dashboard.component.scss', './../app.component.scss'] +}) +export class BingoDashboardComponent implements OnInit { + + FormSorteio: BingoSorteiosModel = new BingoSorteiosModel(); + ListaSorteios: BingoSorteiosModel[] = new Array(); + CartelaNumeros: number = 25; + AbreCartelas: boolean = false; + Novo: boolean = false; + Editando: boolean = false; + + constructor( + private bingoService: BingoService, + private router: Router + ) { } + + ngOnInit() { + this.AtualizarDados(); + } + + AtualizarDados() { + localStorage.setItem("Cartelas", ""); + localStorage.setItem("NMax", "0"); + localStorage.setItem("NParticipantes", "0"); + this.CancelarBingo(); + this.bingoService.getAllSorteios().then(resSorteios => { + this.ListaSorteios = resSorteios; + this.GetCartelasSorteio(0); + }); + } + + GetCartelasSorteio(Index) { + if (Index < this.ListaSorteios.length) { + this.bingoService.getCartelasSorteio(this.ListaSorteios[Index].idbingosorteios).then(resCartelas => { + this.ListaSorteios[Index].Cartelas = resCartelas; + Index++; + this.GetCartelasSorteio(Index); + }); + } + else { + //console.log(this.ListaSorteios); + } + } + + NovoBingo() { + this.FormSorteio = new BingoSorteiosModel(); + this.Novo = true; + } + + SalvarBingo() { + if (this.FormSorteio.idbingosorteios > 0) { + this.SalvarSorteio(); + } + else { + if (localStorage.getItem("Cartelas") == "") { + alert("Gere as cartelas para poder salvar"); + return; + } + if (localStorage.getItem("NMax") == "0" || localStorage.getItem("NParticipantes") == "0") { + alert("Preencha corretamente os numeros de participantes e cartelas"); + return; + } + this.FormSorteio.n_max = parseInt(localStorage.getItem("NMax")); + this.FormSorteio.participantes_max = parseInt(localStorage.getItem("NParticipantes")); + let CartelasGeradas: CasaCartela[] = JSON.parse(localStorage.getItem("Cartelas")); + + this.FormSorteio.Cartelas = new Array(); + for (let i = 0; i < CartelasGeradas.length; i++) { + let Cartela: BingoCartelasModel = new BingoCartelasModel(); + Cartela.canhoto = this.FormSorteio.Cartelas.length + 1; + for (let o = 0; o < this.CartelaNumeros; o++) { + if (Cartela.numeros != "") + Cartela.numeros += ","; + Cartela.numeros += CartelasGeradas[i][o].display; + } + this.FormSorteio.Cartelas.push(Cartela); + } + + console.log(this.FormSorteio); + this.SalvarSorteio(); + } + + } + + SalvarSorteio() { + this.bingoService.SalvarBingoSorteio(this.FormSorteio).then(resSalvar => { + if (resSalvar['status'] == 200) { + if (this.FormSorteio.idbingosorteios > 0) { + alert("Sorteio inserido com sucesso"); + this.AtualizarDados(); + } + else { // SALVAR AS CARTELAS SE ESTIVER EM MODO DE INSERT + this.FormSorteio.idbingosorteios = resSalvar['response']['insertId']; + this.bingoService.getAllCartelas().then(resAllCartelas => { + for (let i = 0; i < this.FormSorteio.Cartelas.length; i++) { + this.FormSorteio.Cartelas[i].canhoto += resAllCartelas.length; + } + this.bingoService.insertBingoCartela(this.FormSorteio).then(resCartelas => { + alert("Sorteio inserido com sucesso"); + this.AtualizarDados(); + }); + }); + } + } + else { + alert("Erro ao inserir Sorteio"); + console.log(resSalvar['error']); + } + }); + } + + CancelarBingo() { + this.FormSorteio = new BingoSorteiosModel(); + this.Novo = false; + this.Editando = false; + } + + ExportarCartelas(Sorteio: BingoSorteiosModel) { + this.bingoService.exportarExcel(Sorteio).then(resExport => { + window.open('http://zendioninc.mooo.com/Jogos/Bingo/Gerador/Cartelas/' + Sorteio.idbingosorteios + '.csv', '_blank'); + }); + } + + EditarSorteio(Sorteio: BingoSorteiosModel) { + this.FormSorteio = new BingoSorteiosModel(); + this.FormSorteio.data_sorteio = Sorteio.data_sorteio.split("/")[2] + "-" + Sorteio.data_sorteio.split("/")[1] + "-" + Sorteio.data_sorteio.split("/")[0]; + this.FormSorteio.descricao = Sorteio.descricao; + this.FormSorteio.idbingosorteios = Sorteio.idbingosorteios; + this.FormSorteio.n_max = Sorteio.n_max; + this.FormSorteio.participantes_max = Sorteio.participantes_max; + this.FormSorteio.rodada = Sorteio.rodada; + this.FormSorteio.Cartelas = Sorteio.Cartelas; + this.FormSorteio.VerCartelas = false; + this.Editando = true; + } + + RemoverSorteio(Sorteio: BingoSorteiosModel) { + if (!confirm("Tem certeza que deseja remover esse sorteio?")) + return; + + this.bingoService.deleteBingoSorteio(Sorteio.idbingosorteios).then(resDelete => { + alert("Removido com sucesso"); + this.AtualizarDados(); + }); + } + + SalvarCartela(Cartela: BingoCartelasModel) { + if (Cartela.Editando) { + this.bingoService.updateBingoCartela(Cartela).then(resUpdate => { + Cartela.Editando = !Cartela.Editando; + }); + } + else { + Cartela.Editando = !Cartela.Editando; + } + } + + Voltar() { + this.router.navigate(['dashboard/cliente']); + } + + +} + +class CasaCartela { + display: string; + tipo: number; +} \ No newline at end of file diff --git a/src/app/bingo-sort/bingo-sort.component.html b/src/app/bingo-sort/bingo-sort.component.html new file mode 100644 index 0000000..06e8724 --- /dev/null +++ b/src/app/bingo-sort/bingo-sort.component.html @@ -0,0 +1,23 @@ +
+
+
+
+

SELECIONE O SORTEIO

+
+
+ +
+
+ +
+
+ +
+ +
+ Cartelas faltando 1 numero para bater: {{CartelasParaBater.length}} +
+
\ No newline at end of file diff --git a/src/app/bingo-sort/bingo-sort.component.scss b/src/app/bingo-sort/bingo-sort.component.scss new file mode 100644 index 0000000..8016c73 --- /dev/null +++ b/src/app/bingo-sort/bingo-sort.component.scss @@ -0,0 +1,32 @@ +.Cabecalho { + color: forestgreen; +} + +.btnSorteio { + background: #90ee90; + border-radius: 10em; + border: 2px solid forestgreen; + width: 10em; + height: 3em; + font-size: xx-large; + color: forestgreen; + transition: 0.5s; + margin-top: 2em; +} + +.btnSorteio:hover { + background: #70c970; + color: #fff; +} + +.comboBox { + outline: none; + padding-left: 1em; + height: 3em; + width: 25em; + font-size: larger; + border: 2px solid forestgreen; + border-radius: 10em; + text-align: center; + margin-top: 2em; +} \ No newline at end of file diff --git a/src/app/bingo-sort/bingo-sort.component.ts b/src/app/bingo-sort/bingo-sort.component.ts new file mode 100644 index 0000000..eab80ab --- /dev/null +++ b/src/app/bingo-sort/bingo-sort.component.ts @@ -0,0 +1,176 @@ +import { Component, OnInit } from '@angular/core'; +import { BingoCartelasModel, BingoSorteiosModel } from '../models/bingoModel'; +import { BingoService } from '../services/bingoService'; + +@Component({ + selector: 'app-bingo-sort', + templateUrl: './bingo-sort.component.html', + styleUrls: ['./bingo-sort.component.scss', './../app.component.scss'] +}) +export class BingoSortComponent implements OnInit { + + Sorteados: string = ""; + Numeros: number[] = new Array(); + ListaSorteios: BingoSorteiosModel[] = new Array(); + LiberaSorteio: boolean = false; + SorteioSelecionado: BingoSorteiosModel = new BingoSorteiosModel(); + CartelasParaBater: BingoCartelasModel[] = new Array(); + Bingo: boolean = false; + Cinquina: number = 0; + CartelasSorteadas: BingoCartelasModel[] = new Array(); + + constructor( + private bingoService: BingoService + ) { } + + ngOnInit() { + localStorage.setItem("NumSort", ""); + this.Numeros = new Array(); + this.bingoService.getSorteiosRealizar().then(resSorteios => { + this.ListaSorteios = resSorteios; + }); + } + + SelecionarSorteio() { + for (let i = 0; i < this.ListaSorteios.length; i++) { + if (this.ListaSorteios[i].idbingosorteios == this.SorteioSelecionado.idbingosorteios) { + this.SorteioSelecionado = this.ListaSorteios[i]; + break; + } + } + this.bingoService.getCartelasVendidasSorteio(this.SorteioSelecionado.idbingosorteios).then(resCartelas => { + this.SorteioSelecionado.Cartelas = resCartelas; + this.LiberaSorteio = true; + console.log(this.SorteioSelecionado); + this.LoopNumeracao(); + }); + } + + LoopNumeracao() { + setTimeout(() => { + if (localStorage.getItem("NumSort") && localStorage.getItem("NumSort") != this.Sorteados) { + this.Sorteados = localStorage.getItem("NumSort"); + const NumVar: string[] = localStorage.getItem("NumSort").split(','); + const NumeroAtual: number = parseInt(NumVar[NumVar.length - 1]); + this.Numeros.push(NumeroAtual); + this.VerificaCartelas(NumeroAtual); + } + else { + + } + if (!this.Bingo) + this.LoopNumeracao(); + }, 1000); + } + + VerificaCartelas(NSorteado: number) { + for (let i = 0; i < this.SorteioSelecionado.Cartelas.length; i++) { + let Numeros: string[] = this.SorteioSelecionado.Cartelas[i].numeros.split(','); + for (let o = 0; o < Numeros.length; o++) { + if (Numeros[o] == NSorteado.toString()) { + this.SorteioSelecionado.Cartelas[i].Acertos++; + break; + } + } + + if (this.Cinquina < 3 && this.Numeros.length > 3) { + this.ConfereCinquina(); + } + + // CINQUINA 1 + if (this.Cinquina == 0 && !this.SorteioSelecionado.Cartelas[i].cinquina1 && this.SorteioSelecionado.Cartelas[i].Acertos == 5) { + this.SorteioSelecionado.Cartelas[i].cinquina1 = true; + this.CartelasSorteadas.push(this.SorteioSelecionado.Cartelas[i]); + } + + // CINQUINA 2 + if (this.Cinquina == 1 && !this.SorteioSelecionado.Cartelas[i].cinquina2 && this.SorteioSelecionado.Cartelas[i].Acertos == 10) { + this.SorteioSelecionado.Cartelas[i].cinquina2 = true; + this.CartelasSorteadas.push(this.SorteioSelecionado.Cartelas[i]); + } + + // CINQUINA 3 + if (this.Cinquina == 2 && !this.SorteioSelecionado.Cartelas[i].cinquina3 && this.SorteioSelecionado.Cartelas[i].Acertos == 15) { + this.SorteioSelecionado.Cartelas[i].cinquina3 = true; + this.CartelasSorteadas.push(this.SorteioSelecionado.Cartelas[i]); + } + + // CARTELAS COM 1 NUMERO PARA BATER + if (this.SorteioSelecionado.Cartelas[i].Acertos == Numeros.length - 1) { + let Adicionada: boolean = false; + for (let o = 0; o < this.CartelasParaBater.length; o++) { + if (this.CartelasParaBater[o].idbingosorteios == this.SorteioSelecionado.Cartelas[i].idbingosorteios) { + Adicionada = true; + break; + } + } + if (!Adicionada) + this.CartelasParaBater.push(this.SorteioSelecionado.Cartelas[i]); + } + + // CARTELA COM QUANTIDADE DE ACERTOS = QUANTIDADE DE NUMEROS, LOGO, BINGO! + if (this.SorteioSelecionado.Cartelas[i].Acertos == Numeros.length) { + this.SorteioSelecionado.Cartelas[i].bingo = true; + this.FinalizaSorteio(true, [this.SorteioSelecionado.Cartelas[i]]); + break; + } + } + + if (this.CartelasSorteadas.length > 0) + this.FinalizaSorteio(false, this.CartelasSorteadas); + + } + + FinalizaSorteio(Bingo: boolean, Cartelas: BingoCartelasModel[]) { + if (Bingo) { // BINGO + this.bingoService.updateBingoCartela(Cartelas[0]).then(resUpdate => { + this.SorteioSelecionado.realizado = true; + this.SorteioSelecionado.data_sorteio = this.SorteioSelecionado.data_sorteio.replace("T", " ").replace("Z", ""); + this.bingoService.SalvarBingoSorteio(this.SorteioSelecionado).then(resAtt => { + this.Bingo = true; + let Mensagem: string = `BINGO!!\r\nCartela: ${Cartelas[0].canhoto} - Ganhador: ${Cartelas[0].nome}\r\nParabens!`; + alert(Mensagem); + console.log("Cartela vencedora: " + Cartelas[0].canhoto); + console.log("Vencedor: " + Cartelas[0].nome); + }); + }); + } + else { // CINQUINAS + this.Cinquina++; + this.LoopUpdateCinquina(0); + } + } + + LoopUpdateCinquina(Index: number) { + if (Index < this.CartelasSorteadas.length) { + this.bingoService.updateBingoCartela(this.CartelasSorteadas[Index]).then(resUpdate => { + Index++; + this.LoopUpdateCinquina(Index); + }); + } + else { + let Mensagem: string = "CINQUINA " + this.Cinquina + " sorteada para as seguintes cartelas:\r\n"; + for (let i = 0; i < this.CartelasSorteadas.length; i++) { + Mensagem += `Cartela: ${this.CartelasSorteadas[i].canhoto} - Ganhador: ${this.CartelasSorteadas[i].nome}\r\n`; + } + Mensagem += "Parabens!!"; + alert(Mensagem); + this.CartelasSorteadas = new Array(); + } + } + + ConfereCinquina() { + for (let i = 0; i < this.SorteioSelecionado.Cartelas.length; i++) { + let CartelaNumeros: string[] = this.SorteioSelecionado.Cartelas[i].numeros.split(","); + if (CartelaNumeros.length > 3) { + let NIguais: number = 0; + for (let o = 0; o < this.Numeros.length; o++) { + if (this.SorteioSelecionado.Cartelas[i].numeros.includes(this.Numeros[o].toString())) { + + } + } + } + } + } + +} diff --git a/src/app/bingo/bingo.component.html b/src/app/bingo/bingo.component.html new file mode 100644 index 0000000..abe778c --- /dev/null +++ b/src/app/bingo/bingo.component.html @@ -0,0 +1 @@ +

bingo works!

diff --git a/src/app/bingo/bingo.component.scss b/src/app/bingo/bingo.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/bingo/bingo.component.ts b/src/app/bingo/bingo.component.ts new file mode 100644 index 0000000..e704e80 --- /dev/null +++ b/src/app/bingo/bingo.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-bingo', + templateUrl: './bingo.component.html', + styleUrls: ['./bingo.component.scss'] +}) +export class BingoComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/app/cad-det-sistema/cad-det-sistema.component.html b/src/app/cad-det-sistema/cad-det-sistema.component.html new file mode 100644 index 0000000..b864610 --- /dev/null +++ b/src/app/cad-det-sistema/cad-det-sistema.component.html @@ -0,0 +1,239 @@ +
+ + +
+ Carregando +

Carregando editor de detalhes...

+
+ + + + +
+
+ +
+ +
+ +
+ Editor de detalhes + +

{{ Sistema.nome }}

+ +

{{ Sistema.descricao }}

+ +
+ Versão {{ Sistema.versaoatual }} + {{ Sistema.tiposdesistema }} + {{ ListaDetalhes?.length || 0 }} detalhe(s) +
+
+ +
+
+ + +
+
+
+ article +
+ +
+ Total de detalhes + {{ ListaDetalhes?.length || 0 }} +
+
+ +
+
+ visibility +
+ +
+ Habilitados + {{ TotalDetalhesHabilitados }} +
+
+ +
+
+ visibility_off +
+ +
+ Desabilitados + {{ TotalDetalhesDesabilitados }} +
+
+
+ + +
+ +
+
+ Conteúdo da página pública +

Detalhes do sistema

+

+ Edite os blocos que aparecem na página pública do sistema. Cada detalhe pode ter texto, imagem e status de publicação. +

+
+ + +
+ + +
+
+ post_add +
+ +

Nenhum detalhe inserido

+ +

+ Clique em “Novo detalhe” para criar o primeiro bloco de apresentação deste sistema. +

+ + +
+ + +
+ +
+ +
+
+ #{{ i + 1 }} +
+ +
+ + {{ Detalhe.habilitado ? 'Habilitado' : 'Desabilitado' }} + +
+
+ +
+ +
+ + + + +
+ + + + {{ Detalhe.Arquivo.name }} + +
+ +
+ + + +
+
+ +
+ Prévia da imagem + +
+ Imagem do detalhe + +
+ image_not_supported + Nenhuma imagem selecionada +
+
+
+ +
+
+ +
+ +
+ + +
+ +
+ Disponível para + + Plataforma + + {{ Sistema.plataforma }} +
+ +
+ Notas de atualização + + + Atualizado em {{ Sistema.update_date | date:'dd/MM/yyyy' }} + + +
+
+ +
+ + +
+
+ Pronto para salvar? + As alterações serão aplicadas na página pública do sistema. +
+ + +
+ +
+ +
\ No newline at end of file diff --git a/src/app/cad-det-sistema/cad-det-sistema.component.scss b/src/app/cad-det-sistema/cad-det-sistema.component.scss new file mode 100644 index 0000000..b6dface --- /dev/null +++ b/src/app/cad-det-sistema/cad-det-sistema.component.scss @@ -0,0 +1,706 @@ +.details-admin-page { + min-height: calc(100vh - 74px); + color: #0f172a; +} + +/* LOADING */ + +.details-loader { + min-height: 360px; + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; +} + +.details-loader img { + width: 72px; + height: 72px; + object-fit: contain; + margin-bottom: 16px; +} + +.details-loader p { + margin: 0; + color: #64748b; + font-size: 15px; + font-weight: 800; +} + +/* HERO */ + +.system-hero { + position: relative; + overflow: hidden; + margin-bottom: 22px; + padding: 32px; + border-radius: 24px; + background: + radial-gradient(circle at top right, rgba(255, 255, 255, 0.14), transparent 34%), + linear-gradient(145deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 22px 55px rgba(15, 23, 42, 0.16); +} + +.system-hero::before { + content: ""; + position: absolute; + width: 320px; + height: 320px; + right: -120px; + top: -120px; + border-radius: 999px; + background: rgba(255, 255, 255, 0.11); +} + +.system-hero-content { + position: relative; + z-index: 1; + display: flex; + align-items: center; + gap: 24px; +} + +.system-logo-box { + width: 96px; + height: 96px; + flex: 0 0 auto; + border-radius: 24px; + background: #ffffff; + display: flex; + align-items: center; + justify-content: center; + box-shadow: 0 18px 42px rgba(0, 0, 0, 0.18); +} + +.system-logo { + width: 62px; + height: 62px; + object-fit: contain; +} + +.eyebrow { + display: inline-block; + margin-bottom: 10px; + color: #071b63; + font-size: 12px; + font-weight: 900; + letter-spacing: 0.14em; + text-transform: uppercase; +} + +.system-hero .eyebrow { + color: #bfdbfe; +} + +.system-title h1 { + margin: 0 0 12px 0; + color: #ffffff; + font-size: 34px; + line-height: 42px; + font-weight: 900; + letter-spacing: -0.04em; +} + +.system-title p { + max-width: 760px; + margin: 0; + color: #dbeafe; + font-size: 15px; + line-height: 25px; +} + +.system-tags { + display: flex; + flex-wrap: wrap; + gap: 10px; + margin-top: 18px; +} + +.system-tags span { + display: inline-flex; + align-items: center; + min-height: 28px; + padding: 0 12px; + border-radius: 999px; + background: rgba(255, 255, 255, 0.12); + color: #ffffff; + font-size: 12px; + font-weight: 800; +} + +/* SUMMARY */ + +.summary-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 16px; + margin-bottom: 22px; +} + +.summary-card { + display: flex; + align-items: center; + gap: 16px; + padding: 20px; + border-radius: 20px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 16px 36px rgba(15, 23, 42, 0.08); +} + +.summary-icon { + width: 48px; + height: 48px; + border-radius: 16px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.summary-icon.active { + background: #dcfce7; + color: #166534; +} + +.summary-icon.blocked { + background: #fee2e2; + color: #991b1b; +} + +.summary-icon .material-icons { + font-size: 25px; +} + +.summary-card span { + display: block; + margin-bottom: 4px; + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.summary-card strong { + display: block; + color: #0f172a; + font-size: 22px; + line-height: 28px; + font-weight: 900; +} + +/* CARDS */ + +.admin-card { + padding: 28px; + border-radius: 24px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 18px 45px rgba(15, 23, 42, 0.10); +} + +.details-panel { + margin-bottom: 22px; +} + +.panel-header { + display: flex; + justify-content: space-between; + gap: 22px; + align-items: flex-start; + margin-bottom: 24px; +} + +.panel-header h2 { + margin: 0 0 8px 0; + color: #0f172a; + font-size: 26px; + line-height: 34px; + font-weight: 900; + letter-spacing: -0.035em; +} + +.panel-header p { + max-width: 760px; + margin: 0; + color: #64748b; + font-size: 14px; + line-height: 23px; +} + +/* BUTTONS */ + +.btn-main, +.btn-card, +.btn-save { + border: none; + cursor: pointer; + font-weight: 900; + transition: transform 0.18s ease, box-shadow 0.18s ease, background-color 0.18s ease; +} + +.btn-main { + min-height: 44px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 0 18px; + border-radius: 12px; + background: linear-gradient(135deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 12px 24px rgba(7, 27, 99, 0.20); +} + +.btn-main:hover, +.btn-card:hover, +.btn-save:hover { + transform: translateY(-1px); +} + +.btn-main .material-icons, +.btn-card .material-icons, +.btn-save .material-icons { + font-size: 19px; +} + +/* EMPTY */ + +.empty-state { + padding: 42px 20px; + text-align: center; + border-radius: 22px; + background: #f8fafc; + border: 1px dashed #cbd5e1; +} + +.empty-icon { + width: 72px; + height: 72px; + margin: 0 auto 18px auto; + border-radius: 999px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.empty-icon .material-icons { + font-size: 34px; +} + +.empty-state h3 { + margin: 0 0 10px 0; + color: #0f172a; + font-size: 22px; + font-weight: 900; +} + +.empty-state p { + max-width: 560px; + margin: 0 auto 22px auto; + color: #64748b; + font-size: 14px; + line-height: 23px; +} + +/* DETAIL EDITOR */ + +.details-list { + display: grid; + gap: 20px; +} + +.detail-editor-card { + position: relative; + overflow: hidden; + padding: 20px; + border-radius: 22px; + background: #f8fafc; + border: 1px solid #e5e7eb; +} + +.detail-editor-card::before { + content: ""; + position: absolute; + left: 0; + top: 0; + width: 7px; + height: 100%; + background: #94a3b8; +} + +.detail-editor-card.enabled { + border-color: rgba(22, 163, 74, 0.26); + background: linear-gradient(90deg, rgba(220, 252, 231, 0.60), #f8fafc 32%); +} + +.detail-editor-card.enabled::before { + background: #16a34a; +} + +.detail-editor-card.disabled { + border-color: rgba(220, 38, 38, 0.22); + background: linear-gradient(90deg, rgba(254, 226, 226, 0.55), #f8fafc 32%); +} + +.detail-editor-card.disabled::before { + background: #dc2626; +} + +.detail-card-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + margin-bottom: 16px; +} + +.detail-index span { + display: inline-flex; + align-items: center; + min-height: 30px; + padding: 0 12px; + border-radius: 999px; + background: #e0f2fe; + color: #075985; + font-size: 13px; + font-weight: 900; +} + +.detail-status span { + display: inline-flex; + align-items: center; + min-height: 30px; + padding: 0 12px; + border-radius: 999px; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.06em; +} + +.status-enabled { + background: #dcfce7; + color: #166534; +} + +.status-disabled { + background: #fee2e2; + color: #991b1b; +} + +.detail-card-body { + display: grid; + grid-template-columns: 1fr 440px; + gap: 20px; + align-items: stretch; +} + +.detail-editor label, +.detail-preview span { + display: block; + margin-bottom: 8px; + color: #1e293b; + font-size: 14px; + font-weight: 900; +} + +.form-control { + width: 100%; + border-radius: 14px; + border: 1px solid #d7deea; + background: #ffffff; + color: #0f172a; + font-size: 14px; + outline: none; + transition: border-color 0.18s ease, box-shadow 0.18s ease; + box-sizing: border-box; +} + +.form-control:focus { + border-color: #071b63; + box-shadow: 0 0 0 4px rgba(7, 27, 99, 0.10); +} + +.textarea-control { + min-height: 230px; + padding: 14px; + resize: vertical; + line-height: 22px; +} + +.file-row { + display: flex; + align-items: center; + gap: 12px; + margin-top: 14px; + flex-wrap: wrap; +} + +.file-label { + min-height: 40px; + display: inline-flex !important; + align-items: center; + justify-content: center; + gap: 8px; + padding: 0 14px; + border-radius: 12px; + background: #f1f5ff; + color: #071b63 !important; + font-size: 13px !important; + font-weight: 900 !important; + cursor: pointer; + border: 1px solid #dbe6ff; + margin: 0 !important; +} + +.file-label input { + display: none; +} + +.file-label .material-icons { + font-size: 20px; +} + +.file-row small { + color: #64748b; + font-size: 12px; + font-weight: 800; +} + +.detail-actions { + display: flex; + flex-wrap: wrap; + gap: 10px; + margin-top: 16px; +} + +.btn-card { + min-height: 40px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 7px; + padding: 0 14px; + border-radius: 12px; + color: #ffffff; + font-size: 12px; +} + +.btn-card.remove { + background: #dc2626; +} + +.btn-card.enable { + background: #15803d; +} + +.btn-card.disable { + background: #b45309; +} + +.detail-preview { + min-width: 0; +} + +.preview-box { + height: 330px; + overflow: hidden; + border-radius: 18px; + background: #ffffff; + border: 1px solid #dbe6ff; + display: flex; + align-items: center; + justify-content: center; +} + +.preview-box img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.preview-empty { + display: flex; + flex-direction: column; + align-items: center; + color: #94a3b8; +} + +.preview-empty .material-icons { + font-size: 42px; + margin-bottom: 8px; +} + +/* SECONDARY */ + +.secondary-grid { + display: grid; + grid-template-columns: 0.75fr 1.25fr; + gap: 22px; + margin-bottom: 22px; +} + +.platform-card { + text-align: center; +} + +.platform-icon { + display: block; + width: 56px; + height: 56px; + object-fit: contain; + margin: 10px auto 14px auto; +} + +.platform-card strong { + color: #0f172a; + font-size: 18px; + font-weight: 900; +} + +.update-card small { + display: block; + margin-bottom: 14px; + color: #64748b; + font-size: 13px; + font-weight: 800; +} + +.update-text { + padding: 16px; + border-radius: 16px; + background: #f8fafc; + border: 1px solid #e5e7eb; + color: #475569; + font-size: 14px; + line-height: 23px; +} + +/* SAVE BAR */ + +.save-bar { + position: sticky; + bottom: 18px; + z-index: 20; + display: flex; + align-items: center; + justify-content: space-between; + gap: 18px; + padding: 18px 20px; + border-radius: 20px; + background: rgba(7, 27, 99, 0.96); + color: #ffffff; + box-shadow: 0 18px 45px rgba(15, 23, 42, 0.24); + backdrop-filter: blur(12px); +} + +.save-bar strong { + display: block; + font-size: 15px; + font-weight: 900; +} + +.save-bar span { + display: block; + margin-top: 3px; + color: #bfdbfe; + font-size: 13px; +} + +.btn-save { + min-height: 44px; + display: inline-flex; + align-items: center; + gap: 8px; + padding: 0 18px; + border-radius: 12px; + background: #ffffff; + color: #071b63; + box-shadow: 0 12px 24px rgba(0, 0, 0, 0.16); +} + +.btn-save:disabled { + opacity: 0.7; + cursor: not-allowed; +} + +/* RESPONSIVE */ + +@media (max-width: 1100px) { + .detail-card-body { + grid-template-columns: 1fr; + } + + .secondary-grid { + grid-template-columns: 1fr; + } +} + +@media (max-width: 760px) { + .system-hero-content { + flex-direction: column; + text-align: center; + } + + .system-tags { + justify-content: center; + } + + .summary-grid { + grid-template-columns: 1fr; + } + + .panel-header { + flex-direction: column; + align-items: stretch; + } + + .btn-main { + width: 100%; + } + + .save-bar { + position: static; + flex-direction: column; + align-items: stretch; + } + + .btn-save { + width: 100%; + justify-content: center; + } +} + +@media (max-width: 520px) { + .system-hero, + .admin-card { + padding: 22px; + } + + .system-title h1 { + font-size: 28px; + line-height: 36px; + } + + .detail-editor-card { + padding: 16px; + } + + .preview-box { + height: 230px; + } + + .detail-actions { + flex-direction: column; + } + + .btn-card { + width: 100%; + } +} \ No newline at end of file diff --git a/src/app/cad-det-sistema/cad-det-sistema.component.ts b/src/app/cad-det-sistema/cad-det-sistema.component.ts new file mode 100644 index 0000000..71ec06f --- /dev/null +++ b/src/app/cad-det-sistema/cad-det-sistema.component.ts @@ -0,0 +1,223 @@ +import { Component, OnInit } from '@angular/core'; +import { SistemasDetalhes, SistemasLista } from '../models/sistemasModel'; +import { SistemasService } from '../services/sistemas.service'; +import { Router, ActivatedRoute } from '@angular/router'; +import { environment } from 'src/environments/environment'; + +@Component({ + selector: 'app-cad-det-sistema', + templateUrl: './cad-det-sistema.component.html', + styleUrls: ['./cad-det-sistema.component.scss', './../app.component.scss'] +}) +export class CadDetSistemaComponent implements OnInit { + + ListaDetalhes: SistemasDetalhes[] = []; + Sistema: SistemasLista = new SistemasLista(); + + LinkProjeto: string = environment.LinkProjeto; + + CarregadoLista: boolean = false; + CarregadoSistema: boolean = false; + + IndexDetalhe: number = 0; + ItensNaLista: number = 0; + + Salvando: boolean = false; + + constructor( + private sistemasService: SistemasService, + private router: Router, + private route: ActivatedRoute, + ) { } + + ngOnInit() { + this.CarregadoLista = false; + this.CarregadoSistema = false; + this.IndexDetalhe = 0; + this.Salvando = false; + + const idSistema = this.route.snapshot.params['idsistemas']; + + this.sistemasService.getSistemaByIDLista(idSistema).then(resSistema => { + this.Sistema = resSistema; + this.CarregadoSistema = true; + }); + + this.sistemasService.getDetalhesByID(idSistema).then(resDetalhes => { + this.ListaDetalhes = resDetalhes || []; + this.ItensNaLista = this.ListaDetalhes.length; + + if (this.ItensNaLista > 0) { + this.PreencheLista(); + } else { + this.CarregadoLista = true; + } + }); + } + + get TotalDetalhesHabilitados(): number { + return (this.ListaDetalhes || []).filter(detalhe => detalhe.habilitado).length; + } + + get TotalDetalhesDesabilitados(): number { + return (this.ListaDetalhes || []).filter(detalhe => !detalhe.habilitado).length; + } + + PreencheLista() { + for (let i = 0; i < this.ItensNaLista; i++) { + const detalhe = this.ListaDetalhes[i]; + + detalhe.botao = detalhe.habilitado ? "Desabilitar" : "Habilitar"; + + const ordemImagem = detalhe.ordem != null && detalhe.ordem != undefined ? detalhe.ordem : i; + + detalhe.imagem = this.LinkProjeto + + "/sistemas/" + + detalhe.idsistemas + + "/detalhes/detalhe_" + + ordemImagem + + ".jpg"; + } + + this.CarregadoLista = true; + } + + NovoDetalhe() { + const novo = new SistemasDetalhes(); + + novo.habilitado = false; + novo.idsistemas = this.Sistema.idsistemas; + novo.botao = "Habilitar"; + novo.ordem = this.ListaDetalhes.length; + novo.descricao = ""; + novo.imagem = ""; + + this.ListaDetalhes.push(novo); + } + + onFileChanged(event, index: number) { + if (event.target.files && event.target.files[0]) { + this.ListaDetalhes[index].Arquivo = event.target.files[0]; + + const reader = new FileReader(); + + reader.readAsDataURL(event.target.files[0]); + + reader.onload = (event) => { + this.ListaDetalhes[index].imagem = event.target['result']; + }; + } + } + + RemoverDetalhe(index: number) { + if (!confirm("Tem certeza que deseja remover esse item?")) { + return; + } + + const detalhe = this.ListaDetalhes[index]; + + if (!detalhe.idsistemasdetalhes) { + this.ListaDetalhes.splice(index, 1); + this.ReordenarListaLocal(); + return; + } + + this.sistemasService.deleteSistemaDetalhe(detalhe.idsistemasdetalhes, this.Sistema.idsistemas, index).then(resDelete => { + if (resDelete['status'] == 200) { + this.ListaDetalhes.splice(index, 1); + this.ItensNaLista = this.ListaDetalhes.length; + this.ReordenarListaLocal(); + } else { + alert("Erro ao remover detalhe"); + console.log(resDelete); + } + }); + } + + ReordenarListaLocal() { + for (let i = 0; i < this.ListaDetalhes.length; i++) { + this.ListaDetalhes[i].ordem = i; + } + } + + HabilitarDetalhe(Detalhe: SistemasDetalhes) { + Detalhe.habilitado = !Detalhe.habilitado; + Detalhe.botao = Detalhe.habilitado ? "Desabilitar" : "Habilitar"; + } + + Salvar() { + if (this.Salvando) { + return; + } + + this.Salvando = true; + this.IndexDetalhe = 0; + this.SalvarProximo(); + } + + SalvarProximo() { + if (this.IndexDetalhe < this.ListaDetalhes.length) { + const Detalhe = new SistemasDetalhes(); + + Detalhe.idsistemasdetalhes = this.ListaDetalhes[this.IndexDetalhe].idsistemasdetalhes; + Detalhe.habilitado = this.ListaDetalhes[this.IndexDetalhe].habilitado; + Detalhe.descricao = this.ListaDetalhes[this.IndexDetalhe].descricao; + Detalhe.idsistemas = this.ListaDetalhes[this.IndexDetalhe].idsistemas; + Detalhe.ordem = this.IndexDetalhe; + + if (this.IndexDetalhe < this.ItensNaLista) { + this.sistemasService.updateDetalhe(Detalhe).then(resUpdate => { + if (this.ListaDetalhes[this.IndexDetalhe].Arquivo != null) { + this.CopiarImagem(this.IndexDetalhe); + } + + this.IndexDetalhe++; + this.SalvarProximo(); + }); + + return; + } + + this.sistemasService.insertDetalhe(Detalhe).then(resInsert => { + this.ListaDetalhes[this.IndexDetalhe].idsistemasdetalhes = resInsert['response'].insertId; + + if (this.ListaDetalhes[this.IndexDetalhe].Arquivo != null) { + this.CopiarImagem(this.IndexDetalhe); + } + + this.IndexDetalhe++; + this.SalvarProximo(); + }); + + return; + } + + this.sistemasService.atualizarListaDetalhes(this.Sistema.idsistemas).then(resAtualizacao => { + console.log("Atualizacao do indice de detalhes:", resAtualizacao); + + alert("Detalhes cadastrados com sucesso!"); + + this.IndexDetalhe = 0; + this.Salvando = false; + this.ngOnInit(); + }); + } + + CopiarImagem(index: number) { + const req = new XMLHttpRequest(); + const formData = new FormData(); + + formData.append("nome", "detalhe_" + this.ListaDetalhes[index].ordem + ".jpg"); + formData.append("arquivo", this.ListaDetalhes[index].Arquivo); + formData.append("idsistemas", this.ListaDetalhes[index].idsistemas.toString()); + + req.open("POST", environment.ApiUrl + "/sistemas/copyDetalhe"); + req.send(formData); + + req.onreadystatechange = function () { + if (req.readyState === 4) { + console.log("Imagem copiada com sucesso"); + } + }; + } +} \ No newline at end of file diff --git a/src/app/chaves/chaves.component.html b/src/app/chaves/chaves.component.html new file mode 100644 index 0000000..968fa06 --- /dev/null +++ b/src/app/chaves/chaves.component.html @@ -0,0 +1,195 @@ +
+ + +
+
+
+ +
+ +
+ Licenças e chaves + +

{{ Sistema.nome }}

+ +

+ Gerencie suas chaves de acesso, compre licenças e acompanhe a validade deste sistema. +

+ +
+ Versão {{ Sistema.versaoatual }} + Lançamento {{ Sistema.insert_date | date:'dd/MM/yyyy' }} +
+
+
+
+ + +
+
+
+ vpn_key +
+ +
+ Chaves geradas + {{ ListaDeChaves?.length || 0 }} +
+
+ +
+
+ shopping_cart +
+ +
+ Opções de licença + {{ Produtos?.length || 0 }} +
+
+ +
+
+ verified_user +
+ +
+ Status + Disponível +
+
+
+ + +
+
+
+ Comprar licença +

Opções disponíveis

+
+
+ +
+
+
+
+ workspace_premium +
+ + Licença +
+ +

{{ Produto.descricao }}

+ +
+ R$ + {{ Produto.valor | number:'1.2-2' }} +
+ +

+ Libere uma chave de acesso para utilização do sistema conforme o tipo de licença selecionado. +

+ + +
+
+ +
+
+ info +
+ +

Nenhuma licença disponível

+ +

+ Este sistema não possui versões disponíveis para compra de licenças no momento. +

+
+
+ + +
+
+
+ Avaliação +

Gerar chave de avaliação

+

+ Você ainda não possui chaves para este sistema. Gere uma chave de avaliação para testar o acesso. +

+
+ + +
+
+ + +
+
+
+ Acessos +

Chaves do sistema

+
+
+ +
+
+ +
+ {{ getKeyStatusLabel(Chave) }} +
+ +
+ Chave de acesso + +
+ + content_copy +
+
+ +
+
+ Criação + {{ Chave.DataCriacao | date:'dd/MM/yyyy' }} +
+ +
+ Validade + {{ Chave.DataValidade | date:'dd/MM/yyyy' }} +
+ +
+ Status + {{ Chave.Status }} +
+ +
+ Ativada + {{ Chave.Ativada }} +
+
+
+
+ +
+
+ vpn_key_off +
+ +

Nenhuma chave gerada

+ +

+ Gere uma chave de avaliação ou compre uma licença para liberar o acesso ao sistema. +

+
+
+ +
\ No newline at end of file diff --git a/src/app/chaves/chaves.component.scss b/src/app/chaves/chaves.component.scss new file mode 100644 index 0000000..87517ca --- /dev/null +++ b/src/app/chaves/chaves.component.scss @@ -0,0 +1,672 @@ +.key-page { + min-height: calc(100vh - 74px); + color: #0f172a; +} + +/* HERO */ + +.key-hero { + position: relative; + overflow: hidden; + margin-bottom: 22px; + padding: 32px; + border-radius: 24px; + background: + radial-gradient(circle at top right, rgba(255, 255, 255, 0.14), transparent 34%), + linear-gradient(145deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 22px 55px rgba(15, 23, 42, 0.16); +} + +.key-hero::before { + content: ""; + position: absolute; + width: 320px; + height: 320px; + right: -120px; + top: -120px; + border-radius: 999px; + background: rgba(255, 255, 255, 0.11); +} + +.key-hero-content { + position: relative; + z-index: 1; + display: flex; + align-items: center; + gap: 24px; +} + +.system-logo-box { + width: 96px; + height: 96px; + flex: 0 0 auto; + display: flex; + align-items: center; + justify-content: center; + border-radius: 24px; + background: #ffffff; + cursor: pointer; + box-shadow: 0 18px 42px rgba(0, 0, 0, 0.18); +} + +.system-logo { + width: 62px; + height: 62px; + object-fit: contain; +} + +.system-title { + min-width: 0; +} + +.eyebrow { + display: inline-block; + margin-bottom: 10px; + color: #071b63; + font-size: 12px; + font-weight: 900; + letter-spacing: 0.14em; + text-transform: uppercase; +} + +.key-hero .eyebrow, +.trial-section .eyebrow { + color: #bfdbfe; +} + +.system-title h1 { + margin: 0 0 12px 0; + color: #ffffff; + font-size: 34px; + line-height: 42px; + font-weight: 900; + letter-spacing: -0.04em; +} + +.system-title p { + max-width: 680px; + margin: 0; + color: #dbeafe; + font-size: 15px; + line-height: 25px; +} + +.system-tags { + display: flex; + flex-wrap: wrap; + gap: 10px; + margin-top: 18px; +} + +.system-tags span { + display: inline-flex; + align-items: center; + min-height: 28px; + padding: 0 12px; + border-radius: 999px; + background: rgba(255, 255, 255, 0.12); + color: #ffffff; + font-size: 12px; + font-weight: 800; +} + +/* SUMMARY */ + +.summary-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 16px; + margin-bottom: 22px; +} + +.summary-card { + display: flex; + align-items: center; + gap: 16px; + padding: 20px; + border-radius: 20px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 16px 36px rgba(15, 23, 42, 0.08); +} + +.summary-icon { + width: 48px; + height: 48px; + border-radius: 16px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.summary-icon .material-icons { + font-size: 25px; +} + +.summary-card span { + display: block; + margin-bottom: 4px; + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.summary-card strong { + display: block; + color: #0f172a; + font-size: 22px; + line-height: 28px; + font-weight: 900; +} + +/* PANELS */ + +.panel-card { + margin-bottom: 22px; + padding: 28px; + border-radius: 24px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 18px 45px rgba(15, 23, 42, 0.10); +} + +.panel-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 24px; +} + +.panel-header h2 { + margin: 0; + color: #0f172a; + font-size: 26px; + line-height: 34px; + font-weight: 900; + letter-spacing: -0.035em; +} + +/* LICENSES */ + +.license-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 18px; +} + +.license-card { + padding: 22px; + border-radius: 22px; + background: #f8fafc; + border: 1px solid #e5e7eb; + transition: transform 0.18s ease, box-shadow 0.18s ease, border-color 0.18s ease; +} + +.license-card:hover { + transform: translateY(-3px); + border-color: rgba(7, 27, 99, 0.22); + box-shadow: 0 18px 42px rgba(15, 23, 42, 0.12); +} + +.license-card-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 18px; +} + +.license-icon { + width: 46px; + height: 46px; + border-radius: 16px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.license-card-header span { + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.license-card h3 { + margin: 0 0 16px 0; + color: #0f172a; + font-size: 20px; + line-height: 27px; + font-weight: 900; +} + +.license-price { + display: flex; + align-items: flex-start; + gap: 6px; + margin-bottom: 14px; +} + +.license-price small { + margin-top: 6px; + color: #071b63; + font-size: 14px; + font-weight: 900; +} + +.license-price strong { + color: #071b63; + font-size: 34px; + line-height: 38px; + font-weight: 900; + letter-spacing: -0.04em; +} + +.license-card p { + min-height: 68px; + margin: 0 0 18px 0; + color: #64748b; + font-size: 14px; + line-height: 23px; +} + +.btn-license { + width: 100%; + min-height: 44px; + border: none; + border-radius: 12px; + background: linear-gradient(135deg, #071b63, #12358f); + color: #ffffff; + font-size: 13px; + font-weight: 900; + cursor: pointer; + box-shadow: 0 12px 24px rgba(7, 27, 99, 0.20); + transition: transform 0.18s ease, box-shadow 0.18s ease; +} + +.btn-license:hover { + transform: translateY(-1px); + box-shadow: 0 16px 30px rgba(7, 27, 99, 0.26); +} + +/* TRIAL */ + +.trial-section { + margin-bottom: 22px; + padding: 28px; + border-radius: 24px; + background: + radial-gradient(circle at top right, rgba(255, 255, 255, 0.12), transparent 34%), + linear-gradient(145deg, #15803d, #166534); + color: #ffffff; + box-shadow: 0 18px 45px rgba(21, 128, 61, 0.16); +} + +.trial-content { + display: grid; + grid-template-columns: 1fr auto; + align-items: center; + gap: 22px; +} + +.trial-content h2 { + margin: 0 0 8px 0; + color: #ffffff; + font-size: 26px; + line-height: 34px; + font-weight: 900; +} + +.trial-content p { + max-width: 680px; + margin: 0; + color: #dcfce7; + font-size: 14px; + line-height: 23px; +} + +.btn-trial { + min-height: 46px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 0 18px; + border: none; + border-radius: 12px; + background: #ffffff; + color: #166534; + font-size: 13px; + font-weight: 900; + cursor: pointer; + box-shadow: 0 12px 24px rgba(0, 0, 0, 0.16); + transition: transform 0.18s ease, box-shadow 0.18s ease; +} + +.btn-trial:hover { + transform: translateY(-1px); +} + +.btn-trial .material-icons { + font-size: 20px; +} + +/* KEYS */ + +.keys-list { + display: grid; + gap: 16px; +} + +.key-card { + padding: 20px; + border-radius: 22px; + background: #f8fafc; + border: 1px solid #e5e7eb; +} + +.key-main { + margin-bottom: 16px; +} + +.key-label { + display: block; + margin-bottom: 8px; + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.key-value { + display: grid; + grid-template-columns: 1fr auto; + align-items: center; + gap: 10px; + padding: 10px 12px; + border-radius: 14px; + background: #ffffff; + border: 1px solid #dbe6ff; + cursor: pointer; + transition: border-color 0.18s ease, box-shadow 0.18s ease; +} + +.key-value:hover { + border-color: rgba(7, 27, 99, 0.28); + box-shadow: 0 0 0 4px rgba(7, 27, 99, 0.08); +} + +.key-value input { + width: 100%; + min-width: 0; + border: none; + outline: none; + background: transparent; + color: #0f172a; + font-size: 15px; + font-weight: 800; + cursor: pointer; +} + +.key-value .material-icons { + color: #071b63; + font-size: 22px; +} + +.key-meta { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 12px; +} + +.key-card { + position: relative; + overflow: hidden; + padding: 20px; + border-radius: 22px; + background: #f8fafc; + border: 1px solid #e5e7eb; + transition: transform 0.18s ease, box-shadow 0.18s ease, border-color 0.18s ease; +} + +.key-card::before { + content: ""; + position: absolute; + left: 0; + top: 0; + width: 7px; + height: 100%; + background: #94a3b8; +} + +.key-card:hover { + transform: translateY(-2px); + box-shadow: 0 18px 42px rgba(15, 23, 42, 0.12); +} + +.key-status-ribbon { + display: flex; + justify-content: flex-end; + margin-bottom: 14px; +} + +.key-status-ribbon span { + display: inline-flex; + align-items: center; + min-height: 28px; + padding: 0 12px; + border-radius: 999px; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.06em; +} + +/* Verde: válida e ativada */ +.key-card-active { + background: linear-gradient(90deg, rgba(220, 252, 231, 0.75), #f8fafc 34%); + border-color: rgba(22, 163, 74, 0.28); +} + +.key-card-active::before { + background: #16a34a; +} + +.key-card-active .key-status-ribbon span { + background: #dcfce7; + color: #166534; +} + +/* Amarelo: válida, mas não ativada */ +.key-card-pending { + background: linear-gradient(90deg, rgba(254, 249, 195, 0.82), #f8fafc 34%); + border-color: rgba(202, 138, 4, 0.28); +} + +.key-card-pending::before { + background: #ca8a04; +} + +.key-card-pending .key-status-ribbon span { + background: #fef9c3; + color: #854d0e; +} + +/* Vermelho: expirada/vencida/inválida */ +.key-card-expired { + background: linear-gradient(90deg, rgba(254, 226, 226, 0.82), #f8fafc 34%); + border-color: rgba(220, 38, 38, 0.28); +} + +.key-card-expired::before { + background: #dc2626; +} + +.key-card-expired .key-status-ribbon span { + background: #fee2e2; + color: #991b1b; +} + +/* Neutra */ +.key-card-neutral { + background: linear-gradient(90deg, rgba(226, 232, 240, 0.72), #f8fafc 34%); + border-color: rgba(100, 116, 139, 0.22); +} + +.key-card-neutral::before { + background: #64748b; +} + +.key-card-neutral .key-status-ribbon span { + background: #e2e8f0; + color: #334155; +} + +.meta-item { + padding: 14px; + border-radius: 16px; + background: #ffffff; + border: 1px solid #e5e7eb; +} + +.meta-item span { + display: block; + margin-bottom: 5px; + color: #64748b; + font-size: 11px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.meta-item strong { + display: block; + color: #0f172a; + font-size: 14px; + line-height: 21px; + font-weight: 900; +} + +/* EMPTY */ + +.empty-state { + padding: 42px 20px; + text-align: center; + border-radius: 22px; + background: #f8fafc; + border: 1px dashed #cbd5e1; +} + +.empty-state.small { + padding: 30px 20px; +} + +.empty-icon { + width: 66px; + height: 66px; + margin: 0 auto 18px auto; + border-radius: 999px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.empty-icon .material-icons { + font-size: 32px; +} + +.empty-state h3 { + margin: 0 0 10px 0; + color: #0f172a; + font-size: 22px; + font-weight: 900; +} + +.empty-state p { + max-width: 520px; + margin: 0 auto; + color: #64748b; + font-size: 14px; + line-height: 23px; +} + +/* RESPONSIVE */ + +@media (max-width: 1040px) { + .license-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .key-meta { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} + +@media (max-width: 720px) { + .key-hero-content { + flex-direction: column; + text-align: center; + } + + .system-tags { + justify-content: center; + } + + .summary-grid, + .license-grid { + grid-template-columns: 1fr; + } + + .trial-content { + grid-template-columns: 1fr; + } + + .btn-trial { + width: 100%; + } + + .panel-card, + .trial-section, + .key-hero { + padding: 22px; + } + + .panel-header h2, + .trial-content h2 { + font-size: 22px; + line-height: 30px; + } + + .system-title h1 { + font-size: 28px; + line-height: 36px; + } +} + +@media (max-width: 480px) { + .key-meta { + grid-template-columns: 1fr; + } + + .key-value { + grid-template-columns: 1fr; + } + + .key-value .material-icons { + justify-self: end; + } + + .license-price strong { + font-size: 30px; + } +} \ No newline at end of file diff --git a/src/app/chaves/chaves.component.ts b/src/app/chaves/chaves.component.ts new file mode 100644 index 0000000..cf26eb1 --- /dev/null +++ b/src/app/chaves/chaves.component.ts @@ -0,0 +1,320 @@ +import { Component, OnInit } from '@angular/core'; +import { SistemasService } from '../services/sistemas.service'; +import { Chaves, Sistemas, ListChaves } from '../models/sistemasModel'; +import { ActivatedRoute, Router } from '@angular/router'; +import { environment } from 'src/environments/environment'; +import { UsuariosService } from '../services/usuarios.service'; +import { Usuarios } from '../models/usuariosModel'; +import { ProdutosService } from '../services/produtosService'; +import { ProdutosModel } from '../models/produtosModel'; + +@Component({ + selector: 'app-chaves', + templateUrl: './chaves.component.html', + styleUrls: ['./chaves.component.scss', './../app.component.scss'] +}) +export class ChavesComponent implements OnInit { + + FormChaves: Chaves = new Chaves(); + Sistema: Sistemas = new Sistemas(); + ListaDeChaves: ListChaves[]; + Usuario: Usuarios = new Usuarios(); + UserID: number = parseInt(localStorage.getItem("UserID")); + idsistemas: number = this.route.snapshot.params['idsistemas']; + LinkImagem: string; + Produtos: ProdutosModel[] = []; + + constructor( + private sistemasService: SistemasService, + private route: ActivatedRoute, + private usuariosService: UsuariosService, + private router: Router, + private produtosService: ProdutosService + ) { } + + ngOnInit() { + this.sistemasService.getSistemaByID(this.idsistemas).then(resSistema => { + this.Sistema = resSistema; + this.LinkImagem = environment.LinkProjeto + "/sistemas/" + this.idsistemas + "/icone.png"; + }); + this.usuariosService.getUsuarioByID(this.UserID).then(resUsuario => { + this.Usuario = resUsuario; + }); + this.produtosService.getProdutosSell(this.idsistemas).then(resProdutos => { + this.Produtos = resProdutos; + }); + this.AtualizaChaves(); + } + + AtualizaChaves() { + this.sistemasService.getChavesSistemaLista(this.idsistemas, this.UserID).then(resChave => { + this.ListaDeChaves = resChave; + }) + } + + btnGerarClick() { + let Mensagem: string; + if (this.ListaDeChaves.length == 0) { + Mensagem = "A primeira chave do sistema é gerada gratuitamente com validade de 30 dias a partir de sua data de geração! Deseja gerar sua chave de avaliação agora?"; + } + else { + //this.Pagamento = true; + //this.GerarChave(30); + if (confirm("Deseja solicitar uma nova chave de sistema?")) { + this.produtosService.buySistema(this.idsistemas, this.UserID, 1).then(res => { + //console.log(res); + alert("Você será redirecionado para a tela de pagamentos do Mercado Pago.\rQuando o pagamento for confirmado, a licença será gerada automaticamente e já aparecerá na sua lista de chaves!"); + const paymentUrl = res['url']; + window.open(paymentUrl, '_blank'); + }); + } + return; + } + if (confirm(Mensagem)) { + this.GerarChave(30); + } + else { + return; + } + //this.GerarChave(30); + } + + DataValidade(Dias: number) { + let DataAtual = new Date(); + DataAtual.setDate(DataAtual.getDate() + Dias); + let DataFix = + DataAtual.toLocaleDateString()[0] + + DataAtual.toLocaleDateString()[1] + + DataAtual.toLocaleDateString()[3] + + DataAtual.toLocaleDateString()[4] + + DataAtual.toLocaleDateString()[6] + + DataAtual.toLocaleDateString()[7] + + DataAtual.toLocaleDateString()[8] + + DataAtual.toLocaleDateString()[9]; + return DataFix; + } + + GerarChave(Dias: number) { + let SerialKey: string; + let CPF = this.CryptText(this.Usuario.cpf); + let Validade = this.CryptText(this.DataValidade(Dias)); + SerialKey = + Validade[0].toString() + + CPF[13].toString() + + CPF[0].toString() + + Validade[1].toString() + + CPF[12].toString() + + CPF[1].toString() + + Validade[2].toString() + + CPF[11].toString() + + CPF[2].toString() + + Validade[3].toString() + + CPF[10].toString() + + CPF[3].toString() + + Validade[4].toString() + + CPF[9].toString() + + CPF[4].toString() + + Validade[5].toString() + + CPF[8].toString() + + CPF[5].toString() + + Validade[6].toString() + + CPF[7].toString() + + CPF[6].toString() + + Validade[7].toString(); + + let DatValidade = new Date(); + DatValidade.setDate(DatValidade.getDate() + Dias); + + this.FormChaves.licenca = SerialKey; + this.FormChaves.idusuarios = this.UserID; + this.FormChaves.idsistemas = this.idsistemas; + this.FormChaves.data_validade = DatValidade; + + this.sistemasService.insertChave(this.FormChaves).then(resInsert => { + if (resInsert['status'] == 200) { + alert("Chave de licença gerada com sucesso!"); + this.AtualizaChaves(); + } + else { + alert("Erro ao gerar chave! Por favor tente novamente mais tarde!"); + } + }) + } + + CryptText(Texto: string) + { + let RandNumber: number; + let NewChar: string; + let FinalString: string = ""; + let SwitchChar: string = ""; + for (let i = 0; i <= Texto.length; i++) + { + RandNumber = Math.floor(Math.random() * 2); + SwitchChar = Texto.substring(i, 1)[Texto.substring(i, 1).length - 1]; + if (SwitchChar != undefined) { + switch (SwitchChar) + { + case "0": + if (RandNumber == 0) + NewChar = "q"; + else + NewChar = "3"; + break; + case "1": + if (RandNumber == 0) + NewChar = "w"; + else + NewChar = "5"; + break; + case "2": + if (RandNumber == 0) + NewChar = "r"; + else + NewChar = "4"; + break; + case "3": + if (RandNumber == 0) + NewChar = "D"; + else + NewChar = "6"; + break; + case "4": + if (RandNumber == 0) + NewChar = "H"; + else + NewChar = "9"; + break; + case "5": + if (RandNumber == 0) + NewChar = "b"; + else + NewChar = "7"; + break; + case "6": + if (RandNumber == 0) + NewChar = "U"; + else + NewChar = "8"; + break; + case "7": + if (RandNumber == 0) + NewChar = "k"; + else + NewChar = "1"; + break; + case "8": + if (RandNumber == 0) + NewChar = "I"; + else + NewChar = "0"; + break; + case "9": + if (RandNumber == 0) + NewChar = "p"; + else + NewChar = "2"; + break; + default: + NewChar = "-"; + break; + } + FinalString += NewChar; + } + } + return FinalString; + } + + + comprarLicenca(Produto: ProdutosModel) { + if (confirm("Deseja solicitar uma nova chave de sistema na versão " + Produto.descricao + "?")) { + this.produtosService.buySistema(Produto.idprodutos, this.UserID, 1).then(res => { + //console.log(res); + if (res['chave'] != null) { + alert("Chave gerada com sucesso!"); + this.AtualizaChaves(); + } + else { + alert("Você será redirecionado para a tela de pagamentos do Mercado Pago.\rQuando o pagamento for confirmado, a licença será gerada automaticamente e já aparecerá na sua lista de chaves!"); + const paymentUrl = res['url']; + window.open(paymentUrl, '_blank'); + } + }); + } + } + + copyToClipboard(chave: string) { + navigator.clipboard.writeText(chave).then(() => { + alert("Chave copiada para a área de transferência!"); + }); + } + + NavegarSistema() { + const url = this.router.serializeUrl( + this.router.createUrlTree(['/detalhes/' + this.idsistemas]) + ); + window.open(url, '_blank'); + } + + getKeyCardClass(Chave: any): string { + const hoje = new Date(); + hoje.setHours(0, 0, 0, 0); + + const validade = new Date(Chave.DataValidade); + validade.setHours(0, 0, 0, 0); + + const status = (Chave.Status || '').toString().toLowerCase(); + const ativada = (Chave.Ativada || '').toString().toLowerCase(); + + const expirou = validade < hoje; + const estaAtivada = + ativada === 'sim' || + ativada === 'true' || + ativada === '1' || + ativada === 'ativada'; + + const estaValida = + !expirou && + ( + status.includes('válida') || + status.includes('valid') || + status.includes('ativa') || + status.includes('vigente') || + status === 'ok' + ); + + //console.log("status: " + status + ", ativada: " + ativada + ", expirou: " + expirou + ", estaAtivada: " + estaAtivada + ", estaValida: " + estaValida) + + if (expirou || status.includes('expir') || status.includes('venc')) { + return 'key-card-expired'; + } + + if (estaValida && estaAtivada) { + return 'key-card-active'; + } + + if (estaValida && !estaAtivada) { + return 'key-card-pending'; + } + + return 'key-card-neutral'; + } + + getKeyStatusLabel(Chave: any): string { + const cardClass = this.getKeyCardClass(Chave); + + if (cardClass === 'key-card-expired') { + return 'Expirada'; + } + + if (cardClass === 'key-card-active') { + return 'Válida e ativada'; + } + + if (cardClass === 'key-card-pending') { + return 'Válida, aguardando ativação'; + } + + return 'Status indefinido'; + } + +} diff --git a/src/app/client/client.component.html b/src/app/client/client.component.html new file mode 100644 index 0000000..8dcd829 --- /dev/null +++ b/src/app/client/client.component.html @@ -0,0 +1,157 @@ +
+ + +
+
+ Área do cliente + +

Bem-vindo, {{ NomeUsuario }}!

+ +

+ Gerencie seus sistemas, acompanhe suas licenças e gere chaves de acesso em um só lugar. +

+
+ +
+ Sistemas ativos + {{ SistemasDoUsuario?.length || 0 }} + Disponíveis na sua conta +
+
+ + +
+
+
+ apps +
+ +
+ Total de sistemas + {{ SistemasDoUsuario?.length || 0 }} +
+
+ +
+
+ vpn_key +
+ +
+ Chaves válidas + {{ TotalChavesValidas }} +
+
+ +
+
+ verified_user +
+ +
+ Status + Ativo +
+
+
+ + +
+ +
+
+ Meus sistemas +

Soluções vinculadas à sua conta

+
+
+ +
+ +
+ +
+
+ +
+ +
+

{{ Sistema.nome }}

+ + + {{ Sistema.gratis ? 'Gratuito' : 'Licenciado' }} + +
+
+ +

+ {{ Sistema.descricao }} +

+ +
+
+ Data download + {{ Sistema.data_download | date:'dd/MM/yyyy' }} +
+ +
+ Chaves válidas + {{ Sistema.chavesValidas }} +
+
+ +
+ + + + + +
+ +
+ +
+ +
+
+ inventory_2 +
+ +

Nenhum sistema vinculado ainda

+ +

+ Você ainda não possui sistemas na sua conta. Acesse a página inicial para conhecer as soluções disponíveis. +

+ + +
+ +
+ +
\ No newline at end of file diff --git a/src/app/client/client.component.scss b/src/app/client/client.component.scss new file mode 100644 index 0000000..5a2daaa --- /dev/null +++ b/src/app/client/client.component.scss @@ -0,0 +1,452 @@ +.client-page { + min-height: calc(100vh - 74px); + color: #0f172a; +} + +/* HERO */ + +.client-hero { + position: relative; + overflow: hidden; + display: grid; + grid-template-columns: 1fr 230px; + align-items: center; + gap: 24px; + margin-bottom: 22px; + padding: 32px; + border-radius: 24px; + background: + radial-gradient(circle at top right, rgba(255, 255, 255, 0.14), transparent 34%), + linear-gradient(145deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 22px 55px rgba(15, 23, 42, 0.16); +} + +.client-hero::before { + content: ""; + position: absolute; + width: 320px; + height: 320px; + right: -120px; + top: -120px; + border-radius: 999px; + background: rgba(255, 255, 255, 0.11); +} + +.client-hero-text { + position: relative; + z-index: 1; +} + +.eyebrow { + display: inline-block; + margin-bottom: 10px; + color: #071b63; + font-size: 12px; + font-weight: 900; + letter-spacing: 0.14em; + text-transform: uppercase; +} + +.client-hero .eyebrow { + color: #bfdbfe; +} + +.client-hero h1 { + margin: 0 0 12px 0; + color: #ffffff; + font-size: 34px; + line-height: 42px; + font-weight: 900; + letter-spacing: -0.04em; +} + +.client-hero p { + max-width: 660px; + margin: 0; + color: #dbeafe; + font-size: 15px; + line-height: 25px; +} + +.client-hero-card { + position: relative; + z-index: 1; + padding: 22px; + border-radius: 22px; + background: rgba(255, 255, 255, 0.12); + border: 1px solid rgba(255, 255, 255, 0.18); + backdrop-filter: blur(10px); +} + +.client-hero-card span, +.client-hero-card small { + display: block; + color: #bfdbfe; + font-size: 12px; + font-weight: 800; +} + +.client-hero-card strong { + display: block; + margin: 8px 0; + color: #ffffff; + font-size: 42px; + line-height: 46px; + font-weight: 900; +} + +/* SUMMARY */ + +.summary-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 16px; + margin-bottom: 22px; +} + +.summary-card { + display: flex; + align-items: center; + gap: 16px; + padding: 20px; + border-radius: 20px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 16px 36px rgba(15, 23, 42, 0.08); +} + +.summary-icon { + width: 48px; + height: 48px; + border-radius: 16px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.summary-icon .material-icons { + font-size: 25px; +} + +.summary-card span { + display: block; + margin-bottom: 4px; + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.summary-card strong { + display: block; + color: #0f172a; + font-size: 22px; + line-height: 28px; + font-weight: 900; +} + +/* PANEL */ + +.systems-panel { + padding: 28px; + border-radius: 24px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 18px 45px rgba(15, 23, 42, 0.10); +} + +.panel-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 24px; +} + +.panel-header h2 { + margin: 0; + color: #0f172a; + font-size: 26px; + line-height: 34px; + font-weight: 900; + letter-spacing: -0.035em; +} + +/* SYSTEM CARDS */ + +.client-systems-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 18px; +} + +.client-system-card { + display: flex; + flex-direction: column; + min-height: 280px; + padding: 22px; + border-radius: 22px; + background: #f8fafc; + border: 1px solid #e5e7eb; + transition: transform 0.18s ease, box-shadow 0.18s ease, border-color 0.18s ease; +} + +.client-system-card:hover { + transform: translateY(-3px); + border-color: rgba(7, 27, 99, 0.22); + box-shadow: 0 18px 42px rgba(15, 23, 42, 0.12); +} + +.system-card-top { + display: flex; + align-items: center; + gap: 16px; + margin-bottom: 18px; +} + +.system-logo-box { + width: 70px; + height: 70px; + flex: 0 0 auto; + border-radius: 18px; + display: flex; + align-items: center; + justify-content: center; + background: #ffffff; + border: 1px solid #dbe6ff; + cursor: pointer; +} + +.system-logo { + width: 46px; + height: 46px; + object-fit: contain; +} + +.system-title-block { + min-width: 0; +} + +.system-title-block h3 { + margin: 0 0 8px 0; + color: #0f172a; + font-size: 20px; + line-height: 27px; + font-weight: 900; + letter-spacing: -0.025em; +} + +.system-status { + display: inline-flex; + align-items: center; + min-height: 24px; + padding: 0 10px; + border-radius: 999px; + background: #e0f2fe; + color: #075985; + font-size: 12px; + font-weight: 900; +} + +.system-description { + flex: 1; + margin: 0 0 18px 0; + color: #64748b; + font-size: 14px; + line-height: 23px; +} + +.system-meta-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 12px; + margin-bottom: 18px; +} + +.meta-item { + padding: 14px; + border-radius: 16px; + background: #ffffff; + border: 1px solid #e5e7eb; +} + +.meta-item span { + display: block; + margin-bottom: 5px; + color: #64748b; + font-size: 11px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.meta-item strong { + display: block; + color: #0f172a; + font-size: 15px; + line-height: 22px; + font-weight: 900; +} + +.system-actions { + display: flex; + flex-wrap: wrap; + gap: 10px; +} + +.btn-card { + min-height: 40px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 7px; + padding: 0 14px; + border: none; + border-radius: 12px; + color: #ffffff; + font-size: 12px; + font-weight: 900; + cursor: pointer; + transition: transform 0.18s ease, box-shadow 0.18s ease, background-color 0.18s ease; +} + +.btn-card .material-icons { + font-size: 18px; +} + +.btn-card:hover { + transform: translateY(-1px); +} + +.btn-key { + background: #15803d; + box-shadow: 0 10px 20px rgba(21, 128, 61, 0.20); +} + +.btn-details { + background: #071b63; + box-shadow: 0 10px 20px rgba(7, 27, 99, 0.20); +} + +.btn-remove { + background: #dc2626; + box-shadow: 0 10px 20px rgba(220, 38, 38, 0.18); +} + +/* EMPTY */ + +.empty-state { + padding: 42px 20px; + text-align: center; + border-radius: 22px; + background: #f8fafc; + border: 1px dashed #cbd5e1; +} + +.empty-icon { + width: 72px; + height: 72px; + margin: 0 auto 18px auto; + border-radius: 999px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.empty-icon .material-icons { + font-size: 34px; +} + +.empty-state h3 { + margin: 0 0 10px 0; + color: #0f172a; + font-size: 22px; + font-weight: 900; +} + +.empty-state p { + max-width: 520px; + margin: 0 auto 22px auto; + color: #64748b; + font-size: 14px; + line-height: 23px; +} + +.btn-empty { + min-height: 44px; + padding: 0 18px; + border: none; + border-radius: 12px; + background: #071b63; + color: #ffffff; + font-size: 13px; + font-weight: 900; + cursor: pointer; +} + +/* RESPONSIVE */ + +@media (max-width: 980px) { + .client-hero { + grid-template-columns: 1fr; + } + + .client-hero-card { + max-width: 260px; + } + + .client-systems-grid { + grid-template-columns: 1fr; + } +} + +@media (max-width: 720px) { + .summary-grid { + grid-template-columns: 1fr; + } + + .systems-panel { + padding: 20px; + } + + .panel-header h2 { + font-size: 22px; + line-height: 30px; + } + + .system-meta-grid { + grid-template-columns: 1fr; + } + + .system-actions { + flex-direction: column; + } + + .btn-card { + width: 100%; + } +} + +@media (max-width: 480px) { + .client-hero { + padding: 24px; + } + + .client-hero h1 { + font-size: 28px; + line-height: 36px; + } + + .client-system-card { + padding: 18px; + } + + .system-card-top { + align-items: flex-start; + } +} \ No newline at end of file diff --git a/src/app/client/client.component.ts b/src/app/client/client.component.ts new file mode 100644 index 0000000..7b935cb --- /dev/null +++ b/src/app/client/client.component.ts @@ -0,0 +1,70 @@ +import { Component, OnInit } from '@angular/core'; +import { UsuariosService } from '../services/usuarios.service'; +import { SistemasDoUsuario } from '../models/usuariosModel'; +import { Modos } from '../models/variaveisModel'; +import { Router } from '@angular/router'; +import { SistemasService } from '../services/sistemas.service'; +import { environment } from 'src/environments/environment'; + +@Component({ + selector: 'app-client', + templateUrl: './client.component.html', + styleUrls: ['./client.component.scss', './../app.component.scss'] +}) +export class ClientComponent implements OnInit { + + NomeUsuario: string = localStorage.getItem("UserName") || "Usuário"; + idusuarios: number = parseInt(localStorage.getItem("UserID") || "0"); + + SistemasDoUsuario: SistemasDoUsuario[] = []; + + JanelaModo: Modos = new Modos(); + + constructor( + private usuariosService: UsuariosService, + private sistemasService: SistemasService, + public router: Router + ) { } + + ngOnInit() { + this.JanelaModo.Visualizar = true; + this.CarregarSistemas(); + } + + get TotalChavesValidas(): number { + if (!this.SistemasDoUsuario) { + return 0; + } + + return this.SistemasDoUsuario.reduce((total, sistema) => { + return total + Number(sistema["chavesValidas"] || 0); + }, 0); + } + + CarregarSistemas() { + this.usuariosService.getSistemasDoUsuario(this.idusuarios).then(resSistemas => { + this.SistemasDoUsuario = resSistemas || []; + }); + } + + GerarChave(Sistema: SistemasDoUsuario) { + this.router.navigate(['dashboard/cliente/chave/' + Sistema.idsistemas]); + } + + RemoverSistema(Sistema: SistemasDoUsuario) { + if (confirm("Tem certeza que deseja remover esse sistema de sua lista?")) { + this.sistemasService.deleteSistemaUsuario(Sistema.idsistemas, Sistema.idusuarios).then(resDelete => { + this.SistemasDoUsuario = this.SistemasDoUsuario.filter(item => item.idsistemas !== Sistema.idsistemas); + alert("Sistema removido com sucesso!"); + }); + } + } + + LinkImagem(idsistemas: number): string { + return environment.LinkProjeto + "/sistemas/" + idsistemas + "/icone.png"; + } + + NavegarSistema(idsistemas: number) { + this.router.navigate(['detalhes/' + idsistemas]); + } +} \ No newline at end of file diff --git a/src/app/criarconta/criarconta.component.html b/src/app/criarconta/criarconta.component.html new file mode 100644 index 0000000..c208ae5 --- /dev/null +++ b/src/app/criarconta/criarconta.component.html @@ -0,0 +1,137 @@ +
+
+ +
+
+ + +

Crie sua conta

+ +

+ Acesse os sistemas da Zendion, INC. com segurança e acompanhe suas soluções em um só lugar. +

+ +
+ Conta segura + Ativação por e-mail + Acesso rápido +
+
+
+ +
+
+ Cadastro +

{{ TituloJanela }}

+

+ Preencha seus dados para criar sua conta. Depois enviaremos um link de ativação para seu e-mail. +

+
+ +
+ +
+ +
+ + +
+ +
+ + +
+ +
+ + + + + Digite um CPF válido para liberar o cadastro. + +
+ +
+ + +
+ +
+ + +
+ +
+ {{ MensagemForm }} +
+ + + +

+ Ao criar sua conta, você confirma que seus dados estão corretos e aceita receber o e-mail de ativação. +

+
+ +
+
+ +

Cadastro criado com sucesso

+ +

+ Enviamos um link de ativação para o seu e-mail. Verifique sua caixa de entrada e também a pasta de spam. +

+ + +
+ + + +
+
+ +
+
\ No newline at end of file diff --git a/src/app/criarconta/criarconta.component.scss b/src/app/criarconta/criarconta.component.scss new file mode 100644 index 0000000..9f67ef1 --- /dev/null +++ b/src/app/criarconta/criarconta.component.scss @@ -0,0 +1,386 @@ +.register-page { + min-height: calc(100vh - 80px); + display: flex; + align-items: center; + justify-content: center; + padding: 48px 18px; + background: + radial-gradient(circle at top left, rgba(7, 27, 99, 0.14), transparent 34%), + linear-gradient(135deg, #f4f6fb 0%, #eef3ff 45%, #ffffff 100%); +} + +.register-shell { + width: 100%; + max-width: 1040px; + display: grid; + grid-template-columns: 0.95fr 1.05fr; + background: #ffffff; + border-radius: 24px; + overflow: hidden; + box-shadow: 0 24px 70px rgba(15, 23, 42, 0.16); + border: 1px solid rgba(148, 163, 184, 0.22); +} + +.register-brand-panel { + position: relative; + min-height: 620px; + display: flex; + align-items: flex-end; + padding: 42px; + background: + linear-gradient(145deg, rgba(7, 27, 99, 0.96), rgba(18, 47, 132, 0.94)), + url('/assets/logo_escrito.png'); + color: #ffffff; + overflow: hidden; +} + +.register-brand-panel::before { + content: ""; + position: absolute; + width: 340px; + height: 340px; + right: -120px; + top: -100px; + border-radius: 999px; + background: rgba(255, 255, 255, 0.12); +} + +.register-brand-panel::after { + content: ""; + position: absolute; + width: 220px; + height: 220px; + left: -80px; + bottom: -70px; + border-radius: 999px; + background: rgba(255, 255, 255, 0.08); +} + +.brand-content { + position: relative; + z-index: 1; +} + +.brand-logo { + height: 54px; + max-width: 240px; + object-fit: contain; + display: block; + margin-bottom: 34px; + filter: brightness(0) invert(1); +} + +.brand-content h1 { + margin: 0 0 14px 0; + font-size: 34px; + line-height: 42px; + font-weight: 800; + letter-spacing: -0.03em; +} + +.brand-content p { + max-width: 390px; + margin: 0; + color: #dbeafe; + font-size: 16px; + line-height: 27px; +} + +.brand-badges { + display: flex; + flex-wrap: wrap; + gap: 10px; + margin-top: 28px; +} + +.brand-badges span { + display: inline-flex; + align-items: center; + padding: 8px 12px; + border-radius: 999px; + background: rgba(255, 255, 255, 0.13); + color: #ffffff; + font-size: 12px; + font-weight: 700; + backdrop-filter: blur(8px); +} + +.register-card { + padding: 44px 48px; +} + +.register-header { + margin-bottom: 28px; +} + +.eyebrow { + display: inline-block; + margin-bottom: 10px; + color: #071b63; + font-size: 12px; + font-weight: 800; + letter-spacing: 0.12em; + text-transform: uppercase; +} + +.register-header h2 { + margin: 0 0 10px 0; + color: #0f172a; + font-size: 30px; + line-height: 38px; + font-weight: 800; + letter-spacing: -0.03em; +} + +.register-header p { + margin: 0; + color: #64748b; + font-size: 15px; + line-height: 24px; +} + +.register-body { + width: 100%; +} + +.register-form { + display: grid; + gap: 16px; +} + +.form-group { + text-align: left; +} + +.form-group label { + display: block; + margin-bottom: 7px; + color: #1e293b; + font-size: 14px; + font-weight: 700; +} + +.form-control { + width: 100%; + height: 46px; + padding: 0 14px; + border-radius: 12px; + border: 1px solid #d7deea; + background: #ffffff; + color: #0f172a; + font-size: 15px; + outline: none; + transition: border-color 0.2s ease, box-shadow 0.2s ease, background-color 0.2s ease; + box-sizing: border-box; +} + +.form-control::placeholder { + color: #94a3b8; +} + +.form-control:focus { + border-color: #071b63; + box-shadow: 0 0 0 4px rgba(7, 27, 99, 0.10); + background-color: #ffffff; +} + +.field-hint { + display: block; + margin-top: 7px; + color: #b45309; + font-size: 12px; + line-height: 18px; +} + +.btn-register { + width: 100%; + height: 48px; + margin-top: 6px; + border: none; + border-radius: 12px; + background: linear-gradient(135deg, #071b63, #12358f); + color: #ffffff; + font-size: 15px; + font-weight: 800; + cursor: pointer; + box-shadow: 0 12px 24px rgba(7, 27, 99, 0.22); + transition: transform 0.18s ease, box-shadow 0.18s ease, opacity 0.18s ease; +} + +.btn-register:hover:not(:disabled) { + transform: translateY(-1px); + box-shadow: 0 16px 30px rgba(7, 27, 99, 0.28); +} + +.btn-register:active:not(:disabled) { + transform: translateY(0); +} + +.btn-register:disabled { + opacity: 0.55; + cursor: not-allowed; + box-shadow: none; +} + +.terms-text { + margin: 0; + color: #64748b; + font-size: 12px; + line-height: 19px; + text-align: center; +} + +.register-footer { + display: grid; + grid-template-columns: 1fr auto 1fr; + align-items: center; + gap: 16px; + margin-top: 26px; + padding-top: 22px; + border-top: 1px solid #e5e7eb; +} + +.register-footer span { + width: 4px; + height: 4px; + border-radius: 999px; + background: #cbd5e1; +} + +.register-footer a { + color: #071b63; + font-size: 14px; + font-weight: 700; + text-decoration: none; +} + +.register-footer a:first-child { + text-align: left; +} + +.register-footer a:last-child { + text-align: right; +} + +.register-footer a:hover { + text-decoration: underline; +} + +.register-message { + padding: 12px 14px; + border-radius: 12px; + background: #fef2f2; + border: 1px solid #fecaca; + text-align: left; +} + +.register-message small { + display: block; + color: #b91c1c; + font-size: 13px; + line-height: 20px; + font-weight: 600; +} + +.success-box { + text-align: center; + padding: 18px 0 4px 0; +} + +.success-icon { + width: 64px; + height: 64px; + margin: 0 auto 18px auto; + border-radius: 999px; + display: flex; + align-items: center; + justify-content: center; + background: #dcfce7; + color: #15803d; + font-size: 34px; + font-weight: 900; +} + +.success-box h3 { + margin: 0 0 10px 0; + color: #0f172a; + font-size: 24px; + line-height: 32px; + font-weight: 800; +} + +.success-box p { + margin: 0 0 24px 0; + color: #64748b; + font-size: 15px; + line-height: 24px; +} + +@media (max-width: 860px) { + .register-shell { + grid-template-columns: 1fr; + max-width: 560px; + } + + .register-brand-panel { + min-height: auto; + padding: 30px; + align-items: flex-start; + } + + .brand-logo { + height: 44px; + margin-bottom: 22px; + } + + .brand-content h1 { + font-size: 28px; + line-height: 36px; + } + + .register-card { + padding: 34px 26px; + } +} + +@media (max-width: 480px) { + .register-page { + padding: 22px 12px; + } + + .register-shell { + border-radius: 18px; + } + + .register-brand-panel { + padding: 24px; + } + + .brand-badges { + display: none; + } + + .register-card { + padding: 28px 20px; + } + + .register-header h2 { + font-size: 25px; + line-height: 32px; + } + + .register-footer { + grid-template-columns: 1fr; + gap: 10px; + } + + .register-footer span { + display: none; + } + + .register-footer a, + .register-footer a:first-child, + .register-footer a:last-child { + text-align: center; + } +} \ No newline at end of file diff --git a/src/app/criarconta/criarconta.component.ts b/src/app/criarconta/criarconta.component.ts new file mode 100644 index 0000000..c9b009e --- /dev/null +++ b/src/app/criarconta/criarconta.component.ts @@ -0,0 +1,341 @@ +import { Component, OnInit } from '@angular/core'; +import { Usuarios, Email } from '../models/usuariosModel'; +import { UsuariosService } from '../services/usuarios.service'; +import { environment } from 'src/environments/environment'; +import { Router } from '@angular/router'; + +@Component({ + selector: 'app-criarconta', + templateUrl: './criarconta.component.html', + styleUrls: ['./criarconta.component.scss'] +}) +export class CriarcontaComponent implements OnInit { + + FormUsuario: Usuarios = new Usuarios(); + ListUsuarios: Usuarios[]; + MensagemForm: String; + TituloJanela: String = "Cadastre-se"; + TextoBotao: String = "Criar conta"; + FormEmail: Email = new Email(); + Sucesso: boolean = false; + CPFValido: boolean = false; + + constructor( + private usuariosSerivce: UsuariosService, + private router: Router, + ) { } + + ngOnInit() { + this.FormUsuario.idtiposdeusuario = 2; + this.FormUsuario.habilitado = false; + this.ListUsuarios = []; + + this.usuariosSerivce.getUsuarios().then(resUsuarios => { + this.ListUsuarios = resUsuarios || []; + }); + } + + EnviarEmail(link: string) { + const nomeUsuario = this.FormUsuario.nome || 'usuário'; + + const text = ` + + + + + + Ativação de conta Zendion, INC. + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Zendion, INC. +
+

+ Olá, ${nomeUsuario}! +

+
+

+ Sua conta na Zendion, INC. foi criada com sucesso. +

+ +

+ Para ativar sua conta e começar a usar o sistema, clique no botão abaixo: +

+
+ + Ativar minha conta + +
+

+ Se o botão não funcionar, copie e cole este link no navegador: +

+ +

+ + ${link} + +

+
+ + + + +
+

+ Se você não criou uma conta na Zendion, INC., ignore este e-mail. +

+
+
+

+ Atenciosamente,
+ Equipe Zendion, INC. +

+
+

+ Zendion, INC. +

+ +

+ +55 19 99871-7560
+ contato@zendioninc.com.br
+ + zendioninc.com.br + +

+
+ + + + + + +
+

+ Este é um e-mail automático. Por favor, não responda esta mensagem. +

+
+ +
+ + + + `; + + this.FormEmail.Assunto = 'Ative sua conta na Zendion, INC.'; + this.FormEmail.Conteudo = text; + this.FormEmail.Para = this.FormUsuario.email; + + this.usuariosSerivce.EnviarEmail(this.FormEmail).then(response => { + this.Sucesso = true; + this.TextoBotao = "Voltar ao site"; + + if (response != null && response["sucesso"] == true) { + this.TituloJanela = "Um link de ativação foi enviado para seu e-mail. Verifique sua caixa de entrada para ativar sua conta!"; + } else { + this.TituloJanela = "Ocorreu um erro ao enviar o link de ativação para seu endereço de e-mail. Verifique suas informações ou entre em contato com o administrador do sistema."; + } + }); + } + + btnCriarcontaClick() { + if (this.TextoBotao == "Voltar ao site") { + this.router.navigate(['home']); + return; + } + + this.MensagemForm = ""; + + if (!this.FormUsuario.nome || this.FormUsuario.nome.trim() == "") { + this.MensagemForm = "O campo nome é obrigatório."; + return; + } + + if (!this.FormUsuario.email || this.FormUsuario.email.trim() == "") { + this.MensagemForm = "O campo e-mail é obrigatório."; + return; + } + + if (!this.FormUsuario.cpf || this.FormUsuario.cpf.trim() == "") { + this.MensagemForm = "O campo CPF é obrigatório."; + return; + } + + if (!this.CPFValido) { + this.MensagemForm = "Digite um CPF válido para continuar."; + return; + } + + if (!this.FormUsuario.usuario || this.FormUsuario.usuario.trim() == "") { + this.MensagemForm = "O campo usuário é obrigatório."; + return; + } + + if (!this.FormUsuario.senha || this.FormUsuario.senha.trim() == "") { + this.MensagemForm = "O campo senha é obrigatório."; + return; + } + + if (this.ListUsuarios && this.ListUsuarios.length > 0) { + for (let i = 0; i < this.ListUsuarios.length; i++) { + if (this.ListUsuarios[i].usuario == this.FormUsuario.usuario) { + this.MensagemForm = "Nome de usuário indisponível."; + return; + } + + if (this.ListUsuarios[i].email == this.FormUsuario.email) { + this.MensagemForm = "Este e-mail já está cadastrado."; + return; + } + + if (this.ListUsuarios[i].cpf == this.FormUsuario.cpf) { + this.MensagemForm = "Este CPF já está cadastrado."; + return; + } + } + } + + this.usuariosSerivce.insertUsuarios(this.FormUsuario).then(resInsert => { + if (resInsert['status'] == 200) { + this.EnviarEmail(environment.ApiUrl + "/users/ativarUsuario/" + resInsert['response'].insertId); + } else { + this.MensagemForm = "Erro ao criar usuário."; + } + }); + } + + MascaraCPF(event: KeyboardEvent): void { + + if (!((event.keyCode >= 48 && event.keyCode <= 58) || (event.keyCode >= 96 && event.keyCode <= 106))) { + if (event.keyCode == 8 || (event.keyCode >= 37 && event.keyCode <= 40) || event.keyCode == 46) { + return; + } + this.FormUsuario.cpf = this.FormUsuario.cpf.substr(0, this.FormUsuario.cpf.length - 1); + } + if (this.FormUsuario.cpf.length == 3 || this.FormUsuario.cpf.length == 7) + this.FormUsuario.cpf += "."; + if (this.FormUsuario.cpf.length == 11) + this.FormUsuario.cpf += "-"; + if (this.FormUsuario.cpf.length == 14) + this.ValidaCPF(); + } + + ValidaCPF() { + const cpf = + this.FormUsuario.cpf[0] + + this.FormUsuario.cpf[1] + + this.FormUsuario.cpf[2] + + this.FormUsuario.cpf[4] + + this.FormUsuario.cpf[5] + + this.FormUsuario.cpf[6] + + this.FormUsuario.cpf[8] + + this.FormUsuario.cpf[9] + + this.FormUsuario.cpf[10] + + this.FormUsuario.cpf[12] + + this.FormUsuario.cpf[13]; + if (cpf) { + let numbers, digits, sum, i, result, equalDigits; + equalDigits = 1; + if (cpf.length < 11) { + this.CPFValido = false; + return null; + } + + for (i = 0; i < cpf.length - 1; i++) { + if (cpf.charAt(i) !== cpf.charAt(i + 1)) { + equalDigits = 0; + break; + } + } + + if (!equalDigits) { + numbers = cpf.substring(0, 9); + digits = cpf.substring(9); + sum = 0; + for (i = 10; i > 1; i--) { + sum += numbers.charAt(10 - i) * i; + } + + result = sum % 11 < 2 ? 0 : 11 - (sum % 11); + + if (result !== Number(digits.charAt(0))) { + this.CPFValido = false; + this.MensagemForm = "CPF digitado é inválido!"; + return { cpfNotValid: true }; + } + numbers = cpf.substring(0, 10); + sum = 0; + + for (i = 11; i > 1; i--) { + sum += numbers.charAt(11 - i) * i; + } + result = sum % 11 < 2 ? 0 : 11 - (sum % 11); + + if (result !== Number(digits.charAt(1))) { + this.CPFValido = false; + this.MensagemForm = "CPF digitado é inválido!"; + return { cpfNotValid: true }; + } + this.CPFValido = true; + this.MensagemForm = ""; + return null; + } else { + this.CPFValido = false; + this.MensagemForm = "CPF digitado é inválido!"; + return { cpfNotValid: true }; + } + } + this.MensagemForm = ""; + this.CPFValido = true; + return null; + } + +} diff --git a/src/app/dashboard/dashboard.component.html b/src/app/dashboard/dashboard.component.html new file mode 100644 index 0000000..dc7631a --- /dev/null +++ b/src/app/dashboard/dashboard.component.html @@ -0,0 +1,79 @@ +
+ + +
+
+ + + + + +
+ +
+ Painel + Zendion, INC. +
+
+ +
+
+ account_circle + {{UserName || 'Usuário'}} +
+ + +
+
+ + + + + +
+ +
+ +
+ +
+ +
\ No newline at end of file diff --git a/src/app/dashboard/dashboard.component.scss b/src/app/dashboard/dashboard.component.scss new file mode 100644 index 0000000..ee84ae1 --- /dev/null +++ b/src/app/dashboard/dashboard.component.scss @@ -0,0 +1,385 @@ +.dashboard-layout { + min-height: 100vh; + background: + radial-gradient(circle at top left, rgba(7, 27, 99, 0.08), transparent 34%), + linear-gradient(135deg, #f4f6fb 0%, #eef3ff 50%, #ffffff 100%); + color: #0f172a; +} + +/* ========================= + HEADER +========================= */ + +.dashboard-header { + position: fixed; + top: 0; + left: 0; + right: 0; + height: 74px; + z-index: 1000; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 24px; + background: rgba(7, 27, 99, 0.95); + border-bottom: 1px solid rgba(255, 255, 255, 0.12); + box-shadow: 0 14px 38px rgba(15, 23, 42, 0.22); + backdrop-filter: blur(14px); + box-sizing: border-box; +} + +.header-left, +.header-right { + display: flex; + align-items: center; +} + +.header-left { + gap: 18px; +} + +.header-right { + gap: 12px; +} + +.brand-link { + display: inline-flex; + align-items: center; + text-decoration: none; +} + +.logo { + object-fit: contain; + display: block; +} + +.logo-escrito { + height: 44px; +} + +.logo-favicon { + display: none; + height: 40px; +} + +.header-divider { + width: 1px; + height: 34px; + background: rgba(255, 255, 255, 0.18); +} + +.header-title { + display: flex; + flex-direction: column; + line-height: 1.15; +} + +.header-title span { + color: #bfdbfe; + font-size: 12px; + font-weight: 800; + letter-spacing: 0.12em; + text-transform: uppercase; +} + +.header-title strong { + color: #ffffff; + font-size: 15px; + font-weight: 900; +} + +.user-pill { + min-height: 38px; + display: inline-flex; + align-items: center; + gap: 8px; + padding: 0 14px; + border-radius: 999px; + background: rgba(255, 255, 255, 0.10); + color: #ffffff; + border: 1px solid rgba(255, 255, 255, 0.16); +} + +.user-pill .material-icons { + font-size: 21px; +} + +.user-pill span { + font-size: 13px; + font-weight: 800; + max-width: 160px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.logout-btn { + min-height: 38px; + display: inline-flex; + align-items: center; + gap: 8px; + padding: 0 14px; + border: none; + border-radius: 12px; + background: #ffffff; + color: #071b63; + font-size: 13px; + font-weight: 900; + cursor: pointer; + box-shadow: 0 10px 24px rgba(0, 0, 0, 0.16); + transition: transform 0.18s ease, box-shadow 0.18s ease, background-color 0.18s ease; +} + +.logout-btn .material-icons { + font-size: 20px; +} + +.logout-btn:hover { + transform: translateY(-1px); + background: #f8fafc; + box-shadow: 0 14px 28px rgba(0, 0, 0, 0.20); +} + +/* ========================= + SIDEBAR +========================= */ + +.dashboard-sidebar { + position: fixed; + top: 74px; + left: 0; + bottom: 0; + width: 270px; + z-index: 900; + padding: 22px 14px; + background: + radial-gradient(circle at top left, rgba(255, 255, 255, 0.10), transparent 34%), + linear-gradient(180deg, #071b63 0%, #04113f 100%); + border-right: 1px solid rgba(255, 255, 255, 0.10); + box-shadow: 14px 0 34px rgba(15, 23, 42, 0.12); + overflow-y: auto; + box-sizing: border-box; +} + +.sidebar-title { + padding: 0 12px 16px 12px; +} + +.sidebar-title span { + color: #bfdbfe; + font-size: 12px; + font-weight: 900; + letter-spacing: 0.14em; + text-transform: uppercase; +} + +.sidebar-nav { + display: grid; + gap: 8px; +} + +.menu-item { + width: 100%; +} + +.dropdown-btn { + width: 100%; + min-height: 46px; + padding: 0 12px; + border: none; + border-radius: 14px; + background: transparent; + color: #dbeafe; + display: flex; + align-items: center; + justify-content: space-between; + cursor: pointer; + text-align: left; + transition: background-color 0.18s ease, color 0.18s ease, transform 0.18s ease; +} + +.dropdown-btn:hover { + background: rgba(255, 255, 255, 0.10); + color: #ffffff; +} + +.menu-main { + display: inline-flex; + align-items: center; + gap: 12px; + min-width: 0; +} + +.menu-main span { + font-size: 14px; + font-weight: 800; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.menu-icon { + font-size: 22px; + color: #bfdbfe; + flex: 0 0 auto; +} + +.dropdown-icon { + font-size: 22px; + color: #bfdbfe; + flex: 0 0 auto; +} + +.dropdown-container { + display: block; + margin: 6px 0 10px 0; + padding: 6px; + border-radius: 16px; + background: rgba(2, 6, 23, 0.22); + border: 1px solid rgba(255, 255, 255, 0.08); +} + +.submenu-item { + min-height: 40px; + padding: 0 10px; + display: flex; + align-items: center; + gap: 10px; + border-radius: 12px; + color: #cbd5e1; + text-decoration: none; + transition: background-color 0.18s ease, color 0.18s ease, transform 0.18s ease; +} + +.submenu-item span { + font-size: 13px; + font-weight: 750; +} + +.submenu-icon { + font-size: 19px; + color: #93c5fd; +} + +.submenu-item:hover, +.active-submenu { + background: rgba(255, 255, 255, 0.12); + color: #ffffff; + text-decoration: none; +} + +.submenu-item:hover { + transform: translateX(2px); +} + +/* ========================= + CONTENT +========================= */ + +.dashboard-main { + min-height: 100vh; + padding-top: 74px; + box-sizing: border-box; +} + +.dashboard-main.with-sidebar { + padding-left: 270px; +} + +.dashboard-main.without-sidebar { + padding-left: 0; +} + +.dashboard-content-card { + min-height: calc(100vh - 74px); + padding: 28px; + box-sizing: border-box; +} + +/* ========================= + RESPONSIVE +========================= */ + +@media (max-width: 900px) { + .dashboard-sidebar { + width: 230px; + } + + .dashboard-main.with-sidebar { + padding-left: 230px; + } + + .header-title { + display: none; + } +} + +@media (max-width: 768px) { + .dashboard-header { + height: 68px; + padding: 0 14px; + } + + .dashboard-sidebar { + position: relative; + top: 68px; + width: 100%; + height: auto; + min-height: auto; + padding: 12px; + display: block; + border-right: none; + border-bottom: 1px solid rgba(255, 255, 255, 0.12); + } + + .dashboard-main, + .dashboard-main.with-sidebar, + .dashboard-main.without-sidebar { + padding-left: 0; + padding-top: 68px; + } + + .dashboard-main.with-sidebar { + padding-top: 68px; + } + + .dashboard-content-card { + padding: 18px 14px; + } + + .logo-escrito { + display: none; + } + + .logo-favicon { + display: block; + } + + .user-pill { + display: none; + } + + .logout-btn span { + display: none; + } + + .logout-btn { + width: 40px; + padding: 0; + justify-content: center; + } +} + +@media (max-width: 480px) { + .dashboard-content-card { + padding: 14px 10px; + } + + .dropdown-btn { + min-height: 44px; + } + + .menu-main span { + font-size: 13px; + } +} \ No newline at end of file diff --git a/src/app/dashboard/dashboard.component.ts b/src/app/dashboard/dashboard.component.ts new file mode 100644 index 0000000..cca6f56 --- /dev/null +++ b/src/app/dashboard/dashboard.component.ts @@ -0,0 +1,272 @@ +import { Component, OnInit } from '@angular/core'; +import { MenuItem } from '../models/dashboardModel'; +import { Router } from '@angular/router'; +import { FuncoesGlobais } from 'src/environments/environment'; + +@Component({ + selector: 'app-dashboard', + templateUrl: './dashboard.component.html', + styleUrls: ['./dashboard.component.scss'] +}) +export class DashboardComponent implements OnInit { + + BotoesMenuLateral: MenuItem[]; + UserName: string = localStorage.getItem("UserName") || ""; + + constructor( + private router: Router, + private FuncoesGlobais: FuncoesGlobais, + ) { } + + ngOnInit() { + if (localStorage.getItem("Role") == "1") { + this.PreencherMenuItensAdmin(); + } + else if (localStorage.getItem("Role") == "2") { + this.PreencherMenuItensCliente(); + } + else { + this.router.navigate(['/login']); + } + + } + + PreencherMenuItensAdmin() { + this.BotoesMenuLateral = [ + { + index: 0, + texto: "Página inicial", + link: "dashboard/admin/home", + havesub: false, + dropicon: "arrow_drop_down", + icon: "home", + issub: false, + sub: null, + }, + { + index: 1, + texto: "Usuários", + link: "", + havesub: true, + dropicon: "arrow_drop_down", + icon: "person", + issub: false, + sub: [ + { + index: 0, + texto: "Cadastrar", + link: "usuarios/cadastro", + icon: "person_add", + havesub: false, + dropicon: "", + issub: true, + sub: null, + }, + { + index: 1, + texto: "Visualizar", + link: "usuarios/visualizar", + icon: "pageview", + havesub: false, + dropicon: "", + issub: true, + sub: null, + }, + ], + }, + { + index: 2, + texto: "Sistemas", + link: "", + havesub: true, + dropicon: "arrow_drop_down", + icon: "extension", + issub: false, + sub: [ + { + index: 0, + texto: "Cadastro", + link: "sistemas/cadastro", + icon: "add_to_queue", + havesub: false, + dropicon: "", + issub: true, + sub: null, + }, + { + index: 1, + texto: "Visualizar", + link: "sistemas/visualizar", + icon: "pageview", + havesub: null, + dropicon: "", + issub: true, + sub: null, + }, + ], + }, + { + index: 3, + texto: "Ambiente cliente", + link: "/dashboard/cliente", + havesub: false, + dropicon: "arrow_drop_down", + icon: "home", + issub: false, + sub: null, + }, + { + index: 4, + texto: "Bingo", + link: "", + havesub: true, + dropicon: "arrow_drop_down", + icon: "extension", + issub: false, + sub: [ + { + index: 0, + texto: "Dashboard", + link: "/bingo/dashboard", + icon: "add_to_queue", + havesub: false, + dropicon: "", + issub: true, + sub: null, + }, + { + index: 1, + texto: "Sorteio", + link: "/bingo/sorteio", + icon: "pageview", + havesub: null, + dropicon: "", + issub: true, + sub: null, + }, + ], + }, + { + index: 5, + texto: "OrionTard Pro", + link: "/orion-dashboard", + havesub: false, + dropicon: "arrow_drop_down", + icon: "home", + issub: false, + sub: null, + }, + { + index: 6, + texto: "AgroBase", + link: "", + havesub: true, + dropicon: "arrow_drop_down", + icon: "agriculture", + issub: false, + sub: [ + { + index: 0, + texto: "Versionamento", + link: "/agrobase/versionamento", + icon: "update", + havesub: false, + dropicon: "", + issub: true, + sub: null, + }, + ], + }, + ]; + this.CriaEventoClickSubItens(); + } + + PreencherMenuItensCliente() { + this.BotoesMenuLateral = [ + /*{ + index: 0, + texto: "Página inicial", + link: "/home", + havesub: false, + dropicon: "arrow_drop_down", + icon: "home", + issub: false, + sub: null, + }, + { + index: 1, + texto: "Meus Sistemas", + link: "/dashboard/cliente", + havesub: false, + dropicon: "arrow_drop_down", + icon: "extension", + issub: false, + sub: [ + { + index: 0, + texto: "Machining Price Simulator", + link: "sistemas/MPS", + icon: "assessment", + havesub: false, + dropicon: "", + issub: true, + sub: null, + }, + { + index: 1, + texto: "Casco-Tubo", + link: "sistemas/Casco-Tubo", + icon: "assessment", + havesub: false, + dropicon: "", + issub: true, + sub: null, + }, + ], + },*/ + ]; + this.CriaEventoClickSubItens(); + } + + CriaEventoClickSubItens() { + setTimeout(() => { + var dropdown = document.getElementsByClassName("dropdown-btn"); + for (let i = 0; i < dropdown.length; i++) { + if (this.BotoesMenuLateral[i].havesub) { + dropdown[i].addEventListener("click", function() { + this.classList.toggle("active"); + var dropdownContent = this.nextElementSibling; + if (dropdownContent.style.display === "block") { + dropdownContent.style.display = "none"; + } else { + dropdownContent.style.display = "block"; + } + }); + } + } + }, 100); + } + + DropMenuItem(indexBtnMenu) { + if (this.BotoesMenuLateral[indexBtnMenu].havesub) { + if (this.BotoesMenuLateral[indexBtnMenu].dropicon == "arrow_drop_down") + this.BotoesMenuLateral[indexBtnMenu].dropicon = "arrow_drop_up"; + else + this.BotoesMenuLateral[indexBtnMenu].dropicon = "arrow_drop_down"; + } + else { + this.router.navigate([this.BotoesMenuLateral[indexBtnMenu].link]); + } + } + + Sair() { + localStorage.removeItem("Session"); + localStorage.removeItem("UserName"); + localStorage.removeItem("UserID"); + localStorage.removeItem("Role"); + localStorage.removeItem("LastRouteBeforeLogin"); + + this.router.navigate(['/home']); + } + +} diff --git a/src/app/detalhes-sistema/detalhes-sistema.component.html b/src/app/detalhes-sistema/detalhes-sistema.component.html new file mode 100644 index 0000000..8542844 --- /dev/null +++ b/src/app/detalhes-sistema/detalhes-sistema.component.html @@ -0,0 +1,197 @@ +
+ + +
+ Carregando +

Carregando detalhes do sistema...

+
+ + +
+ + +
+
+ +
+
+ Ícone do sistema +
+ +
+ Sistema Zendion + +

{{ Sistema.nome }}

+ +

{{ Sistema.descricao }}

+ +
+ {{ Sistema.tiposdesistema }} + {{ Sistema.tiposlicenca }} + {{ Sistema.plataforma }} +
+
+ +
+ Versão atual + {{ Sistema.versaoatual }} + + + +

+ {{ Sistema.plataforma }} • {{ Sistema.versaoatual }} +

+
+
+
+ + +
+
+ Versão + {{ Sistema.versaoatual }} +
+ +
+ Lançamento + {{ Sistema.insert_date | date:'dd/MM/yyyy' }} +
+ +
+ Categoria + {{ Sistema.tiposdesistema }} +
+ +
+ Licença + {{ Sistema.tiposlicenca }} +
+
+ + +
+
+ Detalhes +

Conheça melhor o sistema

+

Recursos, telas e informações importantes sobre esta solução.

+
+ +
+ +
+
+
+ +
+ Detalhe do sistema +
+
+
+ + +
+ +
+ Disponível para + + Plataforma + + {{ Sistema.plataforma }} +
+ +
+ Notas de atualização + + + Atualizado em {{ Sistema.update_date | date:'dd/MM/yyyy' }} + + +
+
+ +
+ + +
+
+
+ Histórico +

Versões anteriores

+
+
+ +
    +
  • +
    + {{ versao.split('versoes/')[1].split('/')[0] }} + {{ versao.split('¬')[1] | date:'dd/MM/yyyy HH:mm' }} +
    + + + Baixar + +
  • +
+
+ + +
+
+
+ Arquivos +

Materiais para download

+
+
+ +
    +
  • +
    + {{ download.split('downloads/')[1].split('¬')[0] }} + {{ download.split('¬')[1] | date:'dd/MM/yyyy HH:mm' }} +
    + + + Abrir + +
  • +
+
+ + +
+
+ Pronto para continuar? +

{{ Sistema.nome }}

+

{{ Sistema.plataforma }} • {{ Sistema.versaoatual }}

+
+ + +
+ +
+ + +
+ × + +
+
+ +
\ No newline at end of file diff --git a/src/app/detalhes-sistema/detalhes-sistema.component.scss b/src/app/detalhes-sistema/detalhes-sistema.component.scss new file mode 100644 index 0000000..7815689 --- /dev/null +++ b/src/app/detalhes-sistema/detalhes-sistema.component.scss @@ -0,0 +1,628 @@ +.details-page { + min-height: 100vh; + background: + radial-gradient(circle at top left, rgba(7, 27, 99, 0.14), transparent 32%), + linear-gradient(135deg, #f4f6fb 0%, #eef3ff 45%, #ffffff 100%); + color: #0f172a; +} + +.details-loader { + min-height: 360px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +.loader { + width: 72px; + height: 72px; + object-fit: contain; + margin-bottom: 16px; +} + +.details-loader p { + color: #64748b; + font-size: 15px; + font-weight: 700; +} + +.details-wrapper { + width: 100%; + max-width: 1180px; + margin: 0 auto; + padding: 44px 22px 64px 22px; + box-sizing: border-box; +} + +/* HERO */ + +.system-hero { + position: relative; + overflow: hidden; + border-radius: 28px; + background: + radial-gradient(circle at top right, rgba(255,255,255,0.14), transparent 34%), + linear-gradient(145deg, #071b63, #12358f); + box-shadow: 0 24px 70px rgba(15, 23, 42, 0.18); + color: #ffffff; +} + +.system-hero-glow { + position: absolute; + width: 360px; + height: 360px; + right: -130px; + top: -130px; + border-radius: 999px; + background: rgba(255,255,255,0.12); +} + +.system-hero-content { + position: relative; + z-index: 1; + display: grid; + grid-template-columns: auto 1fr 260px; + align-items: center; + gap: 30px; + padding: 42px; +} + +.system-icon-card { + width: 126px; + height: 126px; + border-radius: 28px; + background: #ffffff; + display: flex; + align-items: center; + justify-content: center; + box-shadow: 0 18px 42px rgba(0, 0, 0, 0.18); +} + +.system-icon { + width: 82px; + height: 82px; + object-fit: contain; +} + +.eyebrow { + display: inline-block; + margin-bottom: 12px; + color: #bfdbfe; + font-size: 12px; + font-weight: 800; + letter-spacing: 0.14em; + text-transform: uppercase; +} + +.system-hero-text h1 { + margin: 0 0 14px 0; + font-size: 42px; + line-height: 50px; + font-weight: 900; + letter-spacing: -0.045em; +} + +.system-hero-text p { + max-width: 600px; + margin: 0; + color: #dbeafe; + font-size: 16px; + line-height: 27px; +} + +.system-badges { + display: flex; + flex-wrap: wrap; + gap: 10px; + margin-top: 22px; +} + +.system-badges span { + padding: 8px 12px; + border-radius: 999px; + background: rgba(255,255,255,0.12); + color: #ffffff; + font-size: 12px; + font-weight: 800; +} + +.system-action-card { + padding: 22px; + border-radius: 22px; + background: rgba(255,255,255,0.12); + border: 1px solid rgba(255,255,255,0.18); + backdrop-filter: blur(10px); +} + +.system-action-card small { + display: block; + color: #bfdbfe; + font-size: 12px; + font-weight: 800; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.system-action-card strong { + display: block; + margin: 8px 0 18px 0; + color: #ffffff; + font-size: 24px; + font-weight: 900; +} + +.system-action-card p { + margin: 14px 0 0 0; + color: #dbeafe; + font-size: 12px; + line-height: 18px; +} + +.btn-main-action { + width: 100%; + min-height: 48px; + border: none; + border-radius: 14px; + background: #ffffff; + color: #071b63; + font-size: 15px; + font-weight: 900; + cursor: pointer; + box-shadow: 0 14px 26px rgba(0,0,0,0.16); + transition: transform 0.18s ease, box-shadow 0.18s ease; +} + +.btn-main-action:hover { + transform: translateY(-1px); + box-shadow: 0 18px 34px rgba(0,0,0,0.20); +} + +/* INFO */ + +.info-grid { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 16px; + margin-top: 24px; +} + +.info-card { + padding: 20px; + border-radius: 20px; + background: #ffffff; + box-shadow: 0 16px 36px rgba(15, 23, 42, 0.08); + border: 1px solid rgba(148, 163, 184, 0.22); +} + +.info-card span { + display: block; + margin-bottom: 8px; + color: #64748b; + font-size: 12px; + font-weight: 800; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.info-card strong { + display: block; + color: #0f172a; + font-size: 17px; + line-height: 24px; + font-weight: 900; +} + +/* SECTION HEADER */ + +.section-header { + text-align: center; + margin: 54px 0 34px 0; +} + +.section-header .eyebrow { + color: #071b63; +} + +.section-header h2 { + margin: 0 0 10px 0; + color: #0f172a; + font-size: 34px; + line-height: 42px; + font-weight: 900; + letter-spacing: -0.035em; +} + +.section-header p { + max-width: 620px; + margin: 0 auto; + color: #64748b; + font-size: 16px; + line-height: 26px; +} + +/* DETAILS CARDS */ + +.details-sections { + margin-top: 12px; +} + +.detail-card { + display: grid; + grid-template-columns: 1fr 1fr; + overflow: hidden; + margin-bottom: 26px; + border-radius: 24px; + background: #ffffff; + box-shadow: 0 18px 45px rgba(15, 23, 42, 0.10); + border: 1px solid rgba(148, 163, 184, 0.22); +} + +.detail-card.reverse .detail-text { + order: 2; +} + +.detail-card.reverse .detail-image-wrapper { + order: 1; +} + +.detail-text { + padding: 38px; + display: flex; + align-items: center; + color: #475569; + font-size: 16px; + line-height: 27px; +} + +.detail-text h1, +.detail-text h2, +.detail-text h3, +.detail-text h4 { + color: #0f172a; + font-weight: 900; + letter-spacing: -0.025em; +} + +.detail-text p:last-child { + margin-bottom: 0; +} + +.detail-image-wrapper { + min-height: 340px; + background: #e5e7eb; +} + +.detail-image { + width: 100%; + height: 100%; + min-height: 340px; + object-fit: cover; + display: block; + cursor: zoom-in; + transition: transform 0.22s ease; +} + +.detail-image:hover { + transform: scale(1.025); +} + +/* SECONDARY PANELS */ + +.secondary-grid { + display: grid; + grid-template-columns: 0.75fr 1.25fr; + gap: 22px; + margin-top: 42px; +} + +.panel-card { + border-radius: 24px; + background: #ffffff; + box-shadow: 0 18px 45px rgba(15, 23, 42, 0.10); + border: 1px solid rgba(148, 163, 184, 0.22); +} + +.availability-section { + padding: 30px; + display: flex; + flex-direction: column; + align-items: center; + text-align: center; +} + +.panel-label { + display: block; + margin-bottom: 14px; + color: #071b63; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.10em; +} + +.platform-icon { + width: 54px; + height: 54px; + object-fit: contain; + margin: 8px 0 16px 0; +} + +.availability-section strong { + color: #0f172a; + font-size: 18px; + font-weight: 900; +} + +.update-notes { + padding: 30px; +} + +.update-notes small { + display: block; + color: #64748b; + font-size: 13px; + margin-bottom: 14px; +} + +.update-text { + color: #475569; + font-size: 15px; + line-height: 25px; + padding: 18px; + border-radius: 16px; + background: #f8fafc; + border: 1px solid #e5e7eb; +} + +/* LISTS */ + +.list-panel { + margin-top: 24px; + padding: 30px; +} + +.list-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 18px; +} + +.list-header h3 { + margin: 0; + color: #0f172a; + font-size: 24px; + line-height: 32px; + font-weight: 900; +} + +.resource-list { + list-style: none; + margin: 0; + padding: 0; + display: grid; + gap: 12px; +} + +.resource-list li { + display: flex; + justify-content: space-between; + gap: 18px; + align-items: center; + padding: 16px; + border-radius: 16px; + background: #f8fafc; + border: 1px solid #e5e7eb; +} + +.resource-list strong { + display: block; + color: #0f172a; + font-size: 14px; + line-height: 21px; + font-weight: 900; + word-break: break-word; +} + +.resource-list small { + display: block; + margin-top: 4px; + color: #64748b; + font-size: 12px; +} + +.resource-list a { + flex: 0 0 auto; + padding: 10px 14px; + border-radius: 12px; + background: #071b63; + color: #ffffff; + font-size: 13px; + font-weight: 900; + text-decoration: none; +} + +.resource-list a:hover { + background: #12358f; +} + +/* FINAL CTA */ + +.final-cta { + margin-top: 34px; + padding: 32px; + border-radius: 24px; + display: grid; + grid-template-columns: 1fr 220px; + align-items: center; + gap: 24px; + background: + radial-gradient(circle at top right, rgba(255,255,255,0.14), transparent 34%), + linear-gradient(145deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 22px 55px rgba(15, 23, 42, 0.16); +} + +.final-cta h2 { + margin: 0 0 8px 0; + color: #ffffff; + font-size: 28px; + line-height: 36px; + font-weight: 900; +} + +.final-cta p { + margin: 0; + color: #dbeafe; + font-size: 14px; +} + +.final-cta .btn-main-action { + background: #ffffff; + color: #071b63; +} + +/* MODAL */ + +.image-modal { + display: none; + position: fixed; + z-index: 9999; + inset: 0; + overflow: auto; + background-color: rgba(2, 6, 23, 0.92); + padding: 56px 18px; + box-sizing: border-box; +} + +.modal-content { + margin: auto; + display: block; + width: auto; + max-width: 92%; + max-height: 82vh; + border-radius: 16px; + box-shadow: 0 24px 70px rgba(0,0,0,0.45); +} + +#caption { + margin: 16px auto 0 auto; + width: 80%; + max-width: 760px; + text-align: center; + color: #cbd5e1; + font-size: 14px; + line-height: 22px; +} + +.close { + position: fixed; + top: 18px; + right: 30px; + color: #ffffff; + font-size: 42px; + font-weight: 900; + cursor: pointer; + z-index: 10000; +} + +.close:hover { + color: #cbd5e1; +} + +/* RESPONSIVE */ + +@media (max-width: 980px) { + .system-hero-content { + grid-template-columns: auto 1fr; + } + + .system-action-card { + grid-column: 1 / -1; + } + + .info-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .detail-card { + grid-template-columns: 1fr; + } + + .detail-card.reverse .detail-text, + .detail-card.reverse .detail-image-wrapper { + order: unset; + } + + .secondary-grid { + grid-template-columns: 1fr; + } + + .final-cta { + grid-template-columns: 1fr; + } +} + +@media (max-width: 620px) { + .details-wrapper { + padding: 28px 14px 46px 14px; + } + + .system-hero-content { + grid-template-columns: 1fr; + padding: 28px; + text-align: center; + } + + .system-icon-card { + margin: 0 auto; + } + + .system-hero-text h1 { + font-size: 32px; + line-height: 40px; + } + + .system-badges { + justify-content: center; + } + + .info-grid { + grid-template-columns: 1fr; + } + + .section-header h2 { + font-size: 28px; + line-height: 36px; + } + + .detail-text { + padding: 26px; + } + + .detail-image, + .detail-image-wrapper { + min-height: 240px; + } + + .resource-list li { + align-items: flex-start; + flex-direction: column; + } + + .resource-list a { + width: 100%; + text-align: center; + } + + .final-cta { + padding: 26px; + text-align: center; + } + + .modal-content { + width: 100%; + max-width: 100%; + } +} \ No newline at end of file diff --git a/src/app/detalhes-sistema/detalhes-sistema.component.ts b/src/app/detalhes-sistema/detalhes-sistema.component.ts new file mode 100644 index 0000000..3e12197 --- /dev/null +++ b/src/app/detalhes-sistema/detalhes-sistema.component.ts @@ -0,0 +1,202 @@ +import { Component, OnInit } from '@angular/core'; +import { Sistemas, Download, SistemasDetalhes, SistemasLista } from '../models/sistemasModel'; +import { SistemasService } from '../services/sistemas.service'; +import { UsuariosService } from '../services/usuarios.service'; +import { ActivatedRoute, Router } from '@angular/router'; +import { environment } from 'src/environments/environment'; + +@Component({ + selector: 'app-detalhes-sistema', + templateUrl: './detalhes-sistema.component.html', + styleUrls: ['./detalhes-sistema.component.scss'] +}) +export class DetalhesSistemaComponent implements OnInit { + + Sistema: SistemasLista = new SistemasLista(); + + idsistemas: number = parseInt(this.route.snapshot.params['idsistemas']); + idusuarios: number = parseInt(localStorage.getItem("UserID") || "0"); + + FormDownload: Download = new Download(); + + Logado: boolean = false; + Adiquirido: boolean = false; + + btnBaixar: string = "Adquirir"; + + Detalhes: SistemasDetalhes[] = []; + + LinkProjeto: string = environment.LinkProjeto; + + Carregado: boolean = false; + + x86: boolean = false; + x64: boolean = true; + + constructor( + private sistemasService: SistemasService, + private usuariosService: UsuariosService, + private route: ActivatedRoute, + private router: Router + ) { } + + ngOnInit() { + this.FormDownload.idsistemas = this.idsistemas; + this.FormDownload.idusuarios = this.idusuarios; + + this.sistemasService.getSistemaByIDLista(this.idsistemas).then(resSistema => { + this.Sistema = resSistema; + + if (!this.Sistema.versoes) { + this.Sistema.versoes = []; + } + + if (!this.Sistema.mdownloads) { + this.Sistema.mdownloads = []; + } + + this.CarregarVersoesEDownloads(); + }) + .catch(error => { + console.error('[DetalhesSistema] Erro ao carregar sistema:', error); + this.Carregado = true; + }); + } + + CarregarVersoesEDownloads() { + this.sistemasService.getSistemaVersoes(this.idsistemas).then(resVersoes => { + this.Sistema.versoes = []; + + if (resVersoes) { + resVersoes.forEach(versao => { + this.Sistema.versoes.push(versao.replace("/var/www/html", this.LinkProjeto)); + }); + } + + this.CarregarDownloads(); + }) + .catch(error => { + this.CarregarDownloads(); + }); + } + + CarregarDownloads() { + this.sistemasService.getSistemaDownloads(this.idsistemas).then(resDownloads => { + this.Sistema.mdownloads = []; + + if (resDownloads) { + resDownloads.forEach(download => { + this.Sistema.mdownloads.push(download.replace("/var/www/html", this.LinkProjeto)); + }); + } + + this.CarregaDetalhesSistema(); + }) + .catch(error => { + this.CarregaDetalhesSistema(); + }); + } + + CarregaDetalhesSistema() { + if (localStorage.getItem("Session") == "1") { + this.Logado = true; + + this.usuariosService.getSistemasDoUsuario(this.idusuarios).then(resSistemas => { + if (resSistemas) { + resSistemas.forEach(sistema => { + if (sistema.idsistemas == this.Sistema.idsistemas) { + this.Adiquirido = true; + this.btnBaixar = (this.Sistema.idtiposdesistema == 6) ? "Acessar" : "Baixar"; + } + }); + } + + this.CarregarDetalhes(); + }) + .catch(error => { + this.CarregarDetalhes(); + }); + + return; + } + + this.CarregarDetalhes(); + } + + CarregarDetalhes() { + this.sistemasService.getDetalhesByIDEn(this.idsistemas).then(resDetalhes => { + this.Detalhes = resDetalhes || []; + this.Carregado = true; + }) + .catch(error => { + console.error('[DetalhesSistema] Erro ao carregar detalhes:', error); + this.Detalhes = []; + this.Carregado = true; + }); + } + + btnBaixarClick() { + if (localStorage.getItem("Session") == "1") { + this.Baixar(); + return; + } + + localStorage.setItem("LastRouteBeforeLogin", "/detalhes/" + this.idsistemas); + this.router.navigate(['/criarconta']); + } + + Baixar() { + if (this.btnBaixar == "Adquirir") { + this.sistemasService.downloadSistema(this.FormDownload).then(resDownload => { + this.sistemasService.insertSistemaUsuario(this.FormDownload).then(resInsertSistema => { + if (this.Sistema.idplataformas == 6) { + this.btnBaixar = "Acessar"; + } else { + this.btnBaixar = "Baixar"; + } + + this.Adiquirido = true; + alert("Acesso liberado! Clique em " + this.btnBaixar + " para continuar."); + }); + }); + + return; + } + + if (this.btnBaixar == "Acessar") { + window.open(this.Sistema.nome_install, '_blank'); + return; + } + + if (this.btnBaixar == "Baixar") { + window.open( + environment.LinkProjeto + "/sistemas/" + this.idsistemas + "/versoes/" + this.Sistema.versaoatual + "/" + this.Sistema.nome_install, + '_blank' + ); + } + } + + ImageClick(event) { + const modal = document.getElementById("myModal"); + const modalImg = document.getElementById("img01") as HTMLImageElement; + const captionText = document.getElementById("caption"); + + const target = event.target as HTMLImageElement; + + if (!modal || !modalImg || !captionText || !target) { + return; + } + + modal.style.display = "block"; + modalImg.src = target.currentSrc || target.src; + captionText.innerHTML = target.alt || ""; + } + + btnFecharModal() { + const modal = document.getElementById("myModal"); + + if (modal) { + modal.style.display = "none"; + } + } +} \ No newline at end of file diff --git a/src/app/easy-ava/easy-ava.component.html b/src/app/easy-ava/easy-ava.component.html new file mode 100644 index 0000000..154f271 --- /dev/null +++ b/src/app/easy-ava/easy-ava.component.html @@ -0,0 +1,12 @@ +
+

EasyAVA

+ +
+

+

+ A resposta correta é: {{Resposta}} + +

+ + +
\ No newline at end of file diff --git a/src/app/easy-ava/easy-ava.component.scss b/src/app/easy-ava/easy-ava.component.scss new file mode 100644 index 0000000..c2fed74 --- /dev/null +++ b/src/app/easy-ava/easy-ava.component.scss @@ -0,0 +1,6 @@ +.Corpo { + text-align: center; + margin: auto; + color: #fff; + margin-top: 2em; +} \ No newline at end of file diff --git a/src/app/easy-ava/easy-ava.component.ts b/src/app/easy-ava/easy-ava.component.ts new file mode 100644 index 0000000..25bf800 --- /dev/null +++ b/src/app/easy-ava/easy-ava.component.ts @@ -0,0 +1,28 @@ +import { Component, OnInit } from '@angular/core'; +import { EasyAVAService } from '../services/easy-ava.service'; + +@Component({ + selector: 'app-easy-ava', + templateUrl: './easy-ava.component.html', + styleUrls: ['./easy-ava.component.scss'] +}) +export class EasyAVAComponent implements OnInit { + + Questao: string = ""; + Resposta: string = ""; + + constructor( + private easyAvaService: EasyAVAService + ) { } + + ngOnInit() { + + } + + Procurar() { + this.easyAvaService.ProcurarResposta().then(resResposta => { + console.log(resResposta); + }) + } + +} diff --git a/src/app/edit-home/edit-home.component.html b/src/app/edit-home/edit-home.component.html new file mode 100644 index 0000000..d97bb26 --- /dev/null +++ b/src/app/edit-home/edit-home.component.html @@ -0,0 +1,273 @@ +
+ + +
+
+ Backoffice +

Painel administrativo

+

+ Gerencie as configurações principais da página inicial, identidade visual, + endereços do projeto, slider e conteúdo público. +

+
+
+ + +
+
+
+ Configurações +

Cabeçalho e endereços

+
+
+ +
+ + +
+
+
+ title +
+ +
+

Título do site

+

Nome exibido nas configurações principais da aplicação.

+
+
+ +
+ + + +
+
+ + +
+
+
+ public +
+ +
+

URL do projeto

+

Endereço público utilizado pelo site para montar links e recursos.

+
+
+ +
+ + + + + +
+
+ + +
+
+
+ api +
+ +
+

URL da API

+

Endereço usado pelo frontend para se comunicar com o servidor.

+
+
+ +
+ + + + + +
+
+ +
+
+ + +
+
+
+ Identidade visual +

Arquivos do site

+
+
+ +
+ + +
+
+ Logo +
+ +
+

Logo escrita

+

Arquivo principal exibido no cabeçalho e rodapé do site.

+ + + + +
+
+ + +
+
+ Favicon +
+ +
+

Favicon

+

Ícone exibido na aba do navegador.

+ + + + +
+
+ + +
+
+ Background +
+ +
+

Background

+

Imagem de fundo usada no site.

+ + + + +
+
+ +
+
+ + +
+ +
+
+ collections +
+ +
+ Slider +

Slides da página inicial

+

Cadastre, edite e visualize os banners exibidos na home.

+
+ +
+ + + +
+
+ +
+
+ article +
+ +
+ Conteúdo +

Notícias da página inicial

+

Gerencie os conteúdos publicados na área de notícias do site.

+
+ +
+ + + +
+
+ +
+ +
\ No newline at end of file diff --git a/src/app/edit-home/edit-home.component.scss b/src/app/edit-home/edit-home.component.scss new file mode 100644 index 0000000..3c2599f --- /dev/null +++ b/src/app/edit-home/edit-home.component.scss @@ -0,0 +1,363 @@ +.edit-home-page { + min-height: calc(100vh - 74px); + color: #0f172a; +} + +/* HERO */ + +.admin-hero { + margin-bottom: 22px; + padding: 32px; + border-radius: 24px; + background: + radial-gradient(circle at top right, rgba(255, 255, 255, 0.14), transparent 34%), + linear-gradient(145deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 22px 55px rgba(15, 23, 42, 0.16); +} + +.eyebrow { + display: inline-block; + margin-bottom: 10px; + color: #071b63; + font-size: 12px; + font-weight: 900; + letter-spacing: 0.14em; + text-transform: uppercase; +} + +.admin-hero .eyebrow { + color: #bfdbfe; +} + +.admin-hero h1 { + margin: 0 0 10px 0; + color: #ffffff; + font-size: 34px; + line-height: 42px; + font-weight: 900; + letter-spacing: -0.04em; +} + +.admin-hero p { + max-width: 760px; + margin: 0; + color: #dbeafe; + font-size: 15px; + line-height: 25px; +} + +/* BASE CARDS */ + +.admin-card { + margin-bottom: 22px; + padding: 28px; + border-radius: 24px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 18px 45px rgba(15, 23, 42, 0.10); +} + +.panel-header { + display: flex; + justify-content: space-between; + gap: 18px; + margin-bottom: 24px; +} + +.panel-header h2, +.shortcut-card h2 { + margin: 0; + color: #0f172a; + font-size: 26px; + line-height: 34px; + font-weight: 900; + letter-spacing: -0.035em; +} + +/* BUTTONS */ + +.btn-main, +.btn-secondary { + min-height: 44px; + border: none; + border-radius: 12px; + padding: 0 18px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + font-size: 13px; + font-weight: 900; + cursor: pointer; + transition: transform 0.18s ease, box-shadow 0.18s ease, opacity 0.18s ease; +} + +.btn-main { + background: linear-gradient(135deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 12px 24px rgba(7, 27, 99, 0.20); +} + +.btn-secondary { + background: #f1f5f9; + color: #334155; +} + +.btn-main:hover:not(:disabled), +.btn-secondary:hover:not(:disabled) { + transform: translateY(-1px); +} + +.btn-main:disabled, +.btn-secondary:disabled { + opacity: 0.55; + cursor: not-allowed; + box-shadow: none; +} + +/* SETTINGS */ + +.settings-grid { + display: grid; + gap: 18px; +} + +.setting-card { + display: grid; + grid-template-columns: 1fr 420px; + gap: 22px; + align-items: center; + padding: 20px; + border-radius: 20px; + background: #f8fafc; + border: 1px solid #e5e7eb; +} + +.setting-info { + display: flex; + align-items: flex-start; + gap: 14px; +} + +.setting-icon { + width: 46px; + height: 46px; + flex: 0 0 auto; + border-radius: 16px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.setting-icon .material-icons { + font-size: 24px; +} + +.setting-info h3, +.asset-body h3 { + margin: 0 0 6px 0; + color: #0f172a; + font-size: 18px; + line-height: 25px; + font-weight: 900; +} + +.setting-info p, +.asset-body p, +.shortcut-card p { + margin: 0; + color: #64748b; + font-size: 14px; + line-height: 23px; +} + +.setting-control { + display: grid; + gap: 10px; +} + +.form-control { + width: 100%; + height: 46px; + padding: 0 14px; + border-radius: 12px; + border: 1px solid #d7deea; + background: #ffffff; + color: #0f172a; + font-size: 15px; + outline: none; + transition: border-color 0.18s ease, box-shadow 0.18s ease; + box-sizing: border-box; +} + +.form-control:focus { + border-color: #071b63; + box-shadow: 0 0 0 4px rgba(7, 27, 99, 0.10); +} + +.confirm-check { + display: flex; + align-items: center; + gap: 8px; + color: #64748b; + font-size: 13px; + font-weight: 800; + cursor: pointer; +} + +.confirm-check input { + width: 18px; + height: 18px; +} + +/* ASSETS */ + +.assets-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 18px; +} + +.asset-card { + overflow: hidden; + border-radius: 22px; + background: #f8fafc; + border: 1px solid #e5e7eb; +} + +.asset-preview { + height: 150px; + display: flex; + align-items: center; + justify-content: center; + background: + radial-gradient(circle at top right, rgba(7, 27, 99, 0.12), transparent 34%), + #ffffff; + border-bottom: 1px solid #e5e7eb; +} + +.asset-preview img { + max-width: 76%; + max-height: 90px; + object-fit: contain; +} + +.favicon-preview img { + max-width: 64px; + max-height: 64px; +} + +.background-preview img { + width: 100%; + height: 100%; + max-width: 100%; + max-height: 100%; + object-fit: cover; +} + +.asset-body { + padding: 20px; +} + +.file-label { + min-height: 42px; + margin-top: 16px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 0 14px; + border-radius: 12px; + background: #f1f5ff; + color: #071b63; + font-size: 13px; + font-weight: 900; + cursor: pointer; + border: 1px solid #dbe6ff; +} + +.file-label input { + display: none; +} + +.file-label .material-icons { + font-size: 20px; +} + +.asset-btn { + width: 100%; + margin-top: 14px; +} + +/* SHORTCUTS */ + +.shortcut-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 22px; +} + +.shortcut-card { + display: grid; + gap: 16px; +} + +.shortcut-icon { + width: 54px; + height: 54px; + border-radius: 18px; + background: #f1f5ff; + color: #071b63; + display: flex; + align-items: center; + justify-content: center; +} + +.shortcut-icon .material-icons { + font-size: 28px; +} + +.shortcut-actions { + display: flex; + flex-wrap: wrap; + gap: 10px; +} + +/* RESPONSIVE */ + +@media (max-width: 1100px) { + .setting-card { + grid-template-columns: 1fr; + } + + .assets-grid { + grid-template-columns: 1fr; + } +} + +@media (max-width: 760px) { + .admin-hero, + .admin-card { + padding: 22px; + } + + .admin-hero h1 { + font-size: 28px; + line-height: 36px; + } + + .shortcut-grid { + grid-template-columns: 1fr; + } + + .shortcut-actions { + flex-direction: column; + } + + .shortcut-actions button { + width: 100%; + } +} \ No newline at end of file diff --git a/src/app/edit-home/edit-home.component.ts b/src/app/edit-home/edit-home.component.ts new file mode 100644 index 0000000..151e065 --- /dev/null +++ b/src/app/edit-home/edit-home.component.ts @@ -0,0 +1,173 @@ +import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import { environment, FuncoesGlobais } from 'src/environments/environment'; +import { GeralService } from '../services/geral.service'; + +@Component({ + selector: 'app-edit-home', + templateUrl: './edit-home.component.html', + styleUrls: ['./edit-home.component.scss', './../app.component.scss'] +}) +export class EditHomeComponent implements OnInit { + + LinkProjeto: string = environment.LinkProjeto; + + Logo: File = null; + Favicon: File = null; + Background: File = null; + + CaminhoLogo: string = environment.LinkProjeto + "/assets/logo_escrito.png"; + CaminhoFavicon: string = "/favicon.ico"; + CaminhoBackground: string = "/assets/background.jpg"; + + TituloAnterior: string = ""; + Titulo: string = ""; + + APIUrl: string = ""; + APIUrlAnterior: string = ""; + APIUrlCheck: boolean = false; + + ProjetoUrl: string = ""; + ProjetoUrlAnterior: string = ""; + ProjetoUrlCheck: boolean = false; + + StringConfig: string = ""; + + constructor( + private router: Router, + private geralService: GeralService, + private funcoesGlobais: FuncoesGlobais, + ) { } + + ngOnInit() { + this.funcoesGlobais.CheckAdminRoute(); + + this.geralService.readEnderecos().then(resGeral => { + this.StringConfig = resGeral || ""; + + const partes = this.StringConfig.split(';'); + + this.ProjetoUrlAnterior = partes[0].split('=')[1] || ""; + this.ProjetoUrl = this.ProjetoUrlAnterior; + + this.APIUrlAnterior = partes[1].split('=')[1] || ""; + this.APIUrl = this.APIUrlAnterior; + + this.TituloAnterior = partes[2].split('=')[1] || ""; + this.Titulo = this.TituloAnterior; + }); + } + + Visualizar(Janela: string) { + this.router.navigate(['/dashboard/admin/' + Janela + '/visualizar']); + } + + Cadastrar(Janela: string) { + this.router.navigate(['/dashboard/admin/' + Janela]); + } + + onFileChangedLogo(event) { + this.CarregarPreviewArquivo(event, 'logo'); + } + + onFileChangedFavicon(event) { + this.CarregarPreviewArquivo(event, 'favicon'); + } + + onFileChangedBackground(event) { + this.CarregarPreviewArquivo(event, 'background'); + } + + CarregarPreviewArquivo(event, tipo: string) { + if (event.target.files && event.target.files[0]) { + const arquivo = event.target.files[0]; + + if (tipo === 'logo') { + this.Logo = arquivo; + } + + if (tipo === 'favicon') { + this.Favicon = arquivo; + } + + if (tipo === 'background') { + this.Background = arquivo; + } + + const reader = new FileReader(); + reader.readAsDataURL(arquivo); + + reader.onload = (event) => { + const result = event.target['result'].toString(); + + if (tipo === 'logo') { + this.CaminhoLogo = result; + } + + if (tipo === 'favicon') { + this.CaminhoFavicon = result; + } + + if (tipo === 'background') { + this.CaminhoBackground = result; + } + }; + } + } + + CopiarArquivos(Nome: string, Arquivo: File, Caminho: string) { + if (!Arquivo) { + alert("Selecione um arquivo antes de salvar."); + return; + } + + const req = new XMLHttpRequest(); + const formData = new FormData(); + + formData.append("nome", Nome); + formData.append("arquivo", Arquivo); + formData.append("caminho", Caminho); + + req.open("POST", environment.ApiUrl + "/arquivos/copy"); + req.send(formData); + + req.onreadystatechange = () => { + if (req.readyState === 4) { + alert(Nome + " alterado com sucesso!"); + + if (Nome === 'logo_escrito.png') { + this.Logo = null; + } + + if (Nome === 'favicon.ico') { + this.Favicon = null; + } + + if (Nome === 'background.jpg') { + this.Background = null; + } + } + }; + } + + Editar(Item: string) { + this.StringConfig = `Dominio=${this.ProjetoUrl};API=${this.APIUrl};Título=${this.Titulo}`; + + const form = { + content: this.StringConfig + }; + + this.geralService.writeEnderecos(form).then(resEdit => { + if (resEdit == true) { + alert(Item + " alterado com sucesso!"); + + this.ProjetoUrlAnterior = this.ProjetoUrl; + this.APIUrlAnterior = this.APIUrl; + this.TituloAnterior = this.Titulo; + + this.ProjetoUrlCheck = false; + this.APIUrlCheck = false; + } + }); + } +} \ No newline at end of file diff --git a/src/app/home/home.component.html b/src/app/home/home.component.html new file mode 100644 index 0000000..21a6408 --- /dev/null +++ b/src/app/home/home.component.html @@ -0,0 +1,121 @@ +
+ + +
+
+ +
+
+ Zendion, INC. + +

+ Soluções digitais para negócios mais inteligentes. +

+ +

+ Sistemas, automações e tecnologia sob medida para simplificar processos, + conectar informações e impulsionar operações. +

+ + +
+ +
+ +
+
+ Slide Zendion +
+
+ +
+
+
+
+
+
+
+ + +
+
+ Nossas soluções + +

Sistemas

+ +

+ Conheça os sistemas disponíveis na plataforma Zendion. +

+
+ +
+
+
+ Ícone do sistema +
+ +

{{ Sistema.nome }}

+ +

{{ Sistema.descricao }}

+ + +
+
+
+ + +
+
+ Atualizações + +

Notícias

+ +

+ Acompanhe novidades, comunicados e informações da Zendion. +

+
+ +
+
+ +
+ Imagem da notícia +
+ +
+ Notícia + +

{{ Noticia.titulo }}

+ +
+
+
+
+
+ +
\ No newline at end of file diff --git a/src/app/home/home.component.scss b/src/app/home/home.component.scss new file mode 100644 index 0000000..cb0179b --- /dev/null +++ b/src/app/home/home.component.scss @@ -0,0 +1,478 @@ +.home-page { + min-height: 100vh; + background: + radial-gradient(circle at top left, rgba(7, 27, 99, 0.18), transparent 30%), + linear-gradient(135deg, #f4f6fb 0%, #eef3ff 45%, #ffffff 100%); + color: #0f172a; +} + +/* ========================= + HERO +========================= */ + +.hero-section { + position: relative; + overflow: hidden; + padding: 64px 22px 52px 22px; +} + +.hero-background-glow { + position: absolute; + width: 420px; + height: 420px; + right: -140px; + top: -140px; + border-radius: 999px; + background: rgba(7, 27, 99, 0.16); + filter: blur(8px); +} + +.hero-content { + position: relative; + z-index: 1; + width: 100%; + max-width: 1180px; + margin: 0 auto; + display: grid; + grid-template-columns: 0.9fr 1.1fr; + align-items: center; + gap: 42px; +} + +.hero-text { + padding: 18px 0; +} + +.eyebrow { + display: inline-block; + margin-bottom: 12px; + color: #071b63; + font-size: 12px; + font-weight: 800; + letter-spacing: 0.14em; + text-transform: uppercase; +} + +.hero-text h1 { + margin: 0 0 18px 0; + max-width: 520px; + color: #0f172a; + font-size: 48px; + line-height: 58px; + font-weight: 900; + letter-spacing: -0.045em; +} + +.hero-text p { + margin: 0; + max-width: 520px; + color: #475569; + font-size: 17px; + line-height: 29px; +} + +.hero-actions { + display: flex; + flex-wrap: wrap; + gap: 14px; + margin-top: 30px; +} + +.btn-hero-primary, +.btn-hero-secondary { + display: inline-flex; + align-items: center; + justify-content: center; + min-height: 46px; + padding: 0 22px; + border-radius: 12px; + font-size: 14px; + font-weight: 800; + text-decoration: none; + transition: transform 0.18s ease, box-shadow 0.18s ease, background-color 0.18s ease; +} + +.btn-hero-primary { + background: linear-gradient(135deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 14px 28px rgba(7, 27, 99, 0.24); +} + +.btn-hero-secondary { + background: #ffffff; + color: #071b63; + border: 1px solid #d7deea; +} + +.btn-hero-primary:hover, +.btn-hero-secondary:hover { + transform: translateY(-1px); + text-decoration: none; +} + +.hero-slider-card { + position: relative; + background: #ffffff; + border-radius: 24px; + padding: 14px; + box-shadow: 0 24px 70px rgba(15, 23, 42, 0.16); + border: 1px solid rgba(148, 163, 184, 0.22); + overflow: hidden; +} + +.hero-swiper { + width: 100%; + height: 430px; + border-radius: 18px; + overflow: hidden; + display: block; +} + +.slider-image { + width: 100%; + height: 100%; + object-fit: cover; + display: block; +} + +/* Swiper buttons */ +:host ::ng-deep .swiper-button-next, +:host ::ng-deep .swiper-button-prev { + color: #ffffff; + width: 42px; + height: 42px; + border-radius: 999px; + background: rgba(7, 27, 99, 0.78); + backdrop-filter: blur(6px); +} + +:host ::ng-deep .swiper-button-next::after, +:host ::ng-deep .swiper-button-prev::after { + font-size: 16px; + font-weight: 800; +} + +:host ::ng-deep .swiper-pagination-bullet { + background: #ffffff; + opacity: 0.65; +} + +:host ::ng-deep .swiper-pagination-bullet-active { + background: #071b63; + opacity: 1; +} + +/* ========================= + SECTIONS +========================= */ + +.systems-section, +.news-section { + width: 100%; + max-width: 1180px; + margin: 0 auto; + padding: 48px 22px; +} + +.section-header { + text-align: center; + margin-bottom: 34px; +} + +.section-header h2 { + margin: 0 0 10px 0; + color: #0f172a; + font-size: 34px; + line-height: 42px; + font-weight: 900; + letter-spacing: -0.035em; +} + +.section-header p { + margin: 0 auto; + max-width: 620px; + color: #64748b; + font-size: 16px; + line-height: 26px; +} + +/* ========================= + SISTEMAS +========================= */ + +.systems-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 22px; +} + +.system-card { + position: relative; + overflow: hidden; + min-height: 310px; + display: flex; + flex-direction: column; + align-items: flex-start; + padding: 28px; + border-radius: 22px; + background: #ffffff; + box-shadow: 0 18px 45px rgba(15, 23, 42, 0.10); + border: 1px solid rgba(148, 163, 184, 0.22); + transition: transform 0.18s ease, box-shadow 0.18s ease, border-color 0.18s ease; +} + +.system-card::before { + content: ""; + position: absolute; + width: 180px; + height: 180px; + right: -80px; + top: -80px; + border-radius: 999px; + background: rgba(7, 27, 99, 0.08); +} + +.system-card:hover { + transform: translateY(-4px); + box-shadow: 0 24px 60px rgba(15, 23, 42, 0.16); + border-color: rgba(7, 27, 99, 0.22); +} + +.system-icon-wrapper { + width: 74px; + height: 74px; + display: flex; + align-items: center; + justify-content: center; + margin-bottom: 22px; + border-radius: 18px; + background: #f1f5ff; + border: 1px solid #dbe6ff; +} + +.system-icon { + width: 48px; + height: 48px; + object-fit: contain; +} + +.system-card h3 { + margin: 0 0 12px 0; + color: #0f172a; + font-size: 21px; + line-height: 28px; + font-weight: 850; +} + +.system-card p { + flex: 1; + margin: 0 0 24px 0; + color: #64748b; + font-size: 14px; + line-height: 23px; +} + +.system-btn { + width: 100%; + min-height: 44px; + border: none; + border-radius: 12px; + background: linear-gradient(135deg, #071b63, #12358f); + color: #ffffff; + font-size: 14px; + font-weight: 800; + cursor: pointer; + box-shadow: 0 12px 24px rgba(7, 27, 99, 0.20); + transition: transform 0.18s ease, box-shadow 0.18s ease; +} + +.system-btn:hover { + transform: translateY(-1px); + box-shadow: 0 16px 30px rgba(7, 27, 99, 0.26); +} + +/* ========================= + NOTÍCIAS +========================= */ + +.news-list { + display: grid; + gap: 28px; +} + +.news-card { + display: grid; + grid-template-columns: 0.92fr 1.08fr; + align-items: stretch; + gap: 0; + overflow: hidden; + border-radius: 24px; + background: #ffffff; + box-shadow: 0 18px 45px rgba(15, 23, 42, 0.10); + border: 1px solid rgba(148, 163, 184, 0.22); +} + +.news-card.reverse { + grid-template-columns: 1.08fr 0.92fr; +} + +.news-card.reverse .news-image-wrapper { + order: 2; +} + +.news-card.reverse .news-content { + order: 1; +} + +.news-image-wrapper { + min-height: 320px; + background: #e5e7eb; +} + +.news-image { + width: 100%; + height: 100%; + min-height: 320px; + object-fit: cover; + display: block; +} + +.news-content { + padding: 36px; + display: flex; + flex-direction: column; + justify-content: center; +} + +.news-label { + display: inline-block; + width: fit-content; + margin-bottom: 14px; + padding: 7px 11px; + border-radius: 999px; + background: #f1f5ff; + color: #071b63; + font-size: 12px; + line-height: 16px; + font-weight: 800; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.news-content h3 { + margin: 0 0 16px 0; + color: #0f172a; + font-size: 28px; + line-height: 36px; + font-weight: 900; + letter-spacing: -0.035em; +} + +.news-description { + color: #475569; + font-size: 15px; + line-height: 25px; +} + +.news-description p { + margin-top: 0; +} + +.news-description p:last-child { + margin-bottom: 0; +} + +/* ========================= + RESPONSIVO +========================= */ + +@media (max-width: 980px) { + .hero-content { + grid-template-columns: 1fr; + } + + .hero-text { + text-align: center; + } + + .hero-text h1, + .hero-text p { + margin-left: auto; + margin-right: auto; + } + + .hero-actions { + justify-content: center; + } + + .systems-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .news-card, + .news-card.reverse { + grid-template-columns: 1fr; + } + + .news-card.reverse .news-image-wrapper, + .news-card.reverse .news-content { + order: unset; + } +} + +@media (max-width: 680px) { + .hero-section { + padding: 42px 14px 34px 14px; + } + + .hero-text h1 { + font-size: 34px; + line-height: 42px; + } + + .hero-text p { + font-size: 15px; + line-height: 25px; + } + + .hero-swiper { + height: 280px; + } + + .systems-section, + .news-section { + padding: 38px 14px; + } + + .systems-grid { + grid-template-columns: 1fr; + } + + .section-header h2 { + font-size: 28px; + line-height: 36px; + } + + .news-content { + padding: 26px; + } + + .news-content h3 { + font-size: 24px; + line-height: 32px; + } + + .news-image, + .news-image-wrapper { + min-height: 230px; + } + + .hero-actions { + flex-direction: column; + } + + .btn-hero-primary, + .btn-hero-secondary { + width: 100%; + } +} \ No newline at end of file diff --git a/src/app/home/home.component.ts b/src/app/home/home.component.ts new file mode 100644 index 0000000..aaca710 --- /dev/null +++ b/src/app/home/home.component.ts @@ -0,0 +1,67 @@ +import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import { Sistemas } from '../models/sistemasModel'; +import { SistemasService } from '../services/sistemas.service'; +import { environment } from 'src/environments/environment'; +import { Slides } from '../models/sliderModel'; +import { SliderService } from '../services/slider.service'; +import { Noticias } from '../models/noticiasModel'; +import { NoticiasService } from '../services/noticias.service'; +import { SwiperOptions } from 'swiper'; + +@Component({ + selector: 'app-home', + templateUrl: './home.component.html', + styleUrls: ['./home.component.scss'] +}) +export class HomeComponent implements OnInit { + + config: SwiperOptions = { + pagination: { + el: '.swiper-pagination', + clickable: true + }, + navigation: { + nextEl: '.swiper-button-next', + prevEl: '.swiper-button-prev' + }, + spaceBetween: 24, + loop: true, + speed: 700, + autoplay: { + delay: 8000, + disableOnInteraction: false + } + }; + + ListaDeSlides: Slides[] = []; + ListaDeSistemas: Sistemas[] = []; + ListaDeNoticias: Noticias[] = []; + + LinkProjeto: string = environment.LinkProjeto; + + constructor( + private sistemasService: SistemasService, + private router: Router, + private sliderService: SliderService, + private noticiasService: NoticiasService + ) { } + + ngOnInit() { + this.sliderService.getSlidesEn().then(resSlides => { + this.ListaDeSlides = resSlides || []; + }); + + this.sistemasService.getSistemasEn().then(resSistemas => { + this.ListaDeSistemas = resSistemas || []; + }); + + this.noticiasService.getNoticiasEn().then(resNoticias => { + this.ListaDeNoticias = resNoticias || []; + }); + } + + AbrirDetalhesSistema(Sistema: Sistemas) { + this.router.navigate(['/detalhes/' + Sistema.idsistemas]); + } +} \ No newline at end of file diff --git a/src/app/login/login.component.html b/src/app/login/login.component.html new file mode 100644 index 0000000..e0074b9 --- /dev/null +++ b/src/app/login/login.component.html @@ -0,0 +1,160 @@ + \ No newline at end of file diff --git a/src/app/login/login.component.scss b/src/app/login/login.component.scss new file mode 100644 index 0000000..99e0dee --- /dev/null +++ b/src/app/login/login.component.scss @@ -0,0 +1,337 @@ +.login-page { + min-height: calc(100vh - 80px); + display: flex; + align-items: center; + justify-content: center; + padding: 48px 18px; + background: + radial-gradient(circle at top left, rgba(7, 27, 99, 0.14), transparent 34%), + linear-gradient(135deg, #f4f6fb 0%, #eef3ff 45%, #ffffff 100%); +} + +.login-shell { + width: 100%; + max-width: 980px; + display: grid; + grid-template-columns: 0.95fr 1.05fr; + background: #ffffff; + border-radius: 24px; + overflow: hidden; + box-shadow: 0 24px 70px rgba(15, 23, 42, 0.16); + border: 1px solid rgba(148, 163, 184, 0.22); +} + +.login-brand-panel { + position: relative; + min-height: 560px; + display: flex; + align-items: flex-end; + padding: 42px; + background: + linear-gradient(145deg, rgba(7, 27, 99, 0.96), rgba(18, 47, 132, 0.94)); + color: #ffffff; + overflow: hidden; +} + +.login-brand-panel::before { + content: ""; + position: absolute; + width: 340px; + height: 340px; + right: -120px; + top: -100px; + border-radius: 999px; + background: rgba(255, 255, 255, 0.12); +} + +.login-brand-panel::after { + content: ""; + position: absolute; + width: 220px; + height: 220px; + left: -80px; + bottom: -70px; + border-radius: 999px; + background: rgba(255, 255, 255, 0.08); +} + +.brand-content { + position: relative; + z-index: 1; +} + +.brand-logo { + height: 54px; + max-width: 240px; + object-fit: contain; + display: block; + margin-bottom: 34px; + filter: brightness(0) invert(1); +} + +.brand-content h1 { + margin: 0 0 14px 0; + font-size: 34px; + line-height: 42px; + font-weight: 800; + letter-spacing: -0.03em; +} + +.brand-content p { + max-width: 390px; + margin: 0; + color: #dbeafe; + font-size: 16px; + line-height: 27px; +} + +.brand-badges { + display: flex; + flex-wrap: wrap; + gap: 10px; + margin-top: 28px; +} + +.brand-badges span { + display: inline-flex; + align-items: center; + padding: 8px 12px; + border-radius: 999px; + background: rgba(255, 255, 255, 0.13); + color: #ffffff; + font-size: 12px; + font-weight: 700; + backdrop-filter: blur(8px); +} + +.login-card { + display: flex; + flex-direction: column; + justify-content: center; + padding: 44px 48px; +} + +.login-header { + margin-bottom: 28px; +} + +.eyebrow { + display: inline-block; + margin-bottom: 10px; + color: #071b63; + font-size: 12px; + font-weight: 800; + letter-spacing: 0.12em; + text-transform: uppercase; +} + +.login-header h2 { + margin: 0 0 10px 0; + color: #0f172a; + font-size: 30px; + line-height: 38px; + font-weight: 800; + letter-spacing: -0.03em; +} + +.login-header p { + margin: 0; + color: #64748b; + font-size: 15px; + line-height: 24px; +} + +.login-body { + width: 100%; +} + +.login-form { + display: grid; + gap: 16px; +} + +.form-group { + text-align: left; +} + +.form-group label { + display: block; + margin-bottom: 7px; + color: #1e293b; + font-size: 14px; + font-weight: 700; +} + +.form-control { + width: 100%; + height: 46px; + padding: 0 14px; + border-radius: 12px; + border: 1px solid #d7deea; + background: #ffffff; + color: #0f172a; + font-size: 15px; + outline: none; + transition: border-color 0.2s ease, box-shadow 0.2s ease, background-color 0.2s ease; + box-sizing: border-box; +} + +.form-control::placeholder { + color: #94a3b8; +} + +.form-control:focus { + border-color: #071b63; + box-shadow: 0 0 0 4px rgba(7, 27, 99, 0.10); + background-color: #ffffff; +} + +.field-hint { + display: block; + margin-top: 2px; + color: #64748b; + font-size: 12px; + line-height: 18px; + text-align: left; +} + +.btn-login { + width: 100%; + height: 48px; + margin-top: 22px; + border: none; + border-radius: 12px; + background: linear-gradient(135deg, #071b63, #12358f); + color: #ffffff; + font-size: 15px; + font-weight: 800; + cursor: pointer; + box-shadow: 0 12px 24px rgba(7, 27, 99, 0.22); + transition: transform 0.18s ease, box-shadow 0.18s ease, opacity 0.18s ease; +} + +.btn-login:hover:not(:disabled) { + transform: translateY(-1px); + box-shadow: 0 16px 30px rgba(7, 27, 99, 0.28); +} + +.btn-login:active:not(:disabled) { + transform: translateY(0); +} + +.btn-login:disabled { + opacity: 0.55; + cursor: not-allowed; + box-shadow: none; +} + +.login-footer { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 10px 16px; + margin-top: 26px; + padding-top: 22px; + border-top: 1px solid #e5e7eb; +} + +.login-footer a { + color: #071b63; + font-size: 14px; + font-weight: 700; + text-decoration: none; +} + +.login-footer a:hover { + text-decoration: underline; +} + +.login-message { + margin-top: 18px; + padding: 12px 14px; + border-radius: 12px; + background: #fef2f2; + border: 1px solid #fecaca; + text-align: left; +} + +.login-message small { + display: block; + color: #b91c1c; + font-size: 13px; + line-height: 20px; + font-weight: 600; +} + +/* Estados de erro herdados do seu TS */ +.Danger { + border-color: #ef4444 !important; + background-color: #fff7f7; +} + +.Danger:focus { + border-color: #ef4444 !important; + box-shadow: 0 0 0 4px rgba(239, 68, 68, 0.12); +} + +.Normal { + border-color: #d7deea; +} + +@media (max-width: 860px) { + .login-shell { + grid-template-columns: 1fr; + max-width: 560px; + } + + .login-brand-panel { + min-height: auto; + padding: 30px; + align-items: flex-start; + } + + .brand-logo { + height: 44px; + margin-bottom: 22px; + } + + .brand-content h1 { + font-size: 28px; + line-height: 36px; + } + + .login-card { + padding: 34px 26px; + } +} + +@media (max-width: 480px) { + .login-page { + padding: 22px 12px; + } + + .login-shell { + border-radius: 18px; + } + + .login-brand-panel { + padding: 24px; + } + + .brand-badges { + display: none; + } + + .login-card { + padding: 28px 20px; + } + + .login-header h2 { + font-size: 25px; + line-height: 32px; + } + + .login-footer { + grid-template-columns: 1fr; + text-align: center; + } +} \ No newline at end of file diff --git a/src/app/login/login.component.ts b/src/app/login/login.component.ts new file mode 100644 index 0000000..cd8d60e --- /dev/null +++ b/src/app/login/login.component.ts @@ -0,0 +1,359 @@ +import { Component, OnInit } from '@angular/core'; +import { UsuariosService } from '../services/usuarios.service'; +import { Login, Usuarios, Email, RecuperarSenha } from '../models/usuariosModel'; +import { Router, ActivatedRoute } from '@angular/router'; +import { Modos } from '../models/variaveisModel'; +import { environment } from 'src/environments/environment'; + +@Component({ + selector: 'app-login', + templateUrl: './login.component.html', + styleUrls: ['./login.component.scss'] +}) +export class LoginComponent implements OnInit { + + LoginModel: Login = new Login; + LoginError = false; + MenssagemForm: string; + BotaoText: string; + TituloJanela: string; + JanelaModo: Modos = new Modos(); + ListaDeUsuarios: Usuarios[]; + FormEmail: Email = new Email(); + FormTrocaSenha: RecuperarSenha = new RecuperarSenha(); + DesabilitaBotao: boolean = false; + ListaTrocaSenha: RecuperarSenha[]; + LinkProjeto: string = environment.LinkProjeto; + + constructor( + private usuariosSerive: UsuariosService, + private router: Router, + private route: ActivatedRoute, + ) { } + + ngOnInit() { + if (this.router.url.includes('esqueci')) { + this.usuariosSerive.getUsuarios().then(resUsuarios => { + this.ListaDeUsuarios = resUsuarios; + }) + this.usuariosSerive.getTrocasenha().then(resTrocasenha => { + this.ListaTrocaSenha = resTrocasenha; + }) + this.BotaoText = "Enviar e-mail"; + this.TituloJanela = "Esqueci a senha"; + this.JanelaModo.Cadastro = true; + } + else if (this.router.url.includes('trocar')) { + this.usuariosSerive.getTrocasenhaByTag(this.route.snapshot.params['tag']).then(resTag => { + if (resTag.length > 0) { + this.FormTrocaSenha = resTag[0]; + this.usuariosSerive.setExpirado(resTag[0]).then(resExpirado => { + console.log("certo"); + }) + } + else { + this.MenssagemForm = "Este link de redefinição de senha expirou"; + this.DesabilitaBotao = true; + } + }) + this.BotaoText = "Alterar senha"; + this.TituloJanela = "Digite a nova senha"; + this.JanelaModo.Editar = true; + } + else { + this.BotaoText = "Entrar"; + this.TituloJanela = "Login"; + this.JanelaModo.Visualizar = true; + } + } + + btnEntrarClick() { + if (this.BotaoText == "Voltar") { + this.router.navigate(['login']); + return; + } + if (this.JanelaModo.Visualizar) { // entrar + this.usuariosSerive.AuthUser(this.LoginModel).then(resLogin => { + if (resLogin['response'].length > 0) { + if (resLogin['response'][0]['habilitado'] == 0) { + this.MenssagemForm = "Usuário ainda não ativado! Acesse a caixa de entrada de seu e-mail e ative sua conta para entrar!"; + this.LoginError = true; + return; + } + localStorage.setItem("UserID", resLogin['response'][0]['idusuarios']); + localStorage.setItem("UserName", resLogin['response'][0]['nome']); + localStorage.setItem("Role", resLogin['response'][0]['idtiposdeusuario']); + localStorage.setItem("Session", "1"); + + if (localStorage.getItem("Role") == "1" || localStorage.getItem("Role") == "2") { + if (localStorage.getItem("LastRouteBeforeLogin")) { + this.router.navigate([localStorage.getItem("LastRouteBeforeLogin")]); + localStorage.removeItem("LastRouteBeforeLogin"); + } + else { + this.router.navigate(['dashboard/cliente']); + } + } + } + else { + this.MenssagemForm = "Usuário ou senha incorretos"; + this.LoginError = true; + } + }) + } + else if (this.JanelaModo.Cadastro) { // enviar email + let EmailCorreto = false; + let UsuarioCorreto = false; + let idusuariosU: number; + let idusuariosE: number; + let nomeUsuario: string; + for (let i = 0; i < this.ListaDeUsuarios.length; i++) { + if (this.LoginModel.email == this.ListaDeUsuarios[i].email) { + idusuariosU = this.ListaDeUsuarios[i].idusuarios; + EmailCorreto = true; + nomeUsuario = this.ListaDeUsuarios[i].nome; + } + if (this.LoginModel.usuario == this.ListaDeUsuarios[i].usuario) { + idusuariosE = this.ListaDeUsuarios[i].idusuarios; + UsuarioCorreto = true; + } + } + if (EmailCorreto && UsuarioCorreto && (idusuariosE == idusuariosU)) { + for (let i = 0; i < this.ListaTrocaSenha.length; i++) { + if (this.ListaTrocaSenha[i].idusuarios == idusuariosE) { + this.MenssagemForm = "Este usuário já tem um link de redefinição de senha pendente"; + this.BotaoText = "Voltar"; + return; + } + } + this.FormTrocaSenha.idusuarios = idusuariosE; + this.FormEmail.Para = this.LoginModel.email; + this.FormEmail.Assunto = "Redefinição de senha Zendion, Inc."; + this.FormEmail.Conteudo = this.MensagemEmail(nomeUsuario); + this.usuariosSerive.insertTrocasenha(this.FormTrocaSenha).then(resTrocasenha => { + if (resTrocasenha['status'] == 200) { + this.usuariosSerive.EnviarEmail(this.FormEmail).then(resEmail => { + if (resEmail != null && resEmail['sucesso'] == true) { + this.MenssagemForm = "Link de redefinição de senha enviado com sucesso!"; + this.BotaoText = "Voltar"; + } + else { + this.MenssagemForm = "Erro ao enviar e-mail"; + this.LoginError = true; + this.BotaoText = "Voltar"; + } + }) + } + else { + this.MenssagemForm = "Erro ao gerar link de redefinição de senha"; + this.LoginError = true; + this.BotaoText = "Voltar"; + } + }) + } + else { + this.LoginError = true; + if (!EmailCorreto) + this.MenssagemForm = "E-mail incorreto"; + if (!UsuarioCorreto) + this.MenssagemForm = "Usuário incorreto"; + if (!EmailCorreto && !UsuarioCorreto) + this.MenssagemForm = "Usuário e E-mail incorretos"; + if (idusuariosE != idusuariosU) + this.MenssagemForm = "Usuário ou E-mail incorreto"; + } + } + else if (this.JanelaModo.Editar) { // inserir nova senha + if (this.LoginModel.senha != this.LoginModel.novasenha) { + this.LoginError = true; + this.MenssagemForm = "As senhas digitadas não são iguais"; + return; + } + let formUsuario: Usuarios = new Usuarios(); + formUsuario.idusuarios = this.FormTrocaSenha.idusuarios; + formUsuario.senha = this.LoginModel.senha; + this.usuariosSerive.trocaSenha(formUsuario).then(resUpdate => { + if (resUpdate['status'] == 200) { + this.MenssagemForm = "Senha alterada com sucesso"; + } + else { + this.MenssagemForm = "Erro ao alterar senha"; + } + this.BotaoText = "Voltar"; + }) + } + } + + MensagemEmail(nomeUsuario: string) { + let Mensagem: string; + + const nome = nomeUsuario || 'usuário'; + + // Melhor que Math.random para token simples no frontend + const array = new Uint32Array(4); + window.crypto.getRandomValues(array); + + const Tag = Array.from(array) + .map(x => x.toString(16)) + .join(''); + + this.FormTrocaSenha.tag = Tag; + + const linkTrocaSenha = `${this.LinkProjeto}/login/trocar/${Tag}`; + + Mensagem = ` + + + + + + Redefinição de senha Zendion, INC. + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Zendion, INC. +
+

+ Redefinição de senha +

+
+

+ Olá, ${nome}! +

+ +

+ Recebemos uma solicitação para redefinir a senha da sua conta na Zendion, INC.. +

+ +

+ Para criar uma nova senha, clique no botão abaixo: +

+
+ + Redefinir minha senha + +
+ + + + +
+

+ Este link é válido por 24 horas. Após esse período, será necessário solicitar uma nova redefinição de senha. +

+
+
+

+ Se o botão não funcionar, copie e cole este link no navegador: +

+ +

+ + ${linkTrocaSenha} + +

+
+ + + + +
+

+ Se você não solicitou a redefinição de senha, ignore este e-mail. Sua senha atual continuará a mesma. +

+
+
+

+ Atenciosamente,
+ Equipe Zendion, INC. +

+
+

+ Zendion, INC. +

+ +

+ ${environment.telefoneContato}
+ ${environment.emailContato}
+ + ${this.LinkProjeto} + +

+
+ + + + + + +
+

+ Este é um e-mail automático. Por favor, não responda esta mensagem. +

+
+ +
+ + + + `; + + return Mensagem; + } + +} diff --git a/src/app/models/agrobaseModel.ts b/src/app/models/agrobaseModel.ts new file mode 100644 index 0000000..9eeea36 --- /dev/null +++ b/src/app/models/agrobaseModel.ts @@ -0,0 +1,27 @@ +export class AgrobaseVersionFileModel { + id: number; + Diretorio: string; + Arquivo: string; + Extensao: string; + Versao: string; + ArquivoDownload: string; + TipoArquivo: TiposArquivos; +} + +export enum TiposArquivos { + ModeloIA_StreetDetector = 0, + ModeloIA_WeedDetector = 1, + ParametrosModulo_ATU = 2, + ParametrosModulo_MVD = 3, + ParametrosModulo_SEN = 4, + ParametrosModulo_KNT = 5, + PinoutModulo_ATU = 6, + PinoutModulo_SEN = 7, + Script_StreetDetector = 8, + Script_WeedDetector = 9, + Script_GreenDetector = 10, + Script_MapLoad = 11, + Script_MapFollow = 12, + Script_GpsViewer = 13, + ArquivoModelo3D = 14, +} \ No newline at end of file diff --git a/src/app/models/bingoModel.ts b/src/app/models/bingoModel.ts new file mode 100644 index 0000000..29b8da0 --- /dev/null +++ b/src/app/models/bingoModel.ts @@ -0,0 +1,27 @@ +export class BingoSorteiosModel { + idbingosorteios: number = 0; + descricao: string = ""; + rodada: number = 1; + data_sorteio: string; + n_max: number = 75; + participantes_max: number = 0; + realizado: boolean = false; + Cartelas: BingoCartelasModel[]; + VerCartelas: boolean = false; +} + +export class BingoCartelasModel { + canhoto: number = 0; + idbingosorteios: number = 0; + numeros: string = ""; + nome: string = ""; + endereco: string = ""; + telefone: string = ""; + bingo: boolean = false; + cinquina1: boolean = false; + cinquina2: boolean = false; + cinquina3: boolean = false; + Valida: boolean = true; + Editando: boolean = false; + Acertos: number = 1; +} \ No newline at end of file diff --git a/src/app/models/dashboardModel.ts b/src/app/models/dashboardModel.ts new file mode 100644 index 0000000..4636c9b --- /dev/null +++ b/src/app/models/dashboardModel.ts @@ -0,0 +1,10 @@ +export class MenuItem { + index: number; + texto: string; + link: string; + havesub: boolean; + dropicon: string; + icon: string; + issub: boolean; + sub: MenuItem[]; +} \ No newline at end of file diff --git a/src/app/models/noticiasModel.ts b/src/app/models/noticiasModel.ts new file mode 100644 index 0000000..3d673c3 --- /dev/null +++ b/src/app/models/noticiasModel.ts @@ -0,0 +1,15 @@ +export class Noticias { + idnoticias: number; + titulo: string; + descricao: string; + habilitado: boolean; + link: string; +} + +export class NoticiasList { + idnoticias: number; + titulo: string; + descricao: string; + habilitado: string; + link: string; +} \ No newline at end of file diff --git a/src/app/models/orionModel.ts b/src/app/models/orionModel.ts new file mode 100644 index 0000000..b480922 --- /dev/null +++ b/src/app/models/orionModel.ts @@ -0,0 +1,92 @@ +export class OrionLogsModel { + dataLog: Date; + nome: string; + coordenadas: string; + perfil: string; + log: string; + logObj: OrionLogsDetalhesModel; +} + +export class OrionLogsDetalhesModel { + data: Date; + firmwareVersao: number; + robotNs: number; + modelo: string; + versao: string; + cpf: string; + usuario: string; + perfil: string; + camera: string; + servico: OrionLogServicoModel; + odometroTotal: number; + odometroConectado: number; + odometroMotores: number; + odometroMotoresParcial: number; + latitude: number; + longitude: number; + altitude: number; + tempoTotal: number; + tempoConectado: number; + sensores: OrionLogSensorModel[]; + portaCOM: string; + baudRate: number; + conectado: boolean; + distancia: number; + + HoraInicio: string; + HoraFim: string; + Duracao: string; + Coordenadas: string; + Localizacao: string; +} + +export class OrionLogServicoModel { + Nome: string; + Cidade: string; + Responsavel: string; + Servico: string; + Path: string; + DataCadastro: Date; +} + +export class OrionLogSensorModel { + sensor: number; + descricao: string; + minimo: number; + maximo: number; + media: number; + moda: number; + mediana: number; + lista: number[]; +} + +export class GeoCoordenadasResponseModel { + data: GeoCoordenadasModel[]; +} + +export class GeoCoordenadasModel { + latitude: number; + longitude: number; + type: string; + distance: number; + name: string; + number: string; + postal_code: string; + street: string; + confidence: number; + region: string; + region_code: string; + county: string; + lacality: string; + administrative_area: string; + neighborhood: string; + country: string; + country_code: string; + continent: string; + label: string; +} + +export class LogAgrupado { + key: string; + value: OrionLogsDetalhesModel[]; +} \ No newline at end of file diff --git a/src/app/models/produtosModel.ts b/src/app/models/produtosModel.ts new file mode 100644 index 0000000..3e43f1c --- /dev/null +++ b/src/app/models/produtosModel.ts @@ -0,0 +1,10 @@ +export class ProdutosModel { + idprodutos: number; + idsistemas: number; + idtiposlicenca: number; + valor: number; + ativado: boolean; + descricao: string; + vendas: number; + compensados: number; +} \ No newline at end of file diff --git a/src/app/models/sistemasModel.ts b/src/app/models/sistemasModel.ts new file mode 100644 index 0000000..5194ac6 --- /dev/null +++ b/src/app/models/sistemasModel.ts @@ -0,0 +1,90 @@ +export class Sistemas { + idsistemas: number; + nome: string; + descricao: string; + versaoatual: string; + habilitado: boolean; + downloads: number; + idtiposdesistema: number; + idplataformas: number; + nome_install: string; + notasdeatualizacao: string; + idtiposlicenca: number; + + insert_date: Date; +} + +export class SistemasLista { + idsistemas: number; + nome: string; + descricao: string; + versaoatual: string; + habilitado: boolean; + downloads: number; + idtiposdesistema: number; + tiposdesistema: string; + idplataformas: number; + plataforma: string; + nome_install: string; + notasdeatualizacao: string; + idtiposlicenca: number; + licenca: string; + custo: number; + versoes: string[]; + mdownloads: string[]; + + tiposlicenca: string; + insert_date: Date; + update_date: Date; +} + +export class TiposDeLicenca { + idtiposlicenca: number; + descricao: string; +} + + +export class TiposDeSistema { + idtiposdesistema: number; + descricao: string; +} + +export class Plataformas { + idplataformas: number; + descricao: string; +} + +export class Download { + idsistemas: number; + idusuarios: number; +} + +export class Chaves { + idchaves: number; + licenca: string; + data_criacao: Date; + data_validade: Date; + idusuarios: number; + usada: boolean; + idsistemas: number; +} + +export class ListChaves { + idchaves: number; + Chave: string; + DataCriacao: Date; + DataValidade: Date; + Status: string; + Ativada: string; +} + +export class SistemasDetalhes { + idsistemasdetalhes: number; + idsistemas: number; + descricao: string; + ordem: number; + habilitado: boolean; + imagem: string; + botao: string; + Arquivo: File; +} \ No newline at end of file diff --git a/src/app/models/sliderModel.ts b/src/app/models/sliderModel.ts new file mode 100644 index 0000000..4a293b5 --- /dev/null +++ b/src/app/models/sliderModel.ts @@ -0,0 +1,13 @@ +export class Slides { + idslides: number; + descricao: string; + habilitado: boolean; + link: string; +} + +export class SlidesList { + idslides: number; + descricao: string; + habilitado: string; + link: string; +} \ No newline at end of file diff --git a/src/app/models/usuariosModel.ts b/src/app/models/usuariosModel.ts new file mode 100644 index 0000000..c7f8e58 --- /dev/null +++ b/src/app/models/usuariosModel.ts @@ -0,0 +1,46 @@ +export class Usuarios { + idusuarios: number; + nome: string; + usuario: string; + senha: string; + data_cadastro: Date; + cpf: string; + habilitado: boolean; + email: string; + idtiposdeusuario: number; + } + +export class Login { + usuario: string; + senha: string; + email: string; + novasenha: string; +} + +export class TiposDeUsuario { + idtiposdeusuario: string; + descricao: string; +} + +export class Email { + Para: string; + Assunto: string; + Conteudo: string; +} + +export class SistemasDoUsuario { + idsistemas: number; + nome: string; + descricao: string; + data_download: Date; + idusuarios: number; + licensasValidas: number; + gratis: boolean; +} + +export class RecuperarSenha { + idtrocasenha: number; + idusuarios: number; + tag: string; + usada: boolean; +} \ No newline at end of file diff --git a/src/app/models/variaveisModel.ts b/src/app/models/variaveisModel.ts new file mode 100644 index 0000000..e7c2c76 --- /dev/null +++ b/src/app/models/variaveisModel.ts @@ -0,0 +1,10 @@ +export class Variaveis { + LinkAPI: string; + LinkProjeto: string; +} + +export class Modos { + Cadastro: boolean = false; + Editar: boolean = false; + Visualizar: boolean = false; +} \ No newline at end of file diff --git a/src/app/noticias/noticias.component.html b/src/app/noticias/noticias.component.html new file mode 100644 index 0000000..b226c17 --- /dev/null +++ b/src/app/noticias/noticias.component.html @@ -0,0 +1,237 @@ +
+ + +
+
+ Backoffice +

{{ TituloJanela }}

+

+ Gerencie as notícias exibidas na página inicial do site. +

+
+ +
+ +
+
+ + +
+ +
+
+ Conteúdo editorial +

{{ JanelaModo.Cadastro ? 'Cadastrar notícia' : 'Editar notícia' }}

+
+ + +
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + + + + + Recomendado: imagem horizontal em boa resolução, preferencialmente JPG. + +
+
+ +
+ Prévia da notícia + +
+
+ Prévia da notícia +
+ +
+ {{ FormNoticias.habilitado ? 'Publicada' : 'Oculta' }} + +

{{ FormNoticias.titulo || 'Título da notícia' }}

+ +
+
+
+
+
+ +
+ info + {{ MensagemForm }} +
+ +
+ + + +
+ +
+ + +
+ +
+
+
+ article +
+ +
+ Total de notícias + {{ ListaNoticias?.length || 0 }} +
+
+ +
+
+ visibility +
+ +
+ Habilitadas + {{ TotalHabilitadas }} +
+
+ +
+
+ visibility_off +
+ +
+ Desabilitadas + {{ TotalDesabilitadas }} +
+
+
+ +
+
+
+ Notícias +

Notícias cadastradas

+
+
+ +
+ +
+ +
+ Imagem da notícia +
+ +
+
+ #{{ Noticia.idnoticias }} + + + {{ Noticia.habilitado ? 'Habilitada' : 'Desabilitada' }} + +
+ +

{{ Noticia.titulo || 'Notícia sem título' }}

+ +
+ + + +
+ + + +
+
+ +
+ +
+ +
+
+ article +
+ +

Nenhuma notícia cadastrada

+ +

+ Cadastre a primeira notícia para exibir conteúdo na página inicial. +

+ + +
+
+ +
+ +
\ No newline at end of file diff --git a/src/app/noticias/noticias.component.scss b/src/app/noticias/noticias.component.scss new file mode 100644 index 0000000..0b948be --- /dev/null +++ b/src/app/noticias/noticias.component.scss @@ -0,0 +1,660 @@ +.news-admin-page { + min-height: calc(100vh - 74px); + color: #0f172a; +} + +/* HERO */ + +.admin-hero { + display: flex; + align-items: center; + justify-content: space-between; + gap: 22px; + margin-bottom: 22px; + padding: 32px; + border-radius: 24px; + background: + radial-gradient(circle at top right, rgba(255, 255, 255, 0.14), transparent 34%), + linear-gradient(145deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 22px 55px rgba(15, 23, 42, 0.16); +} + +.eyebrow { + display: inline-block; + margin-bottom: 10px; + color: #071b63; + font-size: 12px; + font-weight: 900; + letter-spacing: 0.14em; + text-transform: uppercase; +} + +.admin-hero .eyebrow { + color: #bfdbfe; +} + +.admin-hero h1 { + margin: 0 0 10px 0; + color: #ffffff; + font-size: 34px; + line-height: 42px; + font-weight: 900; + letter-spacing: -0.04em; +} + +.admin-hero p { + max-width: 760px; + margin: 0; + color: #dbeafe; + font-size: 15px; + line-height: 25px; +} + +/* CARDS */ + +.admin-card { + margin-bottom: 22px; + padding: 28px; + border-radius: 24px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 18px 45px rgba(15, 23, 42, 0.10); +} + +.panel-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 18px; + margin-bottom: 24px; +} + +.panel-header h2 { + margin: 0; + color: #0f172a; + font-size: 26px; + line-height: 34px; + font-weight: 900; + letter-spacing: -0.035em; +} + +/* BUTTONS */ + +.btn-main, +.btn-secondary, +.btn-card { + border: none; + cursor: pointer; + font-weight: 900; + transition: transform 0.18s ease, box-shadow 0.18s ease, background-color 0.18s ease, opacity 0.18s ease; +} + +.btn-main { + min-height: 44px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 0 18px; + border-radius: 12px; + background: #ffffff; + color: #071b63; + box-shadow: 0 12px 24px rgba(0, 0, 0, 0.16); +} + +.form-submit, +.empty-btn { + background: linear-gradient(135deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 12px 24px rgba(7, 27, 99, 0.20); +} + +.btn-main:hover, +.btn-secondary:hover, +.btn-card:hover { + transform: translateY(-1px); +} + +.btn-main .material-icons, +.btn-card .material-icons { + font-size: 19px; +} + +.btn-secondary { + min-height: 44px; + padding: 0 18px; + border-radius: 12px; + background: #f1f5f9; + color: #334155; +} + +/* FORM */ + +.form-panel { + margin-bottom: 22px; +} + +.form-grid { + display: grid; + grid-template-columns: 1fr; + gap: 18px; +} + +.form-group label { + display: block; + margin-bottom: 7px; + color: #1e293b; + font-size: 14px; + font-weight: 800; +} + +.form-control { + width: 100%; + height: 46px; + padding: 0 14px; + border-radius: 12px; + border: 1px solid #d7deea; + background: #ffffff; + color: #0f172a; + font-size: 15px; + outline: none; + transition: border-color 0.18s ease, box-shadow 0.18s ease; + box-sizing: border-box; +} + +.form-control:focus { + border-color: #071b63; + box-shadow: 0 0 0 4px rgba(7, 27, 99, 0.10); +} + +.textarea-control { + min-height: 250px; + padding: 14px; + resize: vertical; + line-height: 23px; +} + +.status-toggle { + cursor: pointer; + margin: 0; +} + +.status-toggle input { + display: none; +} + +.toggle-box { + min-height: 38px; + display: inline-flex; + align-items: center; + gap: 7px; + padding: 0 13px; + border-radius: 999px; + background: #f1f5ff; + color: #071b63; + font-size: 13px; + font-weight: 900; + border: 1px solid #dbe6ff; +} + +.toggle-box .material-icons { + font-size: 19px; +} + +.file-label { + min-height: 42px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 0 14px; + border-radius: 12px; + background: #f1f5ff; + color: #071b63; + font-size: 13px; + font-weight: 900; + cursor: pointer; + border: 1px solid #dbe6ff; +} + +.file-label input { + display: none; +} + +.file-label .material-icons { + font-size: 20px; +} + +.field-hint { + display: block; + margin-top: 8px; + color: #64748b; + font-size: 12px; + font-weight: 700; +} + +/* PREVIEW */ + +.news-preview-section { + margin-top: 22px; +} + +.news-preview-section > span { + display: block; + margin-bottom: 10px; + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.news-preview-card { + display: grid; + grid-template-columns: 0.9fr 1.1fr; + overflow: hidden; + border-radius: 20px; + background: #f8fafc; + border: 1px solid #e5e7eb; +} + +.news-preview-image { + min-height: 300px; + background: #e5e7eb; +} + +.news-preview-image img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.news-preview-content { + padding: 24px; +} + +.news-preview-content small { + display: inline-flex; + margin-bottom: 12px; + padding: 6px 10px; + border-radius: 999px; + background: #f1f5ff; + color: #071b63; + font-size: 11px; + font-weight: 900; + text-transform: uppercase; +} + +.news-preview-content h3 { + margin: 0 0 12px 0; + color: #0f172a; + font-size: 24px; + line-height: 32px; + font-weight: 900; +} + +.news-preview-description { + color: #475569; + font-size: 14px; + line-height: 23px; +} + +.form-message { + margin-top: 18px; + padding: 12px 14px; + border-radius: 14px; + background: #f8fafc; + border: 1px solid #e5e7eb; + display: flex; + align-items: center; + gap: 8px; + color: #334155; + font-size: 14px; + font-weight: 800; +} + +.form-message .material-icons { + color: #071b63; + font-size: 20px; +} + +.form-actions { + display: flex; + justify-content: flex-end; + gap: 12px; + margin-top: 24px; +} + +/* SUMMARY */ + +.summary-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 16px; + margin-bottom: 22px; +} + +.summary-card { + display: flex; + align-items: center; + gap: 16px; + padding: 20px; + border-radius: 20px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 16px 36px rgba(15, 23, 42, 0.08); +} + +.summary-icon { + width: 48px; + height: 48px; + border-radius: 16px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.summary-icon.active { + background: #dcfce7; + color: #166534; +} + +.summary-icon.blocked { + background: #fee2e2; + color: #991b1b; +} + +.summary-icon .material-icons { + font-size: 25px; +} + +.summary-card span { + display: block; + margin-bottom: 4px; + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.summary-card strong { + display: block; + color: #0f172a; + font-size: 22px; + line-height: 28px; + font-weight: 900; +} + +/* NEWS GRID */ + +.news-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 18px; +} + +.news-card { + position: relative; + overflow: hidden; + border-radius: 22px; + background: #f8fafc; + border: 1px solid #e5e7eb; + transition: transform 0.18s ease, box-shadow 0.18s ease; +} + +.news-card::before { + content: ""; + position: absolute; + left: 0; + top: 0; + width: 7px; + height: 100%; + z-index: 2; + background: #94a3b8; +} + +.news-card:hover { + transform: translateY(-3px); + box-shadow: 0 18px 42px rgba(15, 23, 42, 0.12); +} + +.news-enabled { + border-color: rgba(22, 163, 74, 0.26); +} + +.news-enabled::before { + background: #16a34a; +} + +.news-disabled { + border-color: rgba(220, 38, 38, 0.22); +} + +.news-disabled::before { + background: #dc2626; +} + +.news-image-wrapper { + height: 220px; + background: #e5e7eb; + overflow: hidden; +} + +.news-image { + width: 100%; + height: 100%; + object-fit: cover; +} + +.news-card-body { + padding: 18px; +} + +.news-card-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + margin-bottom: 14px; +} + +.id-pill { + min-height: 28px; + display: inline-flex; + align-items: center; + padding: 0 10px; + border-radius: 999px; + background: #e0f2fe; + color: #075985; + font-size: 12px; + font-weight: 900; +} + +.status-badge { + min-height: 28px; + display: inline-flex; + align-items: center; + padding: 0 12px; + border-radius: 999px; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.06em; +} + +.status-badge.enabled { + background: #dcfce7; + color: #166534; +} + +.status-badge.disabled { + background: #fee2e2; + color: #991b1b; +} + +.news-card h3 { + margin: 0 0 12px 0; + color: #0f172a; + font-size: 20px; + line-height: 27px; + font-weight: 900; +} + +.news-description { + max-height: 96px; + overflow: hidden; + color: #64748b; + font-size: 14px; + line-height: 23px; + margin-bottom: 14px; +} + +.news-link { + display: flex; + align-items: center; + gap: 7px; + margin-bottom: 16px; + color: #071b63; + font-size: 12px; + font-weight: 800; + min-width: 0; +} + +.news-link .material-icons { + font-size: 18px; + flex: 0 0 auto; +} + +.news-link span { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.news-actions { + display: flex; + gap: 10px; +} + +.btn-card { + min-height: 40px; + flex: 1; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 7px; + padding: 0 14px; + border-radius: 12px; + color: #ffffff; + font-size: 12px; +} + +.btn-card.edit { + background: #071b63; +} + +.btn-card.remove { + background: #dc2626; +} + +/* EMPTY */ + +.empty-state { + padding: 42px 20px; + text-align: center; + border-radius: 22px; + background: #f8fafc; + border: 1px dashed #cbd5e1; +} + +.empty-icon { + width: 72px; + height: 72px; + margin: 0 auto 18px auto; + border-radius: 999px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.empty-icon .material-icons { + font-size: 34px; +} + +.empty-state h3 { + margin: 0 0 10px 0; + color: #0f172a; + font-size: 22px; + font-weight: 900; +} + +.empty-state p { + max-width: 560px; + margin: 0 auto 22px auto; + color: #64748b; + font-size: 14px; + line-height: 23px; +} + +/* RESPONSIVE */ + +@media (max-width: 1000px) { + .summary-grid { + grid-template-columns: 1fr; + } + + .news-grid { + grid-template-columns: 1fr; + } + + .news-preview-card { + grid-template-columns: 1fr; + } +} + +@media (max-width: 760px) { + .admin-hero, + .panel-header { + flex-direction: column; + align-items: flex-start; + } + + .admin-hero-actions, + .admin-hero-actions .btn-main { + width: 100%; + } + + .form-actions { + flex-direction: column-reverse; + } + + .form-actions button { + width: 100%; + } + + .news-preview-image { + min-height: 220px; + } +} + +@media (max-width: 520px) { + .admin-hero, + .admin-card { + padding: 22px; + } + + .admin-hero h1 { + font-size: 28px; + line-height: 36px; + } + + .news-actions { + flex-direction: column; + } +} \ No newline at end of file diff --git a/src/app/noticias/noticias.component.ts b/src/app/noticias/noticias.component.ts new file mode 100644 index 0000000..1315768 --- /dev/null +++ b/src/app/noticias/noticias.component.ts @@ -0,0 +1,219 @@ +import { Component, OnInit } from '@angular/core'; +import { Noticias, NoticiasList } from '../models/noticiasModel'; +import { Modos } from '../models/variaveisModel'; +import { Router, ActivatedRoute } from '@angular/router'; +import { NoticiasService } from '../services/noticias.service'; +import { environment } from 'src/environments/environment'; + +@Component({ + selector: 'app-noticias', + templateUrl: './noticias.component.html', + styleUrls: ['./noticias.component.scss', './../app.component.scss'] +}) +export class NoticiasComponent implements OnInit { + + TituloJanela: string = ''; + TextoBotao: string = ''; + MensagemForm: string = ''; + + FormNoticias: Noticias = new Noticias(); + ListaNoticias: NoticiasList[] = []; + + JanelaModo: Modos = new Modos(); + + Imagem: File = null; + CaminhoImagem: string = null; + + Rota: string = "noticia"; + + constructor( + private router: Router, + private route: ActivatedRoute, + private noticiasService: NoticiasService + ) { } + + ngOnInit() { + this.CheckRouteMode(); + } + + get TotalHabilitadas(): number { + return (this.ListaNoticias || []).filter(noticia => noticia.habilitado).length; + } + + get TotalDesabilitadas(): number { + return (this.ListaNoticias || []).filter(noticia => !noticia.habilitado).length; + } + + CheckRouteMode() { + this.JanelaModo = new Modos(); + this.MensagemForm = ''; + + if (this.router.url.includes('visualizar')) { + this.JanelaModo.Visualizar = true; + this.TituloJanela = "Visualizar notícias"; + + this.CarregarNoticias(); + return; + } + + if (this.router.url.includes('editar')) { + this.JanelaModo.Editar = true; + this.TituloJanela = "Editar notícia"; + this.TextoBotao = "Editar"; + + this.noticiasService.getNoticiasByID(this.route.snapshot.params['id' + this.Rota + 's']).then(resNoticia => { + this.FormNoticias = resNoticia; + this.CaminhoImagem = environment.LinkProjeto + "/imagens/" + this.Rota + "s/noticia_" + this.FormNoticias.idnoticias + ".jpg"; + }); + + return; + } + + this.JanelaModo.Cadastro = true; + this.TituloJanela = "Cadastro de notícias"; + this.TextoBotao = "Salvar"; + + this.FormNoticias = new Noticias(); + this.FormNoticias.habilitado = true; + } + + CarregarNoticias() { + this.noticiasService.getNoticias().then(resNoticias => { + this.ListaNoticias = resNoticias || []; + }); + } + + NovaNoticia() { + this.router.navigate(['/dashboard/admin/' + this.Rota + 's']); + } + + VoltarLista() { + this.router.navigate(['/dashboard/admin/' + this.Rota + 's/visualizar']); + } + + btnCadastrarClick() { + if (this.TextoBotao == "Lista de " + this.Rota + "s") { + this.VoltarLista(); + return; + } + + if (!this.ValidarFormulario()) { + return; + } + + if (this.JanelaModo.Cadastro) { + this.noticiasService.insertNoticias(this.FormNoticias).then(resInsert => { + this.FormNoticias.idnoticias = resInsert['response'].insertId; + this.FimCadastro(resInsert['status']); + }); + + return; + } + + if (this.JanelaModo.Editar) { + this.noticiasService.updateNoticias(this.FormNoticias).then(resUpdate => { + this.FimCadastro(resUpdate['status']); + }); + } + } + + ValidarFormulario(): boolean { + if (!this.FormNoticias.titulo || this.FormNoticias.titulo.trim() == '') { + this.MensagemForm = "Informe o título da notícia."; + return false; + } + + if (!this.FormNoticias.descricao || this.FormNoticias.descricao.trim() == '') { + this.MensagemForm = "Informe a descrição da notícia."; + return false; + } + + if (this.JanelaModo.Cadastro && !this.Imagem) { + this.MensagemForm = "Selecione uma imagem para a notícia."; + return false; + } + + return true; + } + + FimCadastro(Status) { + if (Status == 200) { + if (this.JanelaModo.Cadastro) { + this.MensagemForm = "Notícia cadastrada com sucesso!"; + } else if (this.JanelaModo.Editar) { + this.MensagemForm = "Notícia atualizada com sucesso!"; + } + + const deveCopiarImagem = + this.Imagem != null && + ( + this.JanelaModo.Cadastro || + this.JanelaModo.Editar + ); + + if (deveCopiarImagem) { + this.CopiarArquivos(); + } + + setTimeout(() => { + this.VoltarLista(); + }, 900); + + return; + } + + if (this.JanelaModo.Cadastro) { + this.MensagemForm = "Erro ao cadastrar notícia."; + } else if (this.JanelaModo.Editar) { + this.MensagemForm = "Erro ao atualizar notícia."; + } + + this.TextoBotao = "Lista de notícias"; + } + + EditarNoticia(Noticia: Noticias) { + this.router.navigate(['dashboard/admin/' + this.Rota + 's/editar/' + Noticia.idnoticias]); + } + + RemoverNoticia(Noticia: Noticias) { + if (confirm("Tem certeza que deseja remover a notícia '" + Noticia.titulo + "'?")) { + this.noticiasService.deleteNoticias(Noticia.idnoticias).then(resDelete => { + this.ListaNoticias = this.ListaNoticias.filter(item => item.idnoticias !== Noticia.idnoticias); + }); + } + } + + CopiarArquivos() { + const req = new XMLHttpRequest(); + const formData = new FormData(); + + formData.append("id" + this.Rota + "s", this.FormNoticias.idnoticias.toString()); + formData.append("imagem", this.Imagem); + + req.open("POST", environment.ApiUrl + "/noticias/copy"); + req.send(formData); + + req.onreadystatechange = function () { + if (req.readyState === 4) { + console.log("Notícia copiada com sucesso!"); + } + }; + } + + onFileChangedIcone(event) { + if (event.target.files && event.target.files[0]) { + this.Imagem = event.target.files[0]; + + const reader = new FileReader(); + reader.readAsDataURL(event.target.files[0]); + + reader.onload = (event) => { + this.CaminhoImagem = event.target['result'].toString(); + }; + } + } + + LinkImagemNoticia(Noticia: NoticiasList): string { + return environment.LinkProjeto + "/imagens/" + this.Rota + "s/noticia_" + Noticia.idnoticias + ".jpg"; + } +} \ No newline at end of file diff --git a/src/app/orion-dashboard/orion-dashboard.component.html b/src/app/orion-dashboard/orion-dashboard.component.html new file mode 100644 index 0000000..5352440 --- /dev/null +++ b/src/app/orion-dashboard/orion-dashboard.component.html @@ -0,0 +1,181 @@ +
+ + +
+ +
+ + + + + + +

+ + + + +

+ + + +

+ + +
+ + + {{Nome}} + + + +

+ + +
+ + + {{Perfil}} + + + +

+ + +
+ + + + {{trabalho[0].dataLog | date: 'HH:mm'}} ({{trabalho.length}} logs) + + + + +

+ + +
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
+
+ + + + +
+
+ + + +
+ + +
+
+ + + + + +
+ + + + + + + + +
+ + + + + + + + + +
+ + + + + + +
+ +

+ +
+ + + + Data + {{log.logObj.data | date:'short'}} + + + + Nome + {{log.nome}} + + + + Perfil + {{log.perfil}} + + + + Conectado + {{log.logObj.conectado ? 'Sim' : 'Não'}} + + + + Câmera + {{log.logObj.camera}} + + + + + + + + +
+
+
+
diff --git a/src/app/orion-dashboard/orion-dashboard.component.scss b/src/app/orion-dashboard/orion-dashboard.component.scss new file mode 100644 index 0000000..40ff643 --- /dev/null +++ b/src/app/orion-dashboard/orion-dashboard.component.scss @@ -0,0 +1,30 @@ +#divChart{ + display: block; + width: 90%; + height: auto; +} + +.divChart{ + display: block; + width: 30%; + position: relative; + float: left; + margin-right: 3%; + height: 350px; +} + +.TabelaDados { + padding: 20px; +} + +.DivGraficoFora { + width: 100%; + height: auto; + position: relative; +} + + +::ng-deep .highlight-date .mat-calendar-body-cell-content { + background-color: #ffcc80; /* Cor de destaque */ + border-radius: 50%; +} \ No newline at end of file diff --git a/src/app/orion-dashboard/orion-dashboard.component.spec.ts b/src/app/orion-dashboard/orion-dashboard.component.spec.ts new file mode 100644 index 0000000..a4a2034 --- /dev/null +++ b/src/app/orion-dashboard/orion-dashboard.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { OrionDashboardComponent } from './orion-dashboard.component'; + +describe('OrionDashboardComponent', () => { + let component: OrionDashboardComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ OrionDashboardComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OrionDashboardComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/orion-dashboard/orion-dashboard.component.ts b/src/app/orion-dashboard/orion-dashboard.component.ts new file mode 100644 index 0000000..a294a3b --- /dev/null +++ b/src/app/orion-dashboard/orion-dashboard.component.ts @@ -0,0 +1,300 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { MatPaginator } from '@angular/material/paginator'; +import { Chart } from 'chart.js'; +import { LogAgrupado, OrionLogsDetalhesModel, OrionLogSensorModel, OrionLogsModel } from '../models/orionModel'; +import { OrionService } from '../services/orionService'; +import { MatTableDataSource } from '@angular/material/table'; +import { MatTabChangeEvent } from '@angular/material'; + +@Component({ + selector: 'app-orion-dashboard', + templateUrl: './orion-dashboard.component.html', + styleUrls: ['./orion-dashboard.component.scss'] +}) +export class OrionDashboardComponent implements OnInit { + @ViewChild(MatPaginator, { static: true }) paginator: MatPaginator; + + constructor( + private orionService: OrionService + ) { } + + Datas: string[] = []; + DataSelecionada: Date; + LogsDetalhes: OrionLogsModel[]; + LogsDetalhesFiltrado: OrionLogsModel[]; + displayedColumns: string[] = ['data', 'nome', 'perfil', 'conectado', 'camera']; + dataSource = new MatTableDataSource(); + + MapNome: any; + NomesFiltro: string[] = []; + MapPerfil: any; + PerfisFiltro: string[] = []; + HoraInicial: number = 0; // Slider range start (0 hours) + HoraFinal: number = 23; // Slider range end (23 hours) + FiltroSelecionado: OrionLogsDetalhesModel = null; + selectedSensor: OrionLogSensorModel; + + trabalhos = []; + trabalhoSelecionado; + tempoLog: number = 10; + + sliderOptions = { + floor: 0, + ceil: 23, + step: 1, + noSwitching: true, + translate: (value: number): string => { + return value + ':00'; + } + }; + + highlightedDates: Set = new Set(); // Datas que possuem logs + + ngOnInit() { + this.orionService.getAllLogs().then(resLogs => { + resLogs.forEach(log => log.logObj = JSON.parse(log.log)); + + // Ordena os logs por data do mais novo para o mais antigo + /*resLogs.sort((a, b) => { + const dateA = new Date(a.logObj.data).getTime(); + const dateB = new Date(b.logObj.data).getTime(); + return dateB - dateA; // Ordena do mais novo para o mais antigo + });*/ + + this.LogsDetalhes = resLogs; + + var MapDatas = this.groupBy(this.LogsDetalhes, log => new Date(log.logObj.data).toLocaleDateString()); + this.Datas = Array.from(MapDatas.keys()); + + // Adiciona as datas ao conjunto de datas destacadas + this.Datas.forEach(date => this.highlightedDates.add(date)); + + // Inicializa a tabela com todos os logs + this.dataSource.data = this.LogsDetalhes; + this.dataSource.paginator = this.paginator; + }); + } + + // Método para destacar datas no calendário + highlightDates = (date: Date): string => { + const dateStr = date.toLocaleDateString(); + return this.highlightedDates.has(dateStr) ? 'highlight-date' : ''; + }; + + btnFiltrarClick() { + // Limpa gráficos e dados antes de aplicar o filtro + this.clearCharts(); + this.FiltroSelecionado = null; + this.trabalhoSelecionado = null; + + // Extrai a data no formato YYYY-MM-DD + let DataSelecionadaStr = this.DataSelecionada.toISOString().split('T')[0]; + + // Concatena a data formatada com a hora inicial e final + let DataInicial: Date = new Date(`${DataSelecionadaStr}T${(this.HoraInicial < 10 ? "0" : "") + this.HoraInicial}:00:00`); + let DataFinal: Date = new Date(`${DataSelecionadaStr}T${(this.HoraFinal < 0 ? "0" : "") + this.HoraFinal}:59:59`); + + this.LogsDetalhesFiltrado = this.LogsDetalhes.filter(log => new Date(log.logObj.data) >= DataInicial && new Date(log.logObj.data) <= DataFinal); + this.dataSource.data = this.LogsDetalhesFiltrado; + this.dataSource.paginator = this.paginator; + + this.MapNome = this.groupBy(this.LogsDetalhesFiltrado, log => log.nome); + this.NomesFiltro = Array.from(this.MapNome.keys()); + this.txtPerfilChange(""); + } + + txtNomeChange(NomeSelecionado: string) { + // Limpa todas as informações de perfil, trabalho e gráficos ao selecionar novo nome + this.LogsDetalhesFiltrado = []; + this.FiltroSelecionado = null; + this.PerfisFiltro = []; + this.trabalhoSelecionado = null; + + // Limpa gráficos + this.clearCharts(); + + // Carrega os perfis do novo usuário selecionado + this.MapPerfil = this.groupBy(this.MapNome.get(NomeSelecionado), log => log.perfil); + this.PerfisFiltro = Array.from(this.MapPerfil.keys()); + } + + txtPerfilChange(PerfilSelecionado: string) { + if (PerfilSelecionado != "") { + this.LogsDetalhesFiltrado = this.MapPerfil.get(PerfilSelecionado); + } + else { + this.LogsDetalhesFiltrado = []; + } + + // Agrupando logs por trabalhos baseados no intervalo de 5 minutos + let trabalhos = []; + let trabalhoAtual = []; + + // Limpa os gráficos e trabalhos anteriores ao selecionar novo perfil + this.FiltroSelecionado = null; + this.trabalhoSelecionado = null; + this.selectedSensor = null; + + // Limpa gráficos + this.clearCharts(); + + // Percorre os logs e separa em grupos + for (let i = 0; i < this.LogsDetalhesFiltrado.length; i++) { + const logAtual = this.LogsDetalhesFiltrado[i]; + const dataLogAtual = new Date(logAtual.dataLog); + + if (trabalhoAtual.length === 0) { + trabalhoAtual.push(logAtual); // Adiciona o primeiro log ao trabalho atual + } else { + const ultimoLog = trabalhoAtual[trabalhoAtual.length - 1]; + const dataUltimoLog = new Date(ultimoLog.dataLog); + + // Calcula a diferença em minutos entre o log atual e o último log do trabalho atual + const diffInMinutes = (dataLogAtual.getTime() - dataUltimoLog.getTime()) / 1000 / 60; + + if (diffInMinutes > this.tempoLog) { + // Se a diferença for maior que 5 minutos, inicia um novo trabalho + trabalhos.push(trabalhoAtual); + trabalhoAtual = [logAtual]; + } else { + // Caso contrário, adiciona o log ao trabalho atual + trabalhoAtual.push(logAtual); + } + } + } + + // Adiciona o último trabalho ao array de trabalhos + if (trabalhoAtual.length > 0) { + trabalhos.push(trabalhoAtual); + } + + // Atualiza o estado com os trabalhos identificados + this.trabalhos = trabalhos; + if (this.trabalhos.length == 1) { + this.onTrabalhoSelecionado(trabalhos[0]); + } + } + + onTrabalhoSelecionado(trabalhoSelecionado: OrionLogsModel[]) { + this.trabalhoSelecionado = trabalhoSelecionado; + this.FiltroSelecionado = trabalhoSelecionado[trabalhoSelecionado.length - 1].logObj; + + // Atualizar detalhes como horário de início, fim, duração, etc. + let Ordenado = trabalhoSelecionado.sort((a, b) => b.dataLog < a.dataLog ? 1 : a.dataLog > b.dataLog ? -1 : 0); + + this.FiltroSelecionado.HoraInicio = new Date(Ordenado[0].dataLog).toLocaleTimeString(); + this.FiltroSelecionado.HoraFim = new Date(Ordenado[Ordenado.length - 1].dataLog).toLocaleTimeString(); + + var Dif = (new Date(Ordenado[Ordenado.length - 1].dataLog).getTime() - new Date(Ordenado[0].dataLog).getTime()) / 1000; + this.FiltroSelecionado.Duracao = this.SegundosParaTempo(Dif); + + this.FiltroSelecionado.Coordenadas = trabalhoSelecionado[trabalhoSelecionado.length - 1].coordenadas; + this.orionService.coordenadaToEndereco(this.FiltroSelecionado.Coordenadas).then(res => { + console.log(res); + if (res && res.data && res.data.length > 0) { + this.FiltroSelecionado.Localizacao = res.data[0].label; + } + }) + + // Atualiza a interface com os dados filtrados + this.btnAtualizarClick(); + } + + btnAtualizarClick() { + if (this.selectedSensor == null) { + this.selectedSensor = this.FiltroSelecionado.sensores[0]; + } + this.renderChart(this.selectedSensor, 'chart_' + this.selectedSensor.sensor + '_' + this.selectedSensor.descricao); + } + + groupBy(list, keyGetter) { + const map = new Map(); + list.forEach((item) => { + const key = keyGetter(item); + const collection = map.get(key); + if (!collection) { + map.set(key, [item]); + } + else { + collection.push(item); + } + }); + return map; + } + + SegundosParaTempo(Segundos: number) : string { + return new Date(Segundos * 1000).toISOString().substring(11, 19); + } + + onTabChange(event: MatTabChangeEvent) { + this.selectedSensor = this.FiltroSelecionado.sensores[event.index]; + const chartId = `chart_${this.selectedSensor.sensor}_${this.selectedSensor.descricao}`; + this.renderChart(this.selectedSensor, chartId); + } + + renderChart(sensor: OrionLogSensorModel, chartId: string) { + setTimeout(() => { + const canvasElement = document.getElementById(chartId) as HTMLCanvasElement; + if (canvasElement) { + const context = canvasElement.getContext('2d'); + if (context) { + // Use os logs filtrados com base no trabalho selecionado + const DadosSensoresModa = this.trabalhoSelecionado.map(log => log.logObj.sensores.filter(s => s.sensor === sensor.sensor && s.descricao === sensor.descricao)[0].moda); + const DadosSensoresMedia = this.trabalhoSelecionado.map(log => log.logObj.sensores.filter(s => s.sensor === sensor.sensor && s.descricao === sensor.descricao)[0].media); + const DadosSensoresMediana = this.trabalhoSelecionado.map(log => log.logObj.sensores.filter(s => s.sensor === sensor.sensor && s.descricao === sensor.descricao)[0].mediana); + + const myChart = new Chart(chartId, { + type: 'line', + data: { + labels: this.trabalhoSelecionado.map(log => new Date(log.logObj.data).toLocaleTimeString()), + datasets: [ + { + label: 'Moda', + data: DadosSensoresModa, + backgroundColor: 'rgba(255, 99, 132, 0.2)', + borderColor: 'rgba(255, 99, 132, 1)', + borderWidth: 1, + }, + { + label: 'Média', + data: DadosSensoresMedia, + backgroundColor: 'rgba(54, 162, 235, 0.2)', + borderColor: 'rgba(54, 162, 235, 1)', + borderWidth: 1, + }, + { + label: 'Mediana', + data: DadosSensoresMediana, + backgroundColor: 'rgba(255, 206, 86, 0.2)', + borderColor: 'rgba(255, 206, 86, 1)', + borderWidth: 1, + }, + ], + }, + options: { + scales: { + y: { + beginAtZero: true, + }, + }, + }, + }); + } else { + console.error(`Não foi possível adquirir o contexto para o gráfico com id ${chartId}`); + } + } + }, 100); // Pequeno atraso de 100ms + } + + clearCharts() { + const canvasElements = document.querySelectorAll('canvas'); + canvasElements.forEach((canvas) => { + const context = canvas.getContext('2d'); + if (context) { + context.clearRect(0, 0, canvas.width, canvas.height); // Limpa os gráficos + } + }); + } + + +} diff --git a/src/app/pipes/tipo-arquivo-nome.pipe.ts b/src/app/pipes/tipo-arquivo-nome.pipe.ts new file mode 100644 index 0000000..d2c7181 --- /dev/null +++ b/src/app/pipes/tipo-arquivo-nome.pipe.ts @@ -0,0 +1,45 @@ +// tipo-arquivo-nome.pipe.ts +import { Pipe, PipeTransform } from '@angular/core'; +import { TiposArquivos } from '../models/agrobaseModel'; + +@Pipe({ + name: 'tipoArquivoNome' +}) +export class TipoArquivoNomePipe implements PipeTransform { + transform(value: TiposArquivos): string { + switch (value) { + case TiposArquivos.ModeloIA_StreetDetector: + return 'Modelo IA - Street Detector'; + case TiposArquivos.ModeloIA_WeedDetector: + return 'Modelo IA - Weed Detector'; + case TiposArquivos.ParametrosModulo_ATU: + return 'Parâmetros Módulo ATU'; + case TiposArquivos.ParametrosModulo_MVD: + return 'Parâmetros Módulo MVD'; + case TiposArquivos.ParametrosModulo_SEN: + return 'Parâmetros Módulo SEN'; + case TiposArquivos.ParametrosModulo_KNT: + return 'Parâmetros Módulo KNT'; + case TiposArquivos.PinoutModulo_ATU: + return 'Pinout Módulo ATU'; + case TiposArquivos.PinoutModulo_SEN: + return 'Pinout Módulo SEN'; + case TiposArquivos.Script_StreetDetector: + return 'Script - Street Detector'; + case TiposArquivos.Script_WeedDetector: + return 'Script - Weed Detector'; + case TiposArquivos.Script_GreenDetector: + return 'Script - Green Detector'; + case TiposArquivos.Script_MapLoad: + return 'Script - Map Load'; + case TiposArquivos.Script_MapFollow: + return 'Script - Map Follow'; + case TiposArquivos.Script_GpsViewer: + return 'Script - GPS Viewer'; + case TiposArquivos.ArquivoModelo3D: + return 'Arquivo Modelo 3D'; + default: + return 'Tipo desconhecido'; + } + } +} diff --git a/src/app/produtos/produtos.component.html b/src/app/produtos/produtos.component.html new file mode 100644 index 0000000..f8b9bb4 --- /dev/null +++ b/src/app/produtos/produtos.component.html @@ -0,0 +1,240 @@ +
+ + +
+
+ Backoffice + +

Produtos

+ +

+ Gerencie as opções de compra, valores e status comercial do sistema + {{ Sistema != null ? Sistema.nome : "" }}. +

+
+ +
+ +
+
+ + +
+
+ Ícone do sistema +
+ +
+ Sistema selecionado + {{ Sistema.nome }} + Produtos e licenças vinculados a este sistema +
+
+ + +
+
+
+ inventory_2 +
+ +
+ Total de produtos + {{ ListaProdutos?.length || 0 }} +
+
+ +
+
+ check_circle +
+ +
+ Ativados + {{ TotalProdutosAtivos }} +
+
+ +
+
+ payments +
+ +
+ Vendas + {{ TotalVendas }} +
+
+
+ + +
+
+
+ Produtos cadastrados +

Opções de compra

+
+
+ +
+ +
+ +
+
+ workspace_premium +
+ + + {{ produto.ativado ? 'Ativado' : 'Desativado' }} + +
+ +

Licença {{ produto.descricao }}

+ +
+ R$ + {{ produto.valor | number:'1.2-2' }} +
+ +
+
+ Vendas + {{ produto.vendas || 0 }} +
+ +
+ Compensados + {{ produto.compensados || 0 }} +
+
+ +
+ + + +
+ +
+ +
+ +
+
+ sell +
+ +

Nenhum produto cadastrado

+ +

+ Este sistema ainda não possui produtos ou opções de licença para compra. +

+ + +
+
+ + +
+
+
+ Cadastro comercial +

{{ FormProduto.idprodutos ? 'Editar produto' : 'Novo produto' }}

+
+ + +
+ +
+ +
+
+ + + +
+ +
+ + + +
+
+ +
+ Prévia comercial + +
+ Licença selecionada + + + R$ {{ FormProduto.valor || 0 | number:'1.2-2' }} + + +

+ {{ getTipoLicencaDescricao(FormProduto.idtiposlicenca) }} +

+
+
+ +
+ + + +
+ +
+
+ +
\ No newline at end of file diff --git a/src/app/produtos/produtos.component.scss b/src/app/produtos/produtos.component.scss new file mode 100644 index 0000000..9c56a70 --- /dev/null +++ b/src/app/produtos/produtos.component.scss @@ -0,0 +1,635 @@ +.products-admin-page { + min-height: calc(100vh - 74px); + color: #0f172a; +} + +/* HERO */ + +.admin-hero { + display: flex; + align-items: center; + justify-content: space-between; + gap: 22px; + margin-bottom: 22px; + padding: 32px; + border-radius: 24px; + background: + radial-gradient(circle at top right, rgba(255, 255, 255, 0.14), transparent 34%), + linear-gradient(145deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 22px 55px rgba(15, 23, 42, 0.16); +} + +.eyebrow { + display: inline-block; + margin-bottom: 10px; + color: #071b63; + font-size: 12px; + font-weight: 900; + letter-spacing: 0.14em; + text-transform: uppercase; +} + +.admin-hero .eyebrow { + color: #bfdbfe; +} + +.admin-hero h1 { + margin: 0 0 10px 0; + color: #ffffff; + font-size: 34px; + line-height: 42px; + font-weight: 900; + letter-spacing: -0.04em; +} + +.admin-hero p { + max-width: 760px; + margin: 0; + color: #dbeafe; + font-size: 15px; + line-height: 25px; +} + +/* SYSTEM STRIP */ + +.system-strip { + display: flex; + align-items: center; + gap: 16px; + margin-bottom: 22px; + padding: 18px; + border-radius: 20px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 16px 36px rgba(15, 23, 42, 0.08); +} + +.system-icon-box { + width: 60px; + height: 60px; + border-radius: 18px; + background: #f1f5ff; + border: 1px solid #dbe6ff; + display: flex; + align-items: center; + justify-content: center; +} + +.system-icon { + width: 40px; + height: 40px; + object-fit: contain; +} + +.system-strip span { + display: block; + margin-bottom: 4px; + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.system-strip strong { + display: block; + color: #0f172a; + font-size: 18px; + font-weight: 900; +} + +.system-strip small { + display: block; + margin-top: 3px; + color: #64748b; + font-size: 13px; +} + +/* SUMMARY */ + +.summary-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 16px; + margin-bottom: 22px; +} + +.summary-card { + display: flex; + align-items: center; + gap: 16px; + padding: 20px; + border-radius: 20px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 16px 36px rgba(15, 23, 42, 0.08); +} + +.summary-icon { + width: 48px; + height: 48px; + border-radius: 16px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.summary-icon.active { + background: #dcfce7; + color: #166534; +} + +.summary-icon.money { + background: #fef9c3; + color: #854d0e; +} + +.summary-icon .material-icons { + font-size: 25px; +} + +.summary-card span { + display: block; + margin-bottom: 4px; + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.summary-card strong { + display: block; + color: #0f172a; + font-size: 22px; + line-height: 28px; + font-weight: 900; +} + +/* CARDS */ + +.admin-card { + margin-bottom: 22px; + padding: 28px; + border-radius: 24px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 18px 45px rgba(15, 23, 42, 0.10); +} + +.panel-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 18px; + margin-bottom: 24px; +} + +.panel-header h2 { + margin: 0; + color: #0f172a; + font-size: 26px; + line-height: 34px; + font-weight: 900; + letter-spacing: -0.035em; +} + +/* BUTTONS */ + +.btn-main, +.btn-secondary, +.btn-card { + border: none; + cursor: pointer; + font-weight: 900; + transition: transform 0.18s ease, box-shadow 0.18s ease, background-color 0.18s ease; +} + +.btn-main { + min-height: 44px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 0 18px; + border-radius: 12px; + background: #ffffff; + color: #071b63; + box-shadow: 0 12px 24px rgba(0, 0, 0, 0.16); +} + +.form-submit, +.empty-btn { + background: linear-gradient(135deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 12px 24px rgba(7, 27, 99, 0.20); +} + +.btn-main:hover, +.btn-secondary:hover, +.btn-card:hover { + transform: translateY(-1px); +} + +.btn-main .material-icons, +.btn-card .material-icons { + font-size: 19px; +} + +.btn-secondary { + min-height: 44px; + padding: 0 18px; + border-radius: 12px; + background: #f1f5f9; + color: #334155; +} + +/* PRODUCTS */ + +.products-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 18px; +} + +.product-card { + position: relative; + overflow: hidden; + padding: 22px; + border-radius: 22px; + background: #f8fafc; + border: 1px solid #e5e7eb; + transition: transform 0.18s ease, box-shadow 0.18s ease, border-color 0.18s ease; +} + +.product-card::before { + content: ""; + position: absolute; + left: 0; + top: 0; + width: 7px; + height: 100%; + background: #94a3b8; +} + +.product-card:hover { + transform: translateY(-3px); + box-shadow: 0 18px 42px rgba(15, 23, 42, 0.12); +} + +.product-active { + border-color: rgba(22, 163, 74, 0.26); + background: linear-gradient(90deg, rgba(220, 252, 231, 0.55), #f8fafc 32%); +} + +.product-active::before { + background: #16a34a; +} + +.product-disabled { + border-color: rgba(220, 38, 38, 0.22); + background: linear-gradient(90deg, rgba(254, 226, 226, 0.50), #f8fafc 32%); +} + +.product-disabled::before { + background: #dc2626; +} + +.product-card-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 18px; +} + +.product-icon { + width: 46px; + height: 46px; + border-radius: 16px; + background: #ffffff; + border: 1px solid #dbe6ff; + display: flex; + align-items: center; + justify-content: center; + color: #071b63; +} + +.status-badge { + min-height: 28px; + display: inline-flex; + align-items: center; + padding: 0 12px; + border-radius: 999px; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.06em; +} + +.status-badge.enabled { + background: #dcfce7; + color: #166534; +} + +.status-badge.disabled { + background: #fee2e2; + color: #991b1b; +} + +.product-card h3 { + margin: 0 0 16px 0; + color: #0f172a; + font-size: 20px; + line-height: 27px; + font-weight: 900; +} + +.product-price { + display: flex; + align-items: flex-start; + gap: 6px; + margin-bottom: 18px; +} + +.product-price small { + margin-top: 6px; + color: #071b63; + font-size: 14px; + font-weight: 900; +} + +.product-price strong { + color: #071b63; + font-size: 34px; + line-height: 38px; + font-weight: 900; + letter-spacing: -0.04em; +} + +.product-meta-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 12px; + margin-bottom: 18px; +} + +.meta-item { + padding: 14px; + border-radius: 16px; + background: #ffffff; + border: 1px solid #e5e7eb; +} + +.meta-item span { + display: block; + margin-bottom: 5px; + color: #64748b; + font-size: 11px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.meta-item strong { + display: block; + color: #0f172a; + font-size: 15px; + line-height: 22px; + font-weight: 900; +} + +.product-actions { + display: flex; + gap: 10px; +} + +.btn-card { + min-height: 40px; + flex: 1; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 7px; + padding: 0 14px; + border-radius: 12px; + color: #ffffff; + font-size: 12px; +} + +.btn-card.edit { + background: #071b63; +} + +.btn-card.remove { + background: #dc2626; +} + +/* FORM */ + +.form-grid { + display: grid; + grid-template-columns: 1fr 220px; + gap: 18px; +} + +.form-group label { + display: block; + margin-bottom: 7px; + color: #1e293b; + font-size: 14px; + font-weight: 800; +} + +.form-control { + width: 100%; + height: 46px; + padding: 0 14px; + border-radius: 12px; + border: 1px solid #d7deea; + background: #ffffff; + color: #0f172a; + font-size: 15px; + outline: none; + transition: border-color 0.18s ease, box-shadow 0.18s ease; + box-sizing: border-box; +} + +.form-control:focus { + border-color: #071b63; + box-shadow: 0 0 0 4px rgba(7, 27, 99, 0.10); +} + +.status-toggle { + cursor: pointer; + margin: 0; +} + +.status-toggle input { + display: none; +} + +.toggle-box { + min-height: 38px; + display: inline-flex; + align-items: center; + gap: 7px; + padding: 0 13px; + border-radius: 999px; + background: #f1f5ff; + color: #071b63; + font-size: 13px; + font-weight: 900; + border: 1px solid #dbe6ff; +} + +.toggle-box .material-icons { + font-size: 19px; +} + +.form-preview { + margin-top: 20px; +} + +.form-preview > span { + display: block; + margin-bottom: 10px; + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.preview-price-card { + padding: 18px; + border-radius: 18px; + background: #f8fafc; + border: 1px solid #e5e7eb; +} + +.preview-price-card small { + display: block; + margin-bottom: 6px; + color: #64748b; + font-size: 12px; + font-weight: 900; +} + +.preview-price-card strong { + display: block; + color: #071b63; + font-size: 28px; + font-weight: 900; +} + +.preview-price-card p { + margin: 6px 0 0 0; + color: #475569; + font-size: 14px; + font-weight: 800; +} + +.form-actions { + display: flex; + justify-content: flex-end; + gap: 12px; + margin-top: 24px; +} + +/* EMPTY */ + +.empty-state { + padding: 42px 20px; + text-align: center; + border-radius: 22px; + background: #f8fafc; + border: 1px dashed #cbd5e1; +} + +.empty-icon { + width: 72px; + height: 72px; + margin: 0 auto 18px auto; + border-radius: 999px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.empty-icon .material-icons { + font-size: 34px; +} + +.empty-state h3 { + margin: 0 0 10px 0; + color: #0f172a; + font-size: 22px; + font-weight: 900; +} + +.empty-state p { + max-width: 560px; + margin: 0 auto 22px auto; + color: #64748b; + font-size: 14px; + line-height: 23px; +} + +/* RESPONSIVE */ + +@media (max-width: 1100px) { + .products-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .summary-grid { + grid-template-columns: 1fr; + } +} + +@media (max-width: 760px) { + .admin-hero, + .panel-header { + flex-direction: column; + align-items: flex-start; + } + + .admin-hero-actions, + .admin-hero-actions .btn-main { + width: 100%; + } + + .products-grid, + .form-grid { + grid-template-columns: 1fr; + } + + .form-actions { + flex-direction: column-reverse; + } + + .form-actions button { + width: 100%; + } +} + +@media (max-width: 520px) { + .admin-hero, + .admin-card { + padding: 22px; + } + + .admin-hero h1 { + font-size: 28px; + line-height: 36px; + } + + .product-actions { + flex-direction: column; + } +} \ No newline at end of file diff --git a/src/app/produtos/produtos.component.ts b/src/app/produtos/produtos.component.ts new file mode 100644 index 0000000..775f528 --- /dev/null +++ b/src/app/produtos/produtos.component.ts @@ -0,0 +1,171 @@ +import { Component, OnInit } from '@angular/core'; +import { ProdutosService } from '../services/produtosService'; +import { Sistemas, TiposDeLicenca } from '../models/sistemasModel'; +import { SistemasService } from '../services/sistemas.service'; +import { ActivatedRoute } from '@angular/router'; +import { ProdutosModel } from '../models/produtosModel'; +import { environment } from 'src/environments/environment'; + +@Component({ + selector: 'app-produtos', + templateUrl: './produtos.component.html', + styleUrls: ['./produtos.component.scss'] +}) +export class ProdutosComponent implements OnInit { + + Sistema: Sistemas = null; + ListaProdutos: ProdutosModel[] = []; + TiposLicenca: TiposDeLicenca[] = []; + FormProduto: ProdutosModel = null; + + constructor( + private produtosService: ProdutosService, + private sistemasService: SistemasService, + private route: ActivatedRoute + ) { } + + ngOnInit() { + this.CarregarDados(); + } + + get LinkSistemaIcone(): string { + if (!this.Sistema) { + return ''; + } + + return environment.LinkProjeto + '/sistemas/' + this.Sistema.idsistemas + '/icone.png'; + } + + get TotalProdutosAtivos(): number { + return (this.ListaProdutos || []).filter(produto => produto.ativado).length; + } + + get TotalVendas(): number { + return (this.ListaProdutos || []).reduce((total, produto) => { + return total + Number(produto.vendas || 0); + }, 0); + } + + CarregarDados() { + this.sistemasService.getTiposdelicenca().then(resTiposLicenca => { + this.TiposLicenca = resTiposLicenca || []; + + this.sistemasService.getSistemaByID(this.route.snapshot.params['idsistemas']).then(resSistema => { + this.Sistema = resSistema; + this.cancelarFormulario(); + this.CarregarProdutos(); + }); + }); + } + + CarregarProdutos() { + this.produtosService.getAllProdutos(this.Sistema.idsistemas).then(resProdutos => { + this.ListaProdutos = resProdutos || []; + }); + } + + btnNovoProdutoClick() { + if (!this.Sistema) { + alert("Aguarde o sistema carregar."); + return; + } + + this.FormProduto = new ProdutosModel(); + this.FormProduto.idtiposlicenca = 0; + this.FormProduto.idsistemas = this.Sistema.idsistemas; + this.FormProduto.valor = 0; + this.FormProduto.ativado = true; + + this.ScrollParaFormulario(); + } + + btnEditarProdutoClick(produto: ProdutosModel) { + this.FormProduto = { ...produto }; + + this.ScrollParaFormulario(); + } + + ScrollParaFormulario() { + setTimeout(() => { + const elemento = document.getElementById("produtoForm"); + + if (elemento) { + elemento.scrollIntoView({ + behavior: "smooth", + block: "start" + }); + } + }, 100); + } + + btnExcluirProdutoClick(idprodutos: number) { + if (confirm('Deseja realmente excluir este produto?')) { + this.produtosService.deleteProduto(idprodutos).then(() => { + this.ListaProdutos = this.ListaProdutos.filter(p => p.idprodutos !== idprodutos); + + if (this.FormProduto && this.FormProduto.idprodutos === idprodutos) { + this.cancelarFormulario(); + } + }); + } + } + + cancelarFormulario() { + this.FormProduto = null; + } + + onSubmit() { + if (!this.ValidarFormulario()) { + return; + } + + if (this.FormProduto.idprodutos) { + this.produtosService.updateProduto(this.FormProduto).then(() => { + const index = this.ListaProdutos.findIndex(p => p.idprodutos === this.FormProduto.idprodutos); + + if (index >= 0) { + this.ListaProdutos[index] = { ...this.FormProduto }; + } + + this.cancelarFormulario(); + alert("Produto atualizado com sucesso!"); + }); + + return; + } + + this.produtosService.insertProduto(this.FormProduto).then(resInsert => { + alert("Produto cadastrado com sucesso!"); + this.CarregarProdutos(); + this.cancelarFormulario(); + }); + } + + ValidarFormulario(): boolean { + if (!this.FormProduto) { + return false; + } + + if (!this.FormProduto.idtiposlicenca || this.FormProduto.idtiposlicenca == 0) { + alert("Selecione o tipo de licença."); + return false; + } + + if (this.FormProduto.valor == null || Number(this.FormProduto.valor) < 0) { + alert("Informe um valor válido."); + return false; + } + + return true; + } + + getTipoLicencaDescricao(idtiposlicenca: number): string { + const tipo = (this.TiposLicenca || []).find(x => Number(x.idtiposlicenca) === Number(idtiposlicenca)); + + if (!tipo) { + return 'Nenhum tipo de licença selecionado'; + } + + return tipo.descricao; + } +} \ No newline at end of file diff --git a/src/app/services/agrobase.service.ts b/src/app/services/agrobase.service.ts new file mode 100644 index 0000000..fd48e9d --- /dev/null +++ b/src/app/services/agrobase.service.ts @@ -0,0 +1,55 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpEvent, HttpEventType, HttpHeaders } from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; // Importação do operador map +import { environment } from 'src/environments/environment'; + +@Injectable({ + providedIn: 'root', +}) +export class AgrobaseService { + + constructor(private http: HttpClient) {} + + getArquivosVersao(): Observable { + const version_file_Url: string = environment.ApiUrl + '/agrobase/getVsfData'; + return this.http.get(version_file_Url); + } + + uploadFile(file: File, fileName: string): Observable<{ filePath: string }> { + const formData = new FormData(); + formData.append('file', file, file.name); // Arquivo em si + formData.append('fileName', fileName); // Nome do arquivo desejado no servidor + + return this.http.post<{ filePath: string }>(`${environment.ApiUrl}/agrobase/uploadVersionFiles`, formData, { + headers: new HttpHeaders({ + 'Accept': 'application/json' + }), + reportProgress: true, + observe: 'events' + }).pipe( + map((event: HttpEvent) => { + switch (event.type) { + case HttpEventType.Response: + return event.body; + default: + return { filePath: '' }; + } + }) + ); + } + + deleteVersionFile(filePath: string): Observable { + return this.http.post(`${environment.ApiUrl}/agrobase/deleteVersionFile`, { filePath }); + } + + atualizarVsfFile(jsonData: string): Observable { + return this.http.post(`${environment.ApiUrl}/agrobase/updateVsfFile`, { data: jsonData }, { + headers: new HttpHeaders({ + 'Content-Type': 'application/json' + }), + responseType: 'text' + }); + } + +} diff --git a/src/app/services/bingoService.ts b/src/app/services/bingoService.ts new file mode 100644 index 0000000..24d2657 --- /dev/null +++ b/src/app/services/bingoService.ts @@ -0,0 +1,94 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { environment } from 'src/environments/environment'; +import { BingoCartelasModel, BingoSorteiosModel } from '../models/bingoModel'; +import { Slides } from '../models/sliderModel'; + +@Injectable() +export class BingoService { + + Rota: String = environment.ApiUrl + "/bingo"; + + constructor(private http: HttpClient) { } + + getAllSorteios() { + return this.http.get(`${this.Rota}/getAllSorteios`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }); + } + + getSorteiosRealizar() { + return this.http.get(`${this.Rota}/getSorteiosRealizar`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }); + } + + getAllCartelas() { + return this.http.get(`${this.Rota}/getAllCartelas`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }); + } + + getCartelasSorteio(idbingosorteios: number) { + return this.http.get(`${this.Rota}/getCartelasSorteio/${idbingosorteios}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }); + } + + getCartelasVendidasSorteio(idbingosorteios: number) { + return this.http.get(`${this.Rota}/getCartelasVendidasSorteio/${idbingosorteios}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }); + } + + SalvarBingoSorteio(formSorteio: BingoSorteiosModel) { + const response = this.http + .post(`${this.Rota}/${(formSorteio.idbingosorteios > 0) ? 'update' : 'insert'}BingoSorteio`, formSorteio) + .toPromise(); + return response; + } + + deleteBingoSorteio(idbingosorteios: number) { + const response = this.http + .delete(`${this.Rota}/deleteBingoSorteio/${idbingosorteios}`) + .toPromise(); + return response; + } + + insertBingoCartela(formCartelas: BingoSorteiosModel) { + const response = this.http + .post(`${this.Rota}/insertBingoCartela`, formCartelas) + .toPromise(); + return response; + } + + updateBingoCartela(formCartela: BingoCartelasModel) { + const response = this.http + .patch(`${this.Rota}/updateBingoCartela`, formCartela) + .toPromise(); + return response; + } + + exportarExcel(formSorteio: BingoSorteiosModel) { + const response = this.http + .post(`${this.Rota}/exportarExcel`, formSorteio) + .toPromise(); + return response; + } + +} diff --git a/src/app/services/easy-ava.service.ts b/src/app/services/easy-ava.service.ts new file mode 100644 index 0000000..e7d256e --- /dev/null +++ b/src/app/services/easy-ava.service.ts @@ -0,0 +1,15 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +@Injectable() +export class EasyAVAService { + + constructor(private http: HttpClient) { } + + ProcurarResposta() { + return this.http.get(`https://brainly.com.br/app/ask?entry=hero&q=porque+a+terra+gira`) + .toPromise() + .then(response => response) + .then(data => { return data; }); + } + +} diff --git a/src/app/services/geral.service.ts b/src/app/services/geral.service.ts new file mode 100644 index 0000000..d729e24 --- /dev/null +++ b/src/app/services/geral.service.ts @@ -0,0 +1,24 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { environment } from 'src/environments/environment'; +@Injectable() +export class GeralService { + + Rota: String = environment.ApiUrl + "/arquivos"; + + constructor(private http: HttpClient) { } + + readEnderecos() { + return this.http.get(`../assets/Enderecos.txt`, { responseType: 'text' }) + .toPromise() + .then(response => response) + .then(data => { return data; }); + } + + async writeEnderecos(content: any) { + const response = await this.http.post(`${this.Rota}/editaConfig`, content) + .toPromise(); + return response; + } + +} diff --git a/src/app/services/noticias.service.ts b/src/app/services/noticias.service.ts new file mode 100644 index 0000000..9a0fbd0 --- /dev/null +++ b/src/app/services/noticias.service.ts @@ -0,0 +1,61 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { environment } from 'src/environments/environment'; +import { Noticias } from '../models/noticiasModel'; + +@Injectable() +export class NoticiasService { + + Rota: String = environment.ApiUrl + "/noticias"; + + constructor(private http: HttpClient) { } + + getNoticias() { + return this.http.get(`${this.Rota}/getAllNoticias`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + getNoticiasEn() { + return this.http.get(`${this.Rota}/getNoticiasEn`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + getNoticiasByID(idnoticias: number) { + return this.http.get(`${this.Rota}/getNoticiaByID/${idnoticias}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response'][0]; + }) + } + + insertNoticias(formNoticias: Noticias) { + const response = this.http + .post(`${this.Rota}/insertNoticias`, formNoticias) + .toPromise(); + return response; + } + + updateNoticias(formNoticias: Noticias) { + const response = this.http + .patch(`${this.Rota}/updateNoticias`, formNoticias) + .toPromise(); + return response; + } + + deleteNoticias(idnoticias: number) { + const response = this.http + .delete(`${this.Rota}/deleteNoticias/${idnoticias}`) + .toPromise(); + return response; + } + +} diff --git a/src/app/services/orionService.ts b/src/app/services/orionService.ts new file mode 100644 index 0000000..98f2f62 --- /dev/null +++ b/src/app/services/orionService.ts @@ -0,0 +1,31 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { environment } from 'src/environments/environment'; +import { GeoCoordenadasResponseModel, OrionLogsModel } from '../models/orionModel'; + +@Injectable() +export class OrionService { + + Rota: String = environment.ApiUrl + "/otp"; + + constructor(private http: HttpClient) { } + + getAllLogs() { + return this.http.get(`${this.Rota}/getAllLogs`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + coordenadaToEndereco(Coordenadas: string) { + return this.http.get(`http://api.positionstack.com/v1/reverse?access_key=${environment.GeoAPI}&query=${Coordenadas}`) + .toPromise() + .then(response => response) + .then(data => { + return data; + }) + } + +} diff --git a/src/app/services/produtosService.ts b/src/app/services/produtosService.ts new file mode 100644 index 0000000..b3ee532 --- /dev/null +++ b/src/app/services/produtosService.ts @@ -0,0 +1,61 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { environment } from 'src/environments/environment'; +import { ProdutosModel } from '../models/produtosModel'; + +@Injectable() +export class ProdutosService { + + Rota: String = environment.ApiUrl + "/checkout"; + + constructor(private http: HttpClient) { } + + getProdutosSell(idsistemas: number) { + return this.http.get(`${this.Rota}/getProductsSell/${idsistemas}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }); + } + + getAllProdutos(idsistemas: number) { + return this.http.get(`${this.Rota}/getAllProducts/${idsistemas}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }); + } + + buySistema(idprodutos: number, idusuarios: number, qtd: number) { + const response = this.http + .post(`${this.Rota}/buy`, { idprodutos: idprodutos, idusuarios: idusuarios, qtd: qtd }) + .toPromise(); + return response; + } + + + + insertProduto(formProduto: ProdutosModel) { + const response = this.http + .post(`${this.Rota}/insertProduto`, formProduto) + .toPromise(); + return response; + } + + updateProduto(formProduto: ProdutosModel) { + const response = this.http + .patch(`${this.Rota}/updateProduto`, formProduto) + .toPromise(); + return response; + } + + deleteProduto(idprodutos: number) { + const response = this.http + .delete(`${this.Rota}/deleteProduto/${idprodutos}`) + .toPromise(); + return response; + } + +} diff --git a/src/app/services/sistemas.service.ts b/src/app/services/sistemas.service.ts new file mode 100644 index 0000000..ff363ab --- /dev/null +++ b/src/app/services/sistemas.service.ts @@ -0,0 +1,236 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { environment } from 'src/environments/environment'; +import { Sistemas, TiposDeSistema, Plataformas, Download, Chaves, ListChaves, SistemasDetalhes, SistemasLista, TiposDeLicenca } from '../models/sistemasModel'; + +@Injectable() +export class SistemasService { + + Rota: String = environment.ApiUrl + "/sistemas"; + + constructor(private http: HttpClient) { } + + getSistemas() { + return this.http.get(`${this.Rota}/getSistemas`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + getSistemasEn() { + return this.http.get(`${this.Rota}/getSistemasEn`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + getSistemaByID(idsistemas: number) { + return this.http.get(`${this.Rota}/getSistemaByID/${idsistemas}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response'][0]; + }) + } + + getSistemaByIDLista(idsistemas: number) { + return this.http.get(`${this.Rota}/getSistemaByIDLista/${idsistemas}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response'][0]; + }) + } + + getTiposdesistema() { + return this.http.get(`${this.Rota}/getTiposdesistema`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + getTiposdesistemaByID(idtiposdesistemas: number) { + return this.http.get(`${this.Rota}/getTiposdesistemaByID/${idtiposdesistemas}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + getTiposdelicenca() { + return this.http.get(`${this.Rota}/getTiposdelicenca`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + getTiposdelicencaByID(idtiposlicenca: number) { + return this.http.get(`${this.Rota}/getTiposdelicencaByID/${idtiposlicenca}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + getPlataformas() { + return this.http.get(`${this.Rota}/getPlataformas`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + getPlataformaByID(idplataformas: number) { + return this.http.get(`${this.Rota}/getPlataformaByID/${idplataformas}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + getDetalhesByID(idsistemas: number) { + return this.http.get(`${this.Rota}/getDetalhesByID/${idsistemas}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + getDetalhesByIDEn(idsistemas: number) { + return this.http.get(`${this.Rota}/getDetalhesByIDEn/${idsistemas}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + insertSistemas(formSistemas: Sistemas) { + const response = this.http + .post(`${this.Rota}/insertSistemas`, formSistemas) + .toPromise(); + return response; + } + + updateSistemas(formSistemas: Sistemas) { + const response = this.http + .patch(`${this.Rota}/updateSistemas`, formSistemas) + .toPromise(); + return response; + } + + deleteSistemas(idsistemas: number) { + const response = this.http + .delete(`${this.Rota}/deleteSistemas/${idsistemas}`) + .toPromise(); + return response; + } + + downloadSistema(formDownload: Download) { + const response = this.http + .patch(`${this.Rota}/downloadSistema`, formDownload) + .toPromise(); + return response; + } + + insertSistemaUsuario(formDownload: Download) { + const response = this.http + .post(`${this.Rota}/insertSistemaUsuario`, formDownload) + .toPromise(); + return response; + } + + deleteSistemaUsuario(idsistemas, idusuarios: number) { + const response = this.http + .delete(`${this.Rota}/deleteSistemaUsuario/${idsistemas}/${idusuarios}`) + .toPromise(); + return response; + } + + getChavesSistema(idsistemas, idusuarios: number) { + return this.http.get(`${this.Rota}/getChavesSistema/${idsistemas}/${idusuarios}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + getChavesSistemaLista(idsistemas, idusuarios: number) { + return this.http.get(`${this.Rota}/getChavesSistemaLista/${idsistemas}/${idusuarios}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + insertChave(formChave: Chaves) { + const response = this.http + .post(`${this.Rota}/insertChave`, formChave) + .toPromise(); + return response; + } + + insertDetalhe(formDetalhe: SistemasDetalhes) { + const response = this.http + .post(`${this.Rota}/insertDetalhe`, formDetalhe) + .toPromise(); + return response; + } + + updateDetalhe(formDetalhe: SistemasDetalhes) { + const response = this.http + .patch(`${this.Rota}/updateDetalhe`, formDetalhe) + .toPromise(); + return response; + } + + atualizarListaDetalhes(idsistemas: number) { + return this.http.get(`${this.Rota}/atualizarListaDetalhes/${idsistemas}`) + .toPromise() + .then(response => response) + .then(data => { + return data; + }) + } + + deleteSistemaDetalhe(idsistemasdetalhes: number, idsistemas: number, index: number) { + const response = this.http + .delete(`${this.Rota}/deleteDetalhe/${idsistemasdetalhes}/${idsistemas}/${index}`) + .toPromise(); + return response; + } + + getSistemaVersoes(idsistemas: number) { + return this.http.get(`${this.Rota}/getSistemaVersoes/${idsistemas}`) + .toPromise() + .then(response => response) + .then(data => { + return data; + }); + } + + getSistemaDownloads(idsistemas: number) { + return this.http.get(`${this.Rota}/getSistemaDownloads/${idsistemas}`) + .toPromise() + .then(response => response) + .then(data => { + return data; + }); + } + +} diff --git a/src/app/services/slider.service.ts b/src/app/services/slider.service.ts new file mode 100644 index 0000000..7069129 --- /dev/null +++ b/src/app/services/slider.service.ts @@ -0,0 +1,61 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { environment } from 'src/environments/environment'; +import { Slides } from '../models/sliderModel'; + +@Injectable() +export class SliderService { + + Rota: String = environment.ApiUrl + "/slides"; + + constructor(private http: HttpClient) { } + + getSlides() { + return this.http.get(`${this.Rota}/getAllSlides`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + getSlidesEn() { + return this.http.get(`${this.Rota}/getSlidesEn`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + getSlideByID(idslides: number) { + return this.http.get(`${this.Rota}/getSlideByID/${idslides}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response'][0]; + }) + } + + insertSlides(formSlides: Slides) { + const response = this.http + .post(`${this.Rota}/insertSlides`, formSlides) + .toPromise(); + return response; + } + + updateSlides(formSlides: Slides) { + const response = this.http + .patch(`${this.Rota}/updateSlides`, formSlides) + .toPromise(); + return response; + } + + deleteSlides(idslides: number) { + const response = this.http + .delete(`${this.Rota}/deleteSlides/${idslides}`) + .toPromise(); + return response; + } + +} diff --git a/src/app/services/usuarios.service.ts b/src/app/services/usuarios.service.ts new file mode 100644 index 0000000..7870dda --- /dev/null +++ b/src/app/services/usuarios.service.ts @@ -0,0 +1,122 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Login, Usuarios, TiposDeUsuario, Email, SistemasDoUsuario, RecuperarSenha } from '../models/usuariosModel'; +import { environment } from 'src/environments/environment'; + +@Injectable() +export class UsuariosService { + + Rota: String = environment.ApiUrl + "/users"; + + constructor(private http: HttpClient) { } + + getUsuarios() { + return this.http.get(`${this.Rota}/getUsuarios`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + getUsuarioByID(idusuarios: number) { + return this.http.get(`${this.Rota}/getUsuarioByID/${idusuarios}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response'][0]; + }) + } + + getSistemasDoUsuario(idusuarios: number) { + return this.http.get(`${this.Rota}/getSistemasDoUsuario/${idusuarios}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + AuthUser(formLogin: Login) { + const response = this.http + .post(`${this.Rota}/authUser`, formLogin) + .toPromise(); + return response; + } + + getTiposdeusuario() { + return this.http.get(`${this.Rota}/getTiposdeusuario`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + insertUsuarios(formUsuarios: Usuarios) { + const response = this.http + .post(`${this.Rota}/insertUsuarios`, formUsuarios) + .toPromise(); + return response; + } + + updateUsuarios(formUsuarios: Usuarios) { + const response = this.http + .patch(`${this.Rota}/updateUsuarios`, formUsuarios) + .toPromise(); + return response; + } + + deleteUsuarios(idusuarios: number) { + const response = this.http + .delete(`${this.Rota}/deleteUsuarios/${idusuarios}`) + .toPromise(); + return response; + } + + EnviarEmail(formEmail: Email) { + const response = this.http + .post(`${environment.ApiUrl}/email/enviarEmail`, formEmail) + .toPromise(); + return response; + } + + insertTrocasenha(formTrocasenha: RecuperarSenha) { + const response = this.http + .post(`${this.Rota}/insertTrocasenha`, formTrocasenha) + .toPromise(); + return response; + } + + getTrocasenha() { + return this.http.get(`${this.Rota}/getTrocasenha`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + getTrocasenhaByTag(tag: string) { + return this.http.get(`${this.Rota}/getTrocasenhaByTag/${tag}`) + .toPromise() + .then(response => response) + .then(data => { + return data['response']; + }) + } + + setExpirado(formTrocasenha: RecuperarSenha) { + const response = this.http + .post(`${this.Rota}/setExpirado`, formTrocasenha) + .toPromise(); + return response; + } + + trocaSenha(formUsuarios: Usuarios) { + const response = this.http + .patch(`${this.Rota}/trocaSenha`, formUsuarios) + .toPromise(); + return response; + } +} diff --git a/src/app/sistemas/sistemas.component.html b/src/app/sistemas/sistemas.component.html new file mode 100644 index 0000000..2f92675 --- /dev/null +++ b/src/app/sistemas/sistemas.component.html @@ -0,0 +1,310 @@ +
+ + +
+
+ Backoffice +

{{ TituloJanela }}

+

+ Gerencie sistemas, versões, plataformas, licenças, instaladores e materiais publicados. +

+
+ +
+ +
+
+ + +
+ +
+
+ Dados do sistema +

{{ JanelaModo.Cadastro ? 'Cadastrar sistema' : 'Editar sistema' }}

+
+ + +
+ +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ +
+ Prévia do ícone + +
+ Ícone do sistema + image +
+
+ +
+ Upload em andamento +
+ {{ progressUpload || 0 }}% + Processando arquivo... +
+
+ +
+ +
+ info + {{ MensagemForm }} +
+ +
+ + + +
+ +
+ + +
+ +
+
+
+ apps +
+ +
+ Total de sistemas + {{ ListaSistemas?.length || 0 }} +
+
+ +
+
+ download +
+ +
+ Total de downloads + {{ TotalDownloads }} +
+
+ +
+
+ inventory_2 +
+ +
+ Sem downloads + {{ TotalSemDownloads }} +
+
+
+ +
+
+
+ Sistemas +

Lista de sistemas

+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
IDSistemaDownloadsVersãoAção
+ #{{ Sistema.idsistemas }} + +
+
+ Ícone do sistema +
+ +
+ + {{ Sistema.nome }} + + {{ Sistema.nome_install }} +
+
+
+ + {{ Sistema.downloads || 0 }} + + + {{ Sistema.versaoatual }} + + + + + + + + +
+
+ +
+
+ apps +
+ +

Nenhum sistema encontrado

+

Cadastre o primeiro sistema para começar a organizar os produtos da plataforma.

+ + +
+
+ +
+ +
\ No newline at end of file diff --git a/src/app/sistemas/sistemas.component.scss b/src/app/sistemas/sistemas.component.scss new file mode 100644 index 0000000..ce2ee41 --- /dev/null +++ b/src/app/sistemas/sistemas.component.scss @@ -0,0 +1,646 @@ +.admin-systems-page { + min-height: calc(100vh - 74px); + color: #0f172a; +} + +/* HERO */ + +.admin-hero { + display: flex; + align-items: center; + justify-content: space-between; + gap: 22px; + margin-bottom: 22px; + padding: 32px; + border-radius: 24px; + background: + radial-gradient(circle at top right, rgba(255, 255, 255, 0.14), transparent 34%), + linear-gradient(145deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 22px 55px rgba(15, 23, 42, 0.16); +} + +.eyebrow { + display: inline-block; + margin-bottom: 10px; + color: #071b63; + font-size: 12px; + font-weight: 900; + letter-spacing: 0.14em; + text-transform: uppercase; +} + +.admin-hero .eyebrow { + color: #bfdbfe; +} + +.admin-hero h1 { + margin: 0 0 10px 0; + color: #ffffff; + font-size: 34px; + line-height: 42px; + font-weight: 900; + letter-spacing: -0.04em; +} + +.admin-hero p { + max-width: 760px; + margin: 0; + color: #dbeafe; + font-size: 15px; + line-height: 25px; +} + +/* CARDS */ + +.admin-card { + padding: 28px; + border-radius: 24px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 18px 45px rgba(15, 23, 42, 0.10); +} + +.panel-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 18px; + margin-bottom: 24px; +} + +.panel-header h2 { + margin: 0; + color: #0f172a; + font-size: 26px; + line-height: 34px; + font-weight: 900; + letter-spacing: -0.035em; +} + +/* BUTTONS */ + +.btn-main, +.btn-secondary, +.btn-table { + border: none; + cursor: pointer; + font-weight: 900; + transition: transform 0.18s ease, box-shadow 0.18s ease, background-color 0.18s ease; +} + +.btn-main { + min-height: 44px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 0 18px; + border-radius: 12px; + background: #ffffff; + color: #071b63; + box-shadow: 0 12px 24px rgba(0, 0, 0, 0.16); +} + +.form-submit, +.empty-btn { + background: linear-gradient(135deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 12px 24px rgba(7, 27, 99, 0.20); +} + +.btn-main:hover, +.btn-secondary:hover, +.btn-table:hover { + transform: translateY(-1px); +} + +.btn-main:disabled { + opacity: 0.6; + cursor: not-allowed; + box-shadow: none; +} + +.btn-main .material-icons, +.btn-table .material-icons { + font-size: 19px; +} + +.btn-secondary { + min-height: 44px; + padding: 0 18px; + border-radius: 12px; + background: #f1f5f9; + color: #334155; +} + +/* FORM */ + +.form-panel { + margin-bottom: 22px; +} + +.form-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 18px; +} + +.form-group.full { + grid-column: 1 / -1; +} + +.form-group label { + display: block; + margin-bottom: 7px; + color: #1e293b; + font-size: 14px; + font-weight: 800; +} + +.form-control { + width: 100%; + height: 46px; + padding: 0 14px; + border-radius: 12px; + border: 1px solid #d7deea; + background: #ffffff; + color: #0f172a; + font-size: 15px; + outline: none; + transition: border-color 0.18s ease, box-shadow 0.18s ease; + box-sizing: border-box; +} + +.form-control:focus { + border-color: #071b63; + box-shadow: 0 0 0 4px rgba(7, 27, 99, 0.10); +} + +.file-control { + padding-top: 9px; +} + +.textarea-control { + min-height: 132px; + padding: 14px; + resize: vertical; +} + +.status-toggle { + cursor: pointer; + margin: 0; +} + +.status-toggle input { + display: none; +} + +.toggle-box { + min-height: 38px; + display: inline-flex; + align-items: center; + gap: 7px; + padding: 0 13px; + border-radius: 999px; + background: #f1f5ff; + color: #071b63; + font-size: 13px; + font-weight: 900; + border: 1px solid #dbe6ff; +} + +.toggle-box .material-icons { + font-size: 19px; +} + +.upload-preview-grid { + display: flex; + align-items: stretch; + gap: 16px; + margin-top: 20px; + flex-wrap: wrap; +} + +.icon-preview-card, +.upload-progress-card { + padding: 18px; + border-radius: 20px; + background: #f8fafc; + border: 1px solid #e5e7eb; +} + +.icon-preview-card span { + display: block; + margin-bottom: 12px; + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.icon-preview-box { + width: 104px; + height: 104px; + border-radius: 22px; + background: #ffffff; + border: 1px solid #dbe6ff; + display: flex; + align-items: center; + justify-content: center; +} + +.icon-preview-box img { + width: 74px; + height: 74px; + object-fit: contain; +} + +.icon-preview-box .material-icons { + color: #94a3b8; + font-size: 40px; +} + +.upload-progress-card { + display: flex; + align-items: center; + gap: 16px; +} + +.upload-progress-card img { + width: 62px; + height: 62px; + object-fit: contain; +} + +.upload-progress-card strong { + display: block; + color: #071b63; + font-size: 24px; + font-weight: 900; +} + +.upload-progress-card span { + display: block; + color: #64748b; + font-size: 13px; + font-weight: 800; +} + +.form-message { + margin-top: 18px; + padding: 12px 14px; + border-radius: 14px; + background: #f8fafc; + border: 1px solid #e5e7eb; + display: flex; + align-items: center; + gap: 8px; + color: #334155; + font-size: 14px; + font-weight: 800; +} + +.form-message .material-icons { + color: #071b63; + font-size: 20px; +} + +.form-actions { + display: flex; + justify-content: flex-end; + gap: 12px; + margin-top: 24px; +} + +/* SUMMARY */ + +.summary-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 16px; + margin-bottom: 22px; +} + +.summary-card { + display: flex; + align-items: center; + gap: 16px; + padding: 20px; + border-radius: 20px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 16px 36px rgba(15, 23, 42, 0.08); +} + +.summary-icon { + width: 48px; + height: 48px; + border-radius: 16px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.summary-icon.active { + background: #dcfce7; + color: #166534; +} + +.summary-icon.blocked { + background: #fee2e2; + color: #991b1b; +} + +.summary-icon .material-icons { + font-size: 25px; +} + +.summary-card span { + display: block; + margin-bottom: 4px; + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.summary-card strong { + display: block; + color: #0f172a; + font-size: 22px; + line-height: 28px; + font-weight: 900; +} + +/* TABLE */ + +.table-wrapper { + width: 100%; + overflow-x: auto; +} + +.admin-table { + width: 100%; + border-collapse: separate; + border-spacing: 0 10px; +} + +.admin-table th { + padding: 0 16px 10px 16px; + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; + text-align: left; +} + +.admin-table td { + padding: 16px; + background: #f8fafc; + border-top: 1px solid #e5e7eb; + border-bottom: 1px solid #e5e7eb; + vertical-align: middle; + color: #334155; + font-size: 14px; +} + +.admin-table td:first-child { + border-left: 1px solid #e5e7eb; + border-radius: 16px 0 0 16px; +} + +.admin-table td:last-child { + border-right: 1px solid #e5e7eb; + border-radius: 0 16px 16px 0; +} + +.id-pill, +.version-pill, +.download-pill { + display: inline-flex; + align-items: center; + min-height: 28px; + padding: 0 10px; + border-radius: 999px; + font-size: 12px; + font-weight: 900; +} + +.id-pill { + background: #e0f2fe; + color: #075985; +} + +.version-pill { + background: #f1f5ff; + color: #071b63; +} + +.download-pill.has-downloads { + background: #dcfce7; + color: #166534; +} + +.download-pill.no-downloads { + background: #fee2e2; + color: #991b1b; +} + +.system-cell { + display: flex; + align-items: center; + gap: 12px; +} + +.system-avatar { + width: 46px; + height: 46px; + flex: 0 0 auto; + border-radius: 15px; + background: #ffffff; + border: 1px solid #dbe6ff; + display: flex; + align-items: center; + justify-content: center; +} + +.system-avatar img { + width: 31px; + height: 31px; + object-fit: contain; +} + +.system-cell a { + display: block; + color: #0f172a; + font-size: 14px; + font-weight: 900; + text-decoration: none; +} + +.system-cell a:hover { + text-decoration: underline; +} + +.system-cell small { + display: block; + margin-top: 3px; + color: #64748b; + font-size: 12px; + max-width: 340px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.action-col { + width: 380px; +} + +.actions { + display: flex; + flex-wrap: wrap; + gap: 8px; +} + +.btn-table { + min-height: 36px; + display: inline-flex; + align-items: center; + gap: 6px; + padding: 0 12px; + border-radius: 11px; + color: #ffffff; + font-size: 12px; +} + +.btn-table.details { + background: #0f766e; +} + +.btn-table.products { + background: #7c3aed; +} + +.btn-table.edit { + background: #071b63; +} + +.btn-table.remove { + background: #dc2626; +} + +/* EMPTY */ + +.empty-state { + padding: 42px 20px; + text-align: center; + border-radius: 22px; + background: #f8fafc; + border: 1px dashed #cbd5e1; +} + +.empty-icon { + width: 72px; + height: 72px; + margin: 0 auto 18px auto; + border-radius: 999px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.empty-icon .material-icons { + font-size: 34px; +} + +.empty-state h3 { + margin: 0 0 10px 0; + color: #0f172a; + font-size: 22px; + font-weight: 900; +} + +.empty-state p { + max-width: 560px; + margin: 0 auto 22px auto; + color: #64748b; + font-size: 14px; + line-height: 23px; +} + +/* RESPONSIVE */ + +@media (max-width: 1100px) { + .form-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .summary-grid { + grid-template-columns: 1fr; + } +} + +@media (max-width: 900px) { + .admin-hero, + .panel-header { + flex-direction: column; + align-items: flex-start; + } + + .admin-hero-actions, + .admin-hero-actions .btn-main { + width: 100%; + } + + .form-actions { + flex-direction: column-reverse; + } + + .form-actions button { + width: 100%; + } + + .actions { + flex-direction: column; + } + + .btn-table { + width: 100%; + justify-content: center; + } +} + +@media (max-width: 640px) { + .admin-hero, + .admin-card { + padding: 22px; + } + + .admin-hero h1 { + font-size: 28px; + line-height: 36px; + } + + .form-grid { + grid-template-columns: 1fr; + } + + .upload-preview-grid { + flex-direction: column; + } + + .icon-preview-card, + .upload-progress-card { + width: 100%; + box-sizing: border-box; + } +} \ No newline at end of file diff --git a/src/app/sistemas/sistemas.component.ts b/src/app/sistemas/sistemas.component.ts new file mode 100644 index 0000000..8525870 --- /dev/null +++ b/src/app/sistemas/sistemas.component.ts @@ -0,0 +1,371 @@ +import { Component, OnInit } from '@angular/core'; +import { Sistemas, TiposDeSistema, Plataformas, TiposDeLicenca } from '../models/sistemasModel'; +import { Router, ActivatedRoute } from '@angular/router'; +import { SistemasService } from '../services/sistemas.service'; +import { Modos } from '../models/variaveisModel'; +import { environment, FuncoesGlobais } from 'src/environments/environment'; + +@Component({ + selector: 'app-sistemas', + templateUrl: './sistemas.component.html', + styleUrls: ['./sistemas.component.scss', './../app.component.scss'] +}) +export class SistemasComponent implements OnInit { + + TituloJanela: string = ''; + TextoBotao: string = ''; + MensagemForm: string = ''; + + ListaSistemas: Sistemas[] = []; + + FormSistemas: Sistemas = new Sistemas(); + + TiposDeSistema: TiposDeSistema[] = []; + Plataformas: Plataformas[] = []; + TiposDeLicenca: TiposDeLicenca[] = []; + + JanelaModo: Modos = new Modos(); + + OnUpload: boolean = false; + progressUpload: number = 0; + + Arquivo: File = null; + Icone: File = null; + + CaminhoIcone: string = ''; + + LinkDownload: string = environment.LinkProjeto; + Rota: string = "sistema"; + + constructor( + private router: Router, + private route: ActivatedRoute, + private sistemasService: SistemasService, + private funcoesGlobais: FuncoesGlobais + ) { } + + ngOnInit() { + this.funcoesGlobais.CheckAdminRoute(); + this.CheckRouteMode(); + } + + get TotalDownloads(): number { + return (this.ListaSistemas || []).reduce((total, sistema) => { + return total + Number(sistema.downloads || 0); + }, 0); + } + + get TotalSemDownloads(): number { + return (this.ListaSistemas || []).filter(sistema => Number(sistema.downloads || 0) === 0).length; + } + + CheckRouteMode() { + this.JanelaModo = new Modos(); + this.MensagemForm = ''; + + if (this.router.url.includes('visualizar')) { + this.TituloJanela = "Visualizar sistemas"; + this.CarregarSistemas(); + return; + } + + if (this.router.url.includes('editar')) { + this.TituloJanela = "Editar sistema"; + this.TextoBotao = "Editar"; + + const idSistema = this.route.snapshot.params['id' + this.Rota + 's']; + + this.sistemasService.getSistemaByID(idSistema).then(resSistema => { + this.FormSistemas = resSistema; + this.CaminhoIcone = environment.LinkProjeto + "/" + this.Rota + "s/" + this.FormSistemas.idsistemas + "/icone.png"; + + this.CarregarCombos().then(() => { + this.JanelaModo.Editar = true; + }); + }); + + return; + } + + this.TituloJanela = "Cadastro de sistemas"; + this.TextoBotao = "Salvar"; + + this.FormSistemas = new Sistemas(); + this.FormSistemas.idtiposdesistema = 0; + this.FormSistemas.idplataformas = 0; + this.FormSistemas.idtiposlicenca = 0; + this.FormSistemas.habilitado = false; + + this.CarregarCombos().then(() => { + this.JanelaModo.Cadastro = true; + }); + } + + CarregarSistemas() { + this.sistemasService.getSistemas().then(resSistemas => { + this.ListaSistemas = resSistemas || []; + this.JanelaModo.Visualizar = true; + }); + } + + async CarregarCombos() { + await this.sistemasService.getTiposdesistema().then(resTiposdesistema => { + this.TiposDeSistema = resTiposdesistema || []; + }); + + await this.sistemasService.getPlataformas().then(resPlataformas => { + this.Plataformas = resPlataformas || []; + }); + + await this.sistemasService.getTiposdelicenca().then(resTiposlicenca => { + this.TiposDeLicenca = resTiposlicenca || []; + }); + } + + NovoSistema() { + this.router.navigate(['/dashboard/' + this.Rota + 's/cadastro']); + } + + VoltarLista() { + this.router.navigate(['/dashboard/' + this.Rota + 's/visualizar']); + } + + btnCadastrarClick() { + if (this.TextoBotao == "Lista de " + this.Rota + "s") { + this.VoltarLista(); + return; + } + + if (!this.ValidarFormulario()) { + return; + } + + if (this.JanelaModo.Cadastro) { + this.sistemasService.insertSistemas(this.FormSistemas).then(resInsert => { + this.FormSistemas.idsistemas = resInsert['response'].insertId; + this.FimCadastro(resInsert['status']); + }); + + return; + } + + if (this.JanelaModo.Editar) { + this.sistemasService.updateSistemas(this.FormSistemas).then(resUpdate => { + this.FimCadastro(resUpdate['status']); + }); + } + } + + ValidarFormulario(): boolean { + if (!this.FormSistemas.nome || this.FormSistemas.nome.trim() == '') { + this.MensagemForm = 'Informe o nome do sistema.'; + return false; + } + + if (!this.FormSistemas.descricao || this.FormSistemas.descricao.trim() == '') { + this.MensagemForm = 'Informe a descrição do sistema.'; + return false; + } + + if (!this.FormSistemas.idtiposlicenca || this.FormSistemas.idtiposlicenca == 0) { + this.MensagemForm = 'Selecione o tipo de licença.'; + return false; + } + + if (!this.FormSistemas.versaoatual || this.FormSistemas.versaoatual.trim() == '') { + this.MensagemForm = 'Informe a versão atual.'; + return false; + } + + if (!this.FormSistemas.idtiposdesistema || this.FormSistemas.idtiposdesistema == 0) { + this.MensagemForm = 'Selecione o tipo de sistema.'; + return false; + } + + if (!this.FormSistemas.idplataformas || this.FormSistemas.idplataformas == 0) { + this.MensagemForm = 'Selecione a plataforma.'; + return false; + } + + if (!this.FormSistemas.nome_install || this.FormSistemas.nome_install.trim() == '') { + this.MensagemForm = this.FormSistemas.idplataformas == 6 + ? 'Informe o link de acesso.' + : 'Informe o nome do instalador.'; + + return false; + } + + return true; + } + + FimCadastro(Status) { + if (Status == 200) { + if (this.JanelaModo.Cadastro) { + this.MensagemForm = "Sistema cadastrado com sucesso!"; + } else if (this.JanelaModo.Editar) { + this.MensagemForm = "Sistema atualizado com sucesso!"; + } + + if ((this.JanelaModo.Editar && (this.Arquivo != null || this.Icone != null)) || this.JanelaModo.Cadastro) { + this.CopiarArquivos(); + } else { + setTimeout(() => { + this.VoltarLista(); + }, 800); + } + + return; + } + + if (this.JanelaModo.Cadastro) { + this.MensagemForm = "Erro ao cadastrar sistema."; + } else if (this.JanelaModo.Editar) { + this.MensagemForm = "Erro ao atualizar sistema."; + } + + this.TextoBotao = "Lista de sistemas"; + } + + EditarSistema(Sistema: Sistemas) { + this.router.navigate(['dashboard/' + this.Rota + 's/editar/' + Sistema.idsistemas]); + } + + EditarDetalhesSistema(Sistema: Sistemas) { + this.router.navigate(['dashboard/' + this.Rota + 's/detalhes/' + Sistema.idsistemas]); + } + + VerProdutos(Sistema: Sistemas) { + this.router.navigate(['/dashboard/sistemas/produtos/' + Sistema.idsistemas]); + } + + RemoverSistema(Sistema: Sistemas) { + if (confirm("Tem certeza que deseja remover o sistema '" + Sistema.nome + "'?")) { + this.sistemasService.deleteSistemas(Sistema.idsistemas).then(resDelete => { + this.ListaSistemas = this.ListaSistemas.filter(item => item.idsistemas !== Sistema.idsistemas); + }); + } + } + + onFileChangedArquivo(event) { + if (event.target.files && event.target.files[0]) { + this.Arquivo = event.target.files[0]; + this.OnUpload = true; + this.progressUpload = 0; + + const reader = new FileReader(); + + reader.readAsDataURL(event.target.files[0]); + + reader.onprogress = (event) => { + this.loading(event); + }; + + reader.onload = (event) => { + this.progressUpload = 100; + this.OnUpload = false; + }; + + reader.onerror = () => { + this.OnUpload = false; + this.MensagemForm = "Erro ao carregar arquivo."; + }; + } + } + + onFileChangedIcone(event) { + if (event.target.files && event.target.files[0]) { + this.Icone = event.target.files[0]; + this.OnUpload = true; + this.progressUpload = 0; + + const reader = new FileReader(); + + reader.readAsDataURL(event.target.files[0]); + + reader.onprogress = (event) => { + this.loading(event); + }; + + reader.onload = (event) => { + this.CaminhoIcone = event.target['result']; + this.progressUpload = 100; + this.OnUpload = false; + }; + + reader.onerror = () => { + this.OnUpload = false; + this.MensagemForm = "Erro ao carregar ícone."; + }; + } + } + + async loading(event) { + if (event.lengthComputable) { + const percentLoaded = Math.round((event.loaded / event.total) * 100); + + if (percentLoaded < 100) { + this.progressUpload = percentLoaded; + } + } + } + + CopiarArquivos() { + localStorage.setItem("fileUpload", "0"); + + const req = new XMLHttpRequest(); + const formData = new FormData(); + + formData.append("nome", this.FormSistemas.nome_install || ""); + formData.append("id" + this.Rota + "s", this.FormSistemas.idsistemas.toString()); + formData.append("versaoatual", this.FormSistemas.versaoatual || ""); + + if (this.Arquivo) { + formData.append("arquivo", this.Arquivo); + } + + if (this.Icone) { + formData.append("icone", this.Icone); + } + + req.open("POST", environment.ApiUrl + "/sistemas/copy"); + req.send(formData); + + this.CheckUploadFile(); + + req.onreadystatechange = function () { + if (req.readyState === 4) { + localStorage.setItem("fileUpload", "1"); + } + }; + } + + async CheckUploadFile() { + while (localStorage.getItem("fileUpload") == "0") { + await delay(500); + } + + localStorage.removeItem("fileUpload"); + + if (this.JanelaModo.Cadastro) { + this.MensagemForm = "Arquivo inserido com sucesso."; + } else if (this.JanelaModo.Editar) { + this.MensagemForm = "Arquivo atualizado com sucesso."; + } + + setTimeout(() => { + this.VoltarLista(); + }, 800); + } + + getSistemaLink(Sistema: Sistemas): string { + if (Sistema.idplataformas != 6) { + return this.LinkDownload + '/sistemas/' + Sistema.idsistemas + '/versoes/' + Sistema.versaoatual + '/' + Sistema.nome_install; + } + + return Sistema.nome_install; + } +} + +async function delay(ms: number) { + return new Promise(resolve => setTimeout(resolve, ms)); +} \ No newline at end of file diff --git a/src/app/slider/slider.component.html b/src/app/slider/slider.component.html new file mode 100644 index 0000000..f324488 --- /dev/null +++ b/src/app/slider/slider.component.html @@ -0,0 +1,199 @@ +
+ + +
+
+ Backoffice +

{{ TituloJanela }}

+

+ Gerencie os banners exibidos no slider principal da página inicial. +

+
+ +
+ +
+
+ + +
+ +
+
+ Banner da home +

{{ JanelaModo.Cadastro ? 'Cadastrar slide' : 'Editar slide' }}

+
+ + +
+ +
+
+ + +
+ +
+ + + + + + Recomendado: imagem horizontal em boa resolução, preferencialmente JPG. + +
+
+ +
+ Prévia do slide + +
+ Prévia do slide +
+
+ +
+ info + {{ MensagemForm }} +
+ +
+ + + +
+ +
+ + +
+ +
+
+
+ collections +
+ +
+ Total de slides + {{ ListaSlides?.length || 0 }} +
+
+ +
+
+ visibility +
+ +
+ Habilitados + {{ TotalHabilitados }} +
+
+ +
+
+ visibility_off +
+ +
+ Desabilitados + {{ TotalDesabilitados }} +
+
+
+ +
+
+
+ Slider +

Slides cadastrados

+
+
+ +
+ +
+ +
+ Imagem do slide +
+ +
+
+ #{{ Slider.idslides }} + + + {{ Slider.habilitado ? 'Habilitado' : 'Desabilitado' }} + +
+ +

{{ Slider.descricao || 'Slide sem descrição' }}

+ +
+ + + +
+
+ +
+ +
+ +
+
+ collections +
+ +

Nenhum slide cadastrado

+ +

+ Cadastre o primeiro banner para exibir no slider da página inicial. +

+ + +
+
+ +
+ +
\ No newline at end of file diff --git a/src/app/slider/slider.component.scss b/src/app/slider/slider.component.scss new file mode 100644 index 0000000..8da5916 --- /dev/null +++ b/src/app/slider/slider.component.scss @@ -0,0 +1,581 @@ +.slides-admin-page { + min-height: calc(100vh - 74px); + color: #0f172a; +} + +/* HERO */ + +.admin-hero { + display: flex; + align-items: center; + justify-content: space-between; + gap: 22px; + margin-bottom: 22px; + padding: 32px; + border-radius: 24px; + background: + radial-gradient(circle at top right, rgba(255, 255, 255, 0.14), transparent 34%), + linear-gradient(145deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 22px 55px rgba(15, 23, 42, 0.16); +} + +.eyebrow { + display: inline-block; + margin-bottom: 10px; + color: #071b63; + font-size: 12px; + font-weight: 900; + letter-spacing: 0.14em; + text-transform: uppercase; +} + +.admin-hero .eyebrow { + color: #bfdbfe; +} + +.admin-hero h1 { + margin: 0 0 10px 0; + color: #ffffff; + font-size: 34px; + line-height: 42px; + font-weight: 900; + letter-spacing: -0.04em; +} + +.admin-hero p { + max-width: 760px; + margin: 0; + color: #dbeafe; + font-size: 15px; + line-height: 25px; +} + +/* CARDS */ + +.admin-card { + margin-bottom: 22px; + padding: 28px; + border-radius: 24px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 18px 45px rgba(15, 23, 42, 0.10); +} + +.panel-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 18px; + margin-bottom: 24px; +} + +.panel-header h2 { + margin: 0; + color: #0f172a; + font-size: 26px; + line-height: 34px; + font-weight: 900; + letter-spacing: -0.035em; +} + +/* BUTTONS */ + +.btn-main, +.btn-secondary, +.btn-card { + border: none; + cursor: pointer; + font-weight: 900; + transition: transform 0.18s ease, box-shadow 0.18s ease, background-color 0.18s ease, opacity 0.18s ease; +} + +.btn-main { + min-height: 44px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 0 18px; + border-radius: 12px; + background: #ffffff; + color: #071b63; + box-shadow: 0 12px 24px rgba(0, 0, 0, 0.16); +} + +.form-submit, +.empty-btn { + background: linear-gradient(135deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 12px 24px rgba(7, 27, 99, 0.20); +} + +.btn-main:hover, +.btn-secondary:hover, +.btn-card:hover { + transform: translateY(-1px); +} + +.btn-main .material-icons, +.btn-card .material-icons { + font-size: 19px; +} + +.btn-secondary { + min-height: 44px; + padding: 0 18px; + border-radius: 12px; + background: #f1f5f9; + color: #334155; +} + +/* FORM */ + +.form-panel { + margin-bottom: 22px; +} + +.form-grid { + display: grid; + grid-template-columns: 1fr; + gap: 18px; +} + +.form-group label { + display: block; + margin-bottom: 7px; + color: #1e293b; + font-size: 14px; + font-weight: 800; +} + +.form-control { + width: 100%; + height: 46px; + padding: 0 14px; + border-radius: 12px; + border: 1px solid #d7deea; + background: #ffffff; + color: #0f172a; + font-size: 15px; + outline: none; + transition: border-color 0.18s ease, box-shadow 0.18s ease; + box-sizing: border-box; +} + +.form-control:focus { + border-color: #071b63; + box-shadow: 0 0 0 4px rgba(7, 27, 99, 0.10); +} + +.status-toggle { + cursor: pointer; + margin: 0; +} + +.status-toggle input { + display: none; +} + +.toggle-box { + min-height: 38px; + display: inline-flex; + align-items: center; + gap: 7px; + padding: 0 13px; + border-radius: 999px; + background: #f1f5ff; + color: #071b63; + font-size: 13px; + font-weight: 900; + border: 1px solid #dbe6ff; +} + +.toggle-box .material-icons { + font-size: 19px; +} + +.file-label { + min-height: 42px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 0 14px; + border-radius: 12px; + background: #f1f5ff; + color: #071b63; + font-size: 13px; + font-weight: 900; + cursor: pointer; + border: 1px solid #dbe6ff; +} + +.file-label input { + display: none; +} + +.file-label .material-icons { + font-size: 20px; +} + +.field-hint { + display: block; + margin-top: 8px; + color: #64748b; + font-size: 12px; + font-weight: 700; +} + +.slide-preview-section { + margin-top: 22px; +} + +.slide-preview-section > span { + display: block; + margin-bottom: 10px; + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.slide-preview-box { + overflow: hidden; + border-radius: 20px; + background: #f8fafc; + border: 1px solid #e5e7eb; + height: 330px; +} + +.slide-preview-box img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.form-message { + margin-top: 18px; + padding: 12px 14px; + border-radius: 14px; + background: #f8fafc; + border: 1px solid #e5e7eb; + display: flex; + align-items: center; + gap: 8px; + color: #334155; + font-size: 14px; + font-weight: 800; +} + +.form-message .material-icons { + color: #071b63; + font-size: 20px; +} + +.form-actions { + display: flex; + justify-content: flex-end; + gap: 12px; + margin-top: 24px; +} + +/* SUMMARY */ + +.summary-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 16px; + margin-bottom: 22px; +} + +.summary-card { + display: flex; + align-items: center; + gap: 16px; + padding: 20px; + border-radius: 20px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 16px 36px rgba(15, 23, 42, 0.08); +} + +.summary-icon { + width: 48px; + height: 48px; + border-radius: 16px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.summary-icon.active { + background: #dcfce7; + color: #166534; +} + +.summary-icon.blocked { + background: #fee2e2; + color: #991b1b; +} + +.summary-icon .material-icons { + font-size: 25px; +} + +.summary-card span { + display: block; + margin-bottom: 4px; + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.summary-card strong { + display: block; + color: #0f172a; + font-size: 22px; + line-height: 28px; + font-weight: 900; +} + +/* SLIDES GRID */ + +.slides-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 18px; +} + +.slide-card { + position: relative; + overflow: hidden; + border-radius: 22px; + background: #f8fafc; + border: 1px solid #e5e7eb; + transition: transform 0.18s ease, box-shadow 0.18s ease; +} + +.slide-card::before { + content: ""; + position: absolute; + left: 0; + top: 0; + width: 7px; + height: 100%; + z-index: 2; + background: #94a3b8; +} + +.slide-card:hover { + transform: translateY(-3px); + box-shadow: 0 18px 42px rgba(15, 23, 42, 0.12); +} + +.slide-enabled { + border-color: rgba(22, 163, 74, 0.26); +} + +.slide-enabled::before { + background: #16a34a; +} + +.slide-disabled { + border-color: rgba(220, 38, 38, 0.22); +} + +.slide-disabled::before { + background: #dc2626; +} + +.slide-image-wrapper { + height: 220px; + background: #e5e7eb; + overflow: hidden; +} + +.slide-image { + width: 100%; + height: 100%; + object-fit: cover; +} + +.slide-card-body { + padding: 18px; +} + +.slide-card-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + margin-bottom: 14px; +} + +.id-pill { + min-height: 28px; + display: inline-flex; + align-items: center; + padding: 0 10px; + border-radius: 999px; + background: #e0f2fe; + color: #075985; + font-size: 12px; + font-weight: 900; +} + +.status-badge { + min-height: 28px; + display: inline-flex; + align-items: center; + padding: 0 12px; + border-radius: 999px; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.06em; +} + +.status-badge.enabled { + background: #dcfce7; + color: #166534; +} + +.status-badge.disabled { + background: #fee2e2; + color: #991b1b; +} + +.slide-card h3 { + min-height: 48px; + margin: 0 0 16px 0; + color: #0f172a; + font-size: 18px; + line-height: 24px; + font-weight: 900; +} + +.slide-actions { + display: flex; + gap: 10px; +} + +.btn-card { + min-height: 40px; + flex: 1; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 7px; + padding: 0 14px; + border-radius: 12px; + color: #ffffff; + font-size: 12px; +} + +.btn-card.edit { + background: #071b63; +} + +.btn-card.remove { + background: #dc2626; +} + +/* EMPTY */ + +.empty-state { + padding: 42px 20px; + text-align: center; + border-radius: 22px; + background: #f8fafc; + border: 1px dashed #cbd5e1; +} + +.empty-icon { + width: 72px; + height: 72px; + margin: 0 auto 18px auto; + border-radius: 999px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.empty-icon .material-icons { + font-size: 34px; +} + +.empty-state h3 { + margin: 0 0 10px 0; + color: #0f172a; + font-size: 22px; + font-weight: 900; +} + +.empty-state p { + max-width: 560px; + margin: 0 auto 22px auto; + color: #64748b; + font-size: 14px; + line-height: 23px; +} + +/* RESPONSIVE */ + +@media (max-width: 1000px) { + .summary-grid { + grid-template-columns: 1fr; + } + + .slides-grid { + grid-template-columns: 1fr; + } +} + +@media (max-width: 760px) { + .admin-hero, + .panel-header { + flex-direction: column; + align-items: flex-start; + } + + .admin-hero-actions, + .admin-hero-actions .btn-main { + width: 100%; + } + + .form-actions { + flex-direction: column-reverse; + } + + .form-actions button { + width: 100%; + } + + .slide-preview-box { + height: 240px; + } +} + +@media (max-width: 520px) { + .admin-hero, + .admin-card { + padding: 22px; + } + + .admin-hero h1 { + font-size: 28px; + line-height: 36px; + } + + .slide-actions { + flex-direction: column; + } +} \ No newline at end of file diff --git a/src/app/slider/slider.component.ts b/src/app/slider/slider.component.ts new file mode 100644 index 0000000..2760f48 --- /dev/null +++ b/src/app/slider/slider.component.ts @@ -0,0 +1,214 @@ +import { Component, OnInit } from '@angular/core'; +import { Slides, SlidesList } from '../models/sliderModel'; +import { Modos } from '../models/variaveisModel'; +import { Router, ActivatedRoute } from '@angular/router'; +import { SliderService } from '../services/slider.service'; +import { environment } from 'src/environments/environment'; + +@Component({ + selector: 'app-slider', + templateUrl: './slider.component.html', + styleUrls: ['./slider.component.scss', './../app.component.scss'] +}) +export class SliderComponent implements OnInit { + + TituloJanela: string = ''; + TextoBotao: string = ''; + MensagemForm: string = ''; + + FormSlider: Slides = new Slides(); + ListaSlides: SlidesList[] = []; + + JanelaModo: Modos = new Modos(); + + Imagem: File = null; + CaminhoImagem: string = null; + + Rota: string = "slide"; + + constructor( + private route: ActivatedRoute, + private router: Router, + private sliderService: SliderService, + ) { } + + ngOnInit() { + this.CheckRouteMode(); + } + + get TotalHabilitados(): number { + return (this.ListaSlides || []).filter(slide => slide.habilitado).length; + } + + get TotalDesabilitados(): number { + return (this.ListaSlides || []).filter(slide => !slide.habilitado).length; + } + + CheckRouteMode() { + this.JanelaModo = new Modos(); + this.MensagemForm = ''; + + if (this.router.url.includes('visualizar')) { + this.JanelaModo.Visualizar = true; + this.TituloJanela = "Visualizar slides"; + + this.CarregarSlides(); + return; + } + + if (this.router.url.includes('editar')) { + this.JanelaModo.Editar = true; + this.TituloJanela = "Editar slide"; + this.TextoBotao = "Editar"; + + this.sliderService.getSlideByID(this.route.snapshot.params['id' + this.Rota + 's']).then(resSlide => { + this.FormSlider = resSlide; + this.CaminhoImagem = environment.LinkProjeto + "/imagens/" + this.Rota + "s/slide_" + this.FormSlider.idslides + ".jpg"; + }); + + return; + } + + this.JanelaModo.Cadastro = true; + this.TituloJanela = "Cadastro de slides"; + this.TextoBotao = "Salvar"; + + this.FormSlider = new Slides(); + this.FormSlider.habilitado = true; + } + + CarregarSlides() { + this.sliderService.getSlides().then(resSlides => { + this.ListaSlides = resSlides || []; + }); + } + + NovoSlide() { + this.router.navigate(['/dashboard/admin/' + this.Rota + 's']); + } + + VoltarLista() { + this.router.navigate(['/dashboard/admin/' + this.Rota + 's/visualizar']); + } + + btnCadastrarClick() { + if (this.TextoBotao == "Lista de " + this.Rota + "s") { + this.VoltarLista(); + return; + } + + if (!this.ValidarFormulario()) { + return; + } + + if (this.JanelaModo.Cadastro) { + this.sliderService.insertSlides(this.FormSlider).then(resInsert => { + this.FormSlider.idslides = resInsert['response'].insertId; + this.FimCadastro(resInsert['status']); + }); + + return; + } + + if (this.JanelaModo.Editar) { + this.sliderService.updateSlides(this.FormSlider).then(resUpdate => { + this.FimCadastro(resUpdate['status']); + }); + } + } + + ValidarFormulario(): boolean { + if (!this.FormSlider.descricao || this.FormSlider.descricao.trim() == '') { + this.MensagemForm = "Informe a descrição do slide."; + return false; + } + + if (this.JanelaModo.Cadastro && !this.Imagem) { + this.MensagemForm = "Selecione uma imagem para o slide."; + return false; + } + + return true; + } + + FimCadastro(Status) { + if (Status == 200) { + if (this.JanelaModo.Cadastro) { + this.MensagemForm = "Slide cadastrado com sucesso!"; + } else if (this.JanelaModo.Editar) { + this.MensagemForm = "Slide atualizado com sucesso!"; + } + + const deveCopiarImagem = + this.Imagem != null && + ( + this.JanelaModo.Cadastro || + this.JanelaModo.Editar + ); + + if (deveCopiarImagem) { + this.CopiarArquivos(); + } + + setTimeout(() => { + this.VoltarLista(); + }, 900); + + return; + } + + if (this.JanelaModo.Cadastro) { + this.MensagemForm = "Erro ao cadastrar slide."; + } else if (this.JanelaModo.Editar) { + this.MensagemForm = "Erro ao atualizar slide."; + } + + this.TextoBotao = "Lista de slides"; + } + + EditarSlider(Slider: Slides) { + this.router.navigate(['dashboard/admin/' + this.Rota + 's/editar/' + Slider.idslides]); + } + + RemoverSlider(Slider: Slides) { + if (confirm("Tem certeza que deseja remover o slide '" + Slider.descricao + "'?")) { + this.sliderService.deleteSlides(Slider.idslides).then(resDelete => { + this.ListaSlides = this.ListaSlides.filter(item => item.idslides !== Slider.idslides); + }); + } + } + + CopiarArquivos() { + const req = new XMLHttpRequest(); + const formData = new FormData(); + + formData.append("id" + this.Rota + "s", this.FormSlider.idslides.toString()); + formData.append("imagem", this.Imagem); + + req.open("POST", environment.ApiUrl + "/" + this.Rota + "s/copy"); + req.send(formData); + + req.onreadystatechange = function () { + if (req.readyState === 4) { + console.log("Slide copiado com sucesso!"); + } + }; + } + + onFileChangedIcone(event) { + if (event.target.files && event.target.files[0]) { + this.Imagem = event.target.files[0]; + + const reader = new FileReader(); + reader.readAsDataURL(event.target.files[0]); + + reader.onload = (event) => { + this.CaminhoImagem = event.target['result'].toString(); + }; + } + } + + LinkImagemSlide(Slider: SlidesList): string { + return environment.LinkProjeto + "/imagens/" + this.Rota + "s/slide_" + Slider.idslides + ".jpg"; + } +} \ No newline at end of file diff --git a/src/app/users/users.component.html b/src/app/users/users.component.html new file mode 100644 index 0000000..23409ed --- /dev/null +++ b/src/app/users/users.component.html @@ -0,0 +1,230 @@ +
+ + +
+
+ Backoffice +

{{ TituloJanela }}

+

+ Gerencie usuários, permissões de acesso e status de habilitação da plataforma. +

+
+ +
+ +
+
+ + +
+ +
+
+ Dados do usuário +

{{ JanelaModo.Cadastro ? 'Cadastrar usuário' : 'Editar usuário' }}

+
+ + +
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+ +
+ info + {{ MensagemForm }} +
+ +
+ + + +
+ +
+ + +
+ +
+
+
+ group +
+ +
+ Total de usuários + {{ ListaUsuario?.length || 0 }} +
+
+ +
+
+ verified_user +
+ +
+ Habilitados + {{ TotalHabilitados }} +
+
+ +
+
+ block +
+ +
+ Desabilitados + {{ TotalDesabilitados }} +
+
+
+ +
+
+
+ Usuários +

Lista de usuários

+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
IDNomeUsuárioCadastroAção
+ #{{ Usuario.idusuarios }} + +
+
+ {{ getInitials(Usuario.nome) }} +
+ +
+ {{ Usuario.nome }} + {{ Usuario.email }} +
+
+
+ {{ Usuario.usuario }} + {{ Usuario.data_cadastro | date:'dd/MM/yyyy' }} + + + +
+
+ +
+
+ person_off +
+ +

Nenhum usuário encontrado

+

Cadastre o primeiro usuário para iniciar o gerenciamento.

+ + +
+
+ +
+ +
\ No newline at end of file diff --git a/src/app/users/users.component.scss b/src/app/users/users.component.scss new file mode 100644 index 0000000..6202844 --- /dev/null +++ b/src/app/users/users.component.scss @@ -0,0 +1,500 @@ +.admin-users-page { + min-height: calc(100vh - 74px); + color: #0f172a; +} + +/* HERO */ + +.admin-hero { + display: flex; + align-items: center; + justify-content: space-between; + gap: 22px; + margin-bottom: 22px; + padding: 32px; + border-radius: 24px; + background: + radial-gradient(circle at top right, rgba(255, 255, 255, 0.14), transparent 34%), + linear-gradient(145deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 22px 55px rgba(15, 23, 42, 0.16); +} + +.eyebrow { + display: inline-block; + margin-bottom: 10px; + color: #071b63; + font-size: 12px; + font-weight: 900; + letter-spacing: 0.14em; + text-transform: uppercase; +} + +.admin-hero .eyebrow { + color: #bfdbfe; +} + +.admin-hero h1 { + margin: 0 0 10px 0; + color: #ffffff; + font-size: 34px; + line-height: 42px; + font-weight: 900; + letter-spacing: -0.04em; +} + +.admin-hero p { + max-width: 680px; + margin: 0; + color: #dbeafe; + font-size: 15px; + line-height: 25px; +} + +/* CARDS */ + +.admin-card { + padding: 28px; + border-radius: 24px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 18px 45px rgba(15, 23, 42, 0.10); +} + +.panel-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 18px; + margin-bottom: 24px; +} + +.panel-header h2 { + margin: 0; + color: #0f172a; + font-size: 26px; + line-height: 34px; + font-weight: 900; + letter-spacing: -0.035em; +} + +/* BUTTONS */ + +.btn-main, +.btn-secondary, +.btn-table { + border: none; + cursor: pointer; + font-weight: 900; + transition: transform 0.18s ease, box-shadow 0.18s ease, background-color 0.18s ease; +} + +.btn-main { + min-height: 44px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 0 18px; + border-radius: 12px; + background: #ffffff; + color: #071b63; + box-shadow: 0 12px 24px rgba(0, 0, 0, 0.16); +} + +.form-actions .btn-main, +.empty-state .btn-main { + background: linear-gradient(135deg, #071b63, #12358f); + color: #ffffff; + box-shadow: 0 12px 24px rgba(7, 27, 99, 0.20); +} + +.btn-main:hover, +.btn-secondary:hover, +.btn-table:hover { + transform: translateY(-1px); +} + +.btn-main .material-icons, +.btn-table .material-icons { + font-size: 19px; +} + +.btn-secondary { + min-height: 44px; + padding: 0 18px; + border-radius: 12px; + background: #f1f5f9; + color: #334155; +} + +/* FORM */ + +.form-panel { + margin-bottom: 22px; +} + +.form-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 18px; +} + +.form-group label { + display: block; + margin-bottom: 7px; + color: #1e293b; + font-size: 14px; + font-weight: 800; +} + +.form-control { + width: 100%; + height: 46px; + padding: 0 14px; + border-radius: 12px; + border: 1px solid #d7deea; + background: #ffffff; + color: #0f172a; + font-size: 15px; + outline: none; + transition: border-color 0.18s ease, box-shadow 0.18s ease; + box-sizing: border-box; +} + +.form-control:focus { + border-color: #071b63; + box-shadow: 0 0 0 4px rgba(7, 27, 99, 0.10); +} + +.status-toggle { + cursor: pointer; + margin: 0; +} + +.status-toggle input { + display: none; +} + +.toggle-box { + min-height: 38px; + display: inline-flex; + align-items: center; + gap: 7px; + padding: 0 13px; + border-radius: 999px; + background: #f1f5ff; + color: #071b63; + font-size: 13px; + font-weight: 900; + border: 1px solid #dbe6ff; +} + +.toggle-box .material-icons { + font-size: 19px; +} + +.form-message { + margin-top: 18px; + padding: 12px 14px; + border-radius: 14px; + background: #f8fafc; + border: 1px solid #e5e7eb; + display: flex; + align-items: center; + gap: 8px; + color: #334155; + font-size: 14px; + font-weight: 800; +} + +.form-message .material-icons { + color: #071b63; + font-size: 20px; +} + +.form-actions { + display: flex; + justify-content: flex-end; + gap: 12px; + margin-top: 24px; +} + +/* SUMMARY */ + +.summary-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 16px; + margin-bottom: 22px; +} + +.summary-card { + display: flex; + align-items: center; + gap: 16px; + padding: 20px; + border-radius: 20px; + background: #ffffff; + border: 1px solid rgba(148, 163, 184, 0.22); + box-shadow: 0 16px 36px rgba(15, 23, 42, 0.08); +} + +.summary-icon { + width: 48px; + height: 48px; + border-radius: 16px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.summary-icon.active { + background: #dcfce7; + color: #166534; +} + +.summary-icon.blocked { + background: #fee2e2; + color: #991b1b; +} + +.summary-icon .material-icons { + font-size: 25px; +} + +.summary-card span { + display: block; + margin-bottom: 4px; + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.summary-card strong { + display: block; + color: #0f172a; + font-size: 22px; + line-height: 28px; + font-weight: 900; +} + +/* TABLE */ + +.table-wrapper { + width: 100%; + overflow-x: auto; +} + +.admin-table { + width: 100%; + border-collapse: separate; + border-spacing: 0 10px; +} + +.admin-table th { + padding: 0 16px 10px 16px; + color: #64748b; + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.08em; + text-align: left; +} + +.admin-table td { + padding: 16px; + background: #f8fafc; + border-top: 1px solid #e5e7eb; + border-bottom: 1px solid #e5e7eb; + vertical-align: middle; + color: #334155; + font-size: 14px; +} + +.admin-table td:first-child { + border-left: 1px solid #e5e7eb; + border-radius: 16px 0 0 16px; +} + +.admin-table td:last-child { + border-right: 1px solid #e5e7eb; + border-radius: 0 16px 16px 0; +} + +.id-pill, +.username-pill { + display: inline-flex; + align-items: center; + min-height: 28px; + padding: 0 10px; + border-radius: 999px; + font-size: 12px; + font-weight: 900; +} + +.id-pill { + background: #e0f2fe; + color: #075985; +} + +.username-pill { + background: #f1f5ff; + color: #071b63; +} + +.user-cell { + display: flex; + align-items: center; + gap: 12px; +} + +.avatar { + width: 42px; + height: 42px; + flex: 0 0 auto; + border-radius: 14px; + background: linear-gradient(135deg, #071b63, #12358f); + color: #ffffff; + display: flex; + align-items: center; + justify-content: center; + font-size: 13px; + font-weight: 900; +} + +.user-cell strong { + display: block; + color: #0f172a; + font-size: 14px; + font-weight: 900; +} + +.user-cell small { + display: block; + margin-top: 3px; + color: #64748b; + font-size: 12px; +} + +.action-col { + width: 220px; +} + +.actions { + display: flex; + gap: 8px; +} + +.btn-table { + min-height: 36px; + display: inline-flex; + align-items: center; + gap: 6px; + padding: 0 12px; + border-radius: 11px; + color: #ffffff; + font-size: 12px; +} + +.btn-table.edit { + background: #071b63; +} + +.btn-table.remove { + background: #dc2626; +} + +/* EMPTY */ + +.empty-state { + padding: 42px 20px; + text-align: center; + border-radius: 22px; + background: #f8fafc; + border: 1px dashed #cbd5e1; +} + +.empty-icon { + width: 72px; + height: 72px; + margin: 0 auto 18px auto; + border-radius: 999px; + display: flex; + align-items: center; + justify-content: center; + background: #f1f5ff; + color: #071b63; +} + +.empty-icon .material-icons { + font-size: 34px; +} + +.empty-state h3 { + margin: 0 0 10px 0; + color: #0f172a; + font-size: 22px; + font-weight: 900; +} + +.empty-state p { + max-width: 520px; + margin: 0 auto 22px auto; + color: #64748b; + font-size: 14px; + line-height: 23px; +} + +/* RESPONSIVE */ + +@media (max-width: 900px) { + .admin-hero, + .panel-header { + flex-direction: column; + align-items: flex-start; + } + + .summary-grid, + .form-grid { + grid-template-columns: 1fr; + } + + .admin-hero-actions, + .admin-hero-actions .btn-main { + width: 100%; + } + + .form-actions { + flex-direction: column-reverse; + } + + .form-actions button { + width: 100%; + } +} + +@media (max-width: 640px) { + .admin-hero, + .admin-card { + padding: 22px; + } + + .admin-hero h1 { + font-size: 28px; + line-height: 36px; + } + + .actions { + flex-direction: column; + } + + .btn-table { + width: 100%; + justify-content: center; + } +} \ No newline at end of file diff --git a/src/app/users/users.component.ts b/src/app/users/users.component.ts new file mode 100644 index 0000000..1fddc73 --- /dev/null +++ b/src/app/users/users.component.ts @@ -0,0 +1,206 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { Usuarios, TiposDeUsuario } from '../models/usuariosModel'; +import { UsuariosService } from '../services/usuarios.service'; +import { Modos } from '../models/variaveisModel'; +import { FuncoesGlobais } from 'src/environments/environment'; + +@Component({ + selector: 'app-users', + templateUrl: './users.component.html', + styleUrls: ['./users.component.scss', './../app.component.scss'] +}) +export class UsersComponent implements OnInit { + + TituloJanela: string = ''; + TextoBotao: string = ''; + MensagemForm: string = ''; + + FormUsuario: Usuarios = new Usuarios(); + + ListaUsuario: Usuarios[] = []; + TiposDeUsuario: TiposDeUsuario[] = []; + + JanelaModo: Modos = new Modos(); + Rota: string = "usuario"; + + constructor( + private router: Router, + private route: ActivatedRoute, + private usuaruisService: UsuariosService, + private funcoesGlobais: FuncoesGlobais + ) { } + + ngOnInit() { + this.funcoesGlobais.CheckAdminRoute(); + + this.FormUsuario.idtiposdeusuario = 0; + this.FormUsuario.habilitado = false; + + this.usuaruisService.getTiposdeusuario().then(resTiposdeusuario => { + this.TiposDeUsuario = resTiposdeusuario || []; + }); + + this.CheckRouteMode(); + } + + get TotalHabilitados(): number { + return (this.ListaUsuario || []).filter(usuario => usuario.habilitado).length; + } + + get TotalDesabilitados(): number { + return (this.ListaUsuario || []).filter(usuario => !usuario.habilitado).length; + } + + CheckRouteMode() { + this.JanelaModo = new Modos(); + this.MensagemForm = ''; + + if (this.router.url.includes('visualizar')) { + this.JanelaModo.Visualizar = true; + this.TituloJanela = "Visualizar usuários"; + + this.CarregarUsuarios(); + return; + } + + if (this.router.url.includes('editar')) { + this.JanelaModo.Editar = true; + this.TituloJanela = "Editar usuário"; + this.TextoBotao = "Editar"; + + this.usuaruisService.getUsuarioByID(this.route.snapshot.params['id' + this.Rota + 's']).then(resUsuario => { + this.FormUsuario = resUsuario; + }); + + return; + } + + this.JanelaModo.Cadastro = true; + this.TituloJanela = "Cadastro de usuários"; + this.TextoBotao = "Salvar"; + } + + CarregarUsuarios() { + this.usuaruisService.getUsuarios().then(resUsuarios => { + this.ListaUsuario = resUsuarios || []; + }); + } + + NovoUsuario() { + this.router.navigate(['/dashboard/' + this.Rota + 's/cadastro']); + } + + VoltarLista() { + this.router.navigate(['/dashboard/' + this.Rota + 's/visualizar']); + } + + btnCadastrarClick() { + if (this.TextoBotao == "Lista de " + this.Rota + "s") { + this.VoltarLista(); + return; + } + + if (!this.ValidarFormulario()) { + return; + } + + if (this.JanelaModo.Cadastro) { + this.usuaruisService.insertUsuarios(this.FormUsuario).then(resInsertusuarios => { + this.FimCadastro(resInsertusuarios['status']); + }); + + return; + } + + if (this.JanelaModo.Editar) { + this.usuaruisService.updateUsuarios(this.FormUsuario).then(resUpdateusuarios => { + this.FimCadastro(resUpdateusuarios['status']); + }); + } + } + + ValidarFormulario(): boolean { + if (!this.FormUsuario.nome || this.FormUsuario.nome.trim() == '') { + this.MensagemForm = 'Informe o nome do usuário.'; + return false; + } + + if (!this.FormUsuario.email || this.FormUsuario.email.trim() == '') { + this.MensagemForm = 'Informe o e-mail do usuário.'; + return false; + } + + if (!this.FormUsuario.usuario || this.FormUsuario.usuario.trim() == '') { + this.MensagemForm = 'Informe o login do usuário.'; + return false; + } + + if (this.JanelaModo.Cadastro && (!this.FormUsuario.senha || this.FormUsuario.senha.trim() == '')) { + this.MensagemForm = 'Informe a senha do usuário.'; + return false; + } + + if (!this.FormUsuario.cpf || this.FormUsuario.cpf.trim() == '') { + this.MensagemForm = 'Informe o CPF do usuário.'; + return false; + } + + if (!this.FormUsuario.idtiposdeusuario || this.FormUsuario.idtiposdeusuario == 0) { + this.MensagemForm = 'Selecione o tipo de usuário.'; + return false; + } + + return true; + } + + FimCadastro(Status) { + if (Status == 200) { + if (this.JanelaModo.Cadastro) { + this.MensagemForm = "Usuário cadastrado com sucesso!"; + } else if (this.JanelaModo.Editar) { + this.MensagemForm = "Usuário atualizado com sucesso!"; + } + + setTimeout(() => { + this.VoltarLista(); + }, 800); + + return; + } + + if (this.JanelaModo.Cadastro) { + this.MensagemForm = "Erro ao cadastrar usuário."; + } else if (this.JanelaModo.Editar) { + this.MensagemForm = "Erro ao atualizar usuário."; + } + + this.TextoBotao = "Lista de usuários"; + } + + EditarUsuario(Usuario) { + this.router.navigate(['dashboard/' + this.Rota + 's/editar/' + Usuario.idusuarios]); + } + + RemoverUsuario(Usuario) { + if (confirm("Tem certeza que deseja remover o usuário '" + Usuario.usuario + "' do cliente '" + Usuario.nome + "'?")) { + this.usuaruisService.deleteUsuarios(Usuario.idusuarios).then(resDelete => { + this.ListaUsuario = this.ListaUsuario.filter(item => item.idusuarios !== Usuario.idusuarios); + }); + } + } + + getInitials(nome: string): string { + if (!nome) { + return 'US'; + } + + const partes = nome.trim().split(' ').filter(x => x); + + if (partes.length == 1) { + return partes[0].substring(0, 2).toUpperCase(); + } + + return (partes[0][0] + partes[partes.length - 1][0]).toUpperCase(); + } +} \ No newline at end of file diff --git a/src/assets/.gitkeep b/src/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/Enderecos.txt b/src/assets/Enderecos.txt new file mode 100644 index 0000000..e373bbd --- /dev/null +++ b/src/assets/Enderecos.txt @@ -0,0 +1 @@ +Dominio=http://127.0.0.1:4200;API=http://127.0.0.1:1337;Título="Zendion, INC." \ No newline at end of file diff --git a/src/assets/background.jpg b/src/assets/background.jpg new file mode 100644 index 0000000..0978ba0 Binary files /dev/null and b/src/assets/background.jpg differ diff --git a/src/assets/loader.gif b/src/assets/loader.gif new file mode 100644 index 0000000..b2348d5 Binary files /dev/null and b/src/assets/loader.gif differ diff --git a/src/assets/logo.png b/src/assets/logo.png new file mode 100644 index 0000000..767117b Binary files /dev/null and b/src/assets/logo.png differ diff --git a/src/assets/logo_escrito.png b/src/assets/logo_escrito.png new file mode 100644 index 0000000..b63c7a3 Binary files /dev/null and b/src/assets/logo_escrito.png differ diff --git a/src/assets/sucripts/swiper.js b/src/assets/sucripts/swiper.js new file mode 100644 index 0000000..0efb408 --- /dev/null +++ b/src/assets/sucripts/swiper.js @@ -0,0 +1,5360 @@ +/** + * Swiper 3.4.2 + * Most modern mobile touch slider and framework with hardware accelerated transitions + * + * http://www.idangero.us/swiper/ + * + * Copyright 2017, Vladimir Kharlampidi + * The iDangero.us + * http://www.idangero.us/ + * + * Licensed under MIT + * + * Released on: March 10, 2017 + */ +(function () { + 'use strict'; + var $; + + /*=========================== + Swiper + ===========================*/ + var Swiper = function (container, params) { + if (!(this instanceof Swiper)) return new Swiper(container, params); + + + var defaults = { + direction: 'horizontal', + touchEventsTarget: 'container', + initialSlide: 0, + speed: 300, + // autoplay + autoplay: false, + autoplayDisableOnInteraction: true, + autoplayStopOnLast: false, + // To support iOS's swipe-to-go-back gesture (when being used in-app, with UIWebView). + iOSEdgeSwipeDetection: false, + iOSEdgeSwipeThreshold: 20, + // Free mode + freeMode: false, + freeModeMomentum: true, + freeModeMomentumRatio: 1, + freeModeMomentumBounce: true, + freeModeMomentumBounceRatio: 1, + freeModeMomentumVelocityRatio: 1, + freeModeSticky: false, + freeModeMinimumVelocity: 0.02, + // Autoheight + autoHeight: false, + // Set wrapper width + setWrapperSize: false, + // Virtual Translate + virtualTranslate: false, + // Effects + effect: 'slide', // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip' + coverflow: { + rotate: 50, + stretch: 0, + depth: 100, + modifier: 1, + slideShadows : true + }, + flip: { + slideShadows : true, + limitRotation: true + }, + cube: { + slideShadows: true, + shadow: true, + shadowOffset: 20, + shadowScale: 0.94 + }, + fade: { + crossFade: false + }, + // Parallax + parallax: false, + // Zoom + zoom: false, + zoomMax: 3, + zoomMin: 1, + zoomToggle: true, + // Scrollbar + scrollbar: null, + scrollbarHide: true, + scrollbarDraggable: false, + scrollbarSnapOnRelease: false, + // Keyboard Mousewheel + keyboardControl: false, + mousewheelControl: false, + mousewheelReleaseOnEdges: false, + mousewheelInvert: false, + mousewheelForceToAxis: false, + mousewheelSensitivity: 1, + mousewheelEventsTarged: 'container', + // Hash Navigation + hashnav: false, + hashnavWatchState: false, + // History + history: false, + // Commong Nav State + replaceState: false, + // Breakpoints + breakpoints: undefined, + // Slides grid + spaceBetween: 0, + slidesPerView: 1, + slidesPerColumn: 1, + slidesPerColumnFill: 'column', + slidesPerGroup: 1, + centeredSlides: false, + slidesOffsetBefore: 0, // in px + slidesOffsetAfter: 0, // in px + // Round length + roundLengths: false, + // Touches + touchRatio: 1, + touchAngle: 45, + simulateTouch: true, + shortSwipes: true, + longSwipes: true, + longSwipesRatio: 0.5, + longSwipesMs: 300, + followFinger: true, + onlyExternal: false, + threshold: 0, + touchMoveStopPropagation: true, + touchReleaseOnEdges: false, + // Unique Navigation Elements + uniqueNavElements: true, + // Pagination + pagination: null, + paginationElement: 'span', + paginationClickable: false, + paginationHide: false, + paginationBulletRender: null, + paginationProgressRender: null, + paginationFractionRender: null, + paginationCustomRender: null, + paginationType: 'bullets', // 'bullets' or 'progress' or 'fraction' or 'custom' + // Resistance + resistance: true, + resistanceRatio: 0.85, + // Next/prev buttons + nextButton: null, + prevButton: null, + // Progress + watchSlidesProgress: false, + watchSlidesVisibility: false, + // Cursor + grabCursor: false, + // Clicks + preventClicks: true, + preventClicksPropagation: true, + slideToClickedSlide: false, + // Lazy Loading + lazyLoading: false, + lazyLoadingInPrevNext: false, + lazyLoadingInPrevNextAmount: 1, + lazyLoadingOnTransitionStart: false, + // Images + preloadImages: true, + updateOnImagesReady: true, + // loop + loop: false, + loopAdditionalSlides: 0, + loopedSlides: null, + // Control + control: undefined, + controlInverse: false, + controlBy: 'slide', //or 'container' + normalizeSlideIndex: true, + // Swiping/no swiping + allowSwipeToPrev: true, + allowSwipeToNext: true, + swipeHandler: null, //'.swipe-handler', + noSwiping: true, + noSwipingClass: 'swiper-no-swiping', + // Passive Listeners + passiveListeners: true, + // NS + containerModifierClass: 'swiper-container-', // NEW + slideClass: 'swiper-slide', + slideActiveClass: 'swiper-slide-active', + slideDuplicateActiveClass: 'swiper-slide-duplicate-active', + slideVisibleClass: 'swiper-slide-visible', + slideDuplicateClass: 'swiper-slide-duplicate', + slideNextClass: 'swiper-slide-next', + slideDuplicateNextClass: 'swiper-slide-duplicate-next', + slidePrevClass: 'swiper-slide-prev', + slideDuplicatePrevClass: 'swiper-slide-duplicate-prev', + wrapperClass: 'swiper-wrapper', + bulletClass: 'swiper-pagination-bullet', + bulletActiveClass: 'swiper-pagination-bullet-active', + buttonDisabledClass: 'swiper-button-disabled', + paginationCurrentClass: 'swiper-pagination-current', + paginationTotalClass: 'swiper-pagination-total', + paginationHiddenClass: 'swiper-pagination-hidden', + paginationProgressbarClass: 'swiper-pagination-progressbar', + paginationClickableClass: 'swiper-pagination-clickable', // NEW + paginationModifierClass: 'swiper-pagination-', // NEW + lazyLoadingClass: 'swiper-lazy', + lazyStatusLoadingClass: 'swiper-lazy-loading', + lazyStatusLoadedClass: 'swiper-lazy-loaded', + lazyPreloaderClass: 'swiper-lazy-preloader', + notificationClass: 'swiper-notification', + preloaderClass: 'preloader', + zoomContainerClass: 'swiper-zoom-container', + + // Observer + observer: false, + observeParents: false, + // Accessibility + a11y: false, + prevSlideMessage: 'Previous slide', + nextSlideMessage: 'Next slide', + firstSlideMessage: 'This is the first slide', + lastSlideMessage: 'This is the last slide', + paginationBulletMessage: 'Go to slide {{index}}', + // Callbacks + runCallbacksOnInit: true + /* + Callbacks: + onInit: function (swiper) + onDestroy: function (swiper) + onBeforeResize: function (swiper) + onAfterResize: function (swiper) + onClick: function (swiper, e) + onTap: function (swiper, e) + onDoubleTap: function (swiper, e) + onSliderMove: function (swiper, e) + onSlideChangeStart: function (swiper) + onSlideChangeEnd: function (swiper) + onTransitionStart: function (swiper) + onTransitionEnd: function (swiper) + onImagesReady: function (swiper) + onProgress: function (swiper, progress) + onTouchStart: function (swiper, e) + onTouchMove: function (swiper, e) + onTouchMoveOpposite: function (swiper, e) + onTouchEnd: function (swiper, e) + onReachBeginning: function (swiper) + onReachEnd: function (swiper) + onSetTransition: function (swiper, duration) + onSetTranslate: function (swiper, translate) + onAutoplayStart: function (swiper) + onAutoplayStop: function (swiper), + onLazyImageLoad: function (swiper, slide, image) + onLazyImageReady: function (swiper, slide, image) + onKeyPress: function (swiper, keyCode) + */ + + }; + var initialVirtualTranslate = params && params.virtualTranslate; + + params = params || {}; + var originalParams = {}; + for (var param in params) { + if (typeof params[param] === 'object' && params[param] !== null && !(params[param].nodeType || params[param] === window || params[param] === document || (typeof Dom7 !== 'undefined' && params[param] instanceof Dom7) || (typeof jQuery !== 'undefined' && params[param] instanceof jQuery))) { + originalParams[param] = {}; + for (var deepParam in params[param]) { + originalParams[param][deepParam] = params[param][deepParam]; + } + } + else { + originalParams[param] = params[param]; + } + } + for (var def in defaults) { + if (typeof params[def] === 'undefined') { + params[def] = defaults[def]; + } + else if (typeof params[def] === 'object') { + for (var deepDef in defaults[def]) { + if (typeof params[def][deepDef] === 'undefined') { + params[def][deepDef] = defaults[def][deepDef]; + } + } + } + } + + // Swiper + var s = this; + + // Params + s.params = params; + s.originalParams = originalParams; + + // Classname + s.classNames = []; + /*========================= + Dom Library and plugins + ===========================*/ + if (typeof $ !== 'undefined' && typeof Dom7 !== 'undefined'){ + $ = Dom7; + } + if (typeof $ === 'undefined') { + if (typeof Dom7 === 'undefined') { + $ = window.Dom7 || window.Zepto || window.jQuery; + } + else { + $ = Dom7; + } + if (!$) return; + } + // Export it to Swiper instance + s.$ = $; + + /*========================= + Breakpoints + ===========================*/ + s.currentBreakpoint = undefined; + s.getActiveBreakpoint = function () { + //Get breakpoint for window width + if (!s.params.breakpoints) return false; + var breakpoint = false; + var points = [], point; + for ( point in s.params.breakpoints ) { + if (s.params.breakpoints.hasOwnProperty(point)) { + points.push(point); + } + } + points.sort(function (a, b) { + return parseInt(a, 10) > parseInt(b, 10); + }); + for (var i = 0; i < points.length; i++) { + point = points[i]; + if (point >= window.innerWidth && !breakpoint) { + breakpoint = point; + } + } + return breakpoint || 'max'; + }; + s.setBreakpoint = function () { + //Set breakpoint for window width and update parameters + var breakpoint = s.getActiveBreakpoint(); + if (breakpoint && s.currentBreakpoint !== breakpoint) { + var breakPointsParams = breakpoint in s.params.breakpoints ? s.params.breakpoints[breakpoint] : s.originalParams; + var needsReLoop = s.params.loop && (breakPointsParams.slidesPerView !== s.params.slidesPerView); + for ( var param in breakPointsParams ) { + s.params[param] = breakPointsParams[param]; + } + s.currentBreakpoint = breakpoint; + if(needsReLoop && s.destroyLoop) { + s.reLoop(true); + } + } + }; + // Set breakpoint on load + if (s.params.breakpoints) { + s.setBreakpoint(); + } + + /*========================= + Preparation - Define Container, Wrapper and Pagination + ===========================*/ + s.container = $(container); + if (s.container.length === 0) return; + if (s.container.length > 1) { + var swipers = []; + s.container.each(function () { + var container = this; + swipers.push(new Swiper(this, params)); + }); + return swipers; + } + + // Save instance in container HTML Element and in data + s.container[0].swiper = s; + s.container.data('swiper', s); + + s.classNames.push(s.params.containerModifierClass + s.params.direction); + + if (s.params.freeMode) { + s.classNames.push(s.params.containerModifierClass + 'free-mode'); + } + if (!s.support.flexbox) { + s.classNames.push(s.params.containerModifierClass + 'no-flexbox'); + s.params.slidesPerColumn = 1; + } + if (s.params.autoHeight) { + s.classNames.push(s.params.containerModifierClass + 'autoheight'); + } + // Enable slides progress when required + if (s.params.parallax || s.params.watchSlidesVisibility) { + s.params.watchSlidesProgress = true; + } + // Max resistance when touchReleaseOnEdges + if (s.params.touchReleaseOnEdges) { + s.params.resistanceRatio = 0; + } + // Coverflow / 3D + if (['cube', 'coverflow', 'flip'].indexOf(s.params.effect) >= 0) { + if (s.support.transforms3d) { + s.params.watchSlidesProgress = true; + s.classNames.push(s.params.containerModifierClass + '3d'); + } + else { + s.params.effect = 'slide'; + } + } + if (s.params.effect !== 'slide') { + s.classNames.push(s.params.containerModifierClass + s.params.effect); + } + if (s.params.effect === 'cube') { + s.params.resistanceRatio = 0; + s.params.slidesPerView = 1; + s.params.slidesPerColumn = 1; + s.params.slidesPerGroup = 1; + s.params.centeredSlides = false; + s.params.spaceBetween = 0; + s.params.virtualTranslate = true; + } + if (s.params.effect === 'fade' || s.params.effect === 'flip') { + s.params.slidesPerView = 1; + s.params.slidesPerColumn = 1; + s.params.slidesPerGroup = 1; + s.params.watchSlidesProgress = true; + s.params.spaceBetween = 0; + if (typeof initialVirtualTranslate === 'undefined') { + s.params.virtualTranslate = true; + } + } + + // Grab Cursor + if (s.params.grabCursor && s.support.touch) { + s.params.grabCursor = false; + } + + // Wrapper + s.wrapper = s.container.children('.' + s.params.wrapperClass); + + // Pagination + if (s.params.pagination) { + s.paginationContainer = $(s.params.pagination); + if (s.params.uniqueNavElements && typeof s.params.pagination === 'string' && s.paginationContainer.length > 1 && s.container.find(s.params.pagination).length === 1) { + s.paginationContainer = s.container.find(s.params.pagination); + } + + if (s.params.paginationType === 'bullets' && s.params.paginationClickable) { + s.paginationContainer.addClass(s.params.paginationModifierClass + 'clickable'); + } + else { + s.params.paginationClickable = false; + } + s.paginationContainer.addClass(s.params.paginationModifierClass + s.params.paginationType); + } + // Next/Prev Buttons + if (s.params.nextButton || s.params.prevButton) { + if (s.params.nextButton) { + s.nextButton = $(s.params.nextButton); + if (s.params.uniqueNavElements && typeof s.params.nextButton === 'string' && s.nextButton.length > 1 && s.container.find(s.params.nextButton).length === 1) { + s.nextButton = s.container.find(s.params.nextButton); + } + } + if (s.params.prevButton) { + s.prevButton = $(s.params.prevButton); + if (s.params.uniqueNavElements && typeof s.params.prevButton === 'string' && s.prevButton.length > 1 && s.container.find(s.params.prevButton).length === 1) { + s.prevButton = s.container.find(s.params.prevButton); + } + } + } + + // Is Horizontal + s.isHorizontal = function () { + return s.params.direction === 'horizontal'; + }; + // s.isH = isH; + + // RTL + s.rtl = s.isHorizontal() && (s.container[0].dir.toLowerCase() === 'rtl' || s.container.css('direction') === 'rtl'); + if (s.rtl) { + s.classNames.push(s.params.containerModifierClass + 'rtl'); + } + + // Wrong RTL support + if (s.rtl) { + s.wrongRTL = s.wrapper.css('display') === '-webkit-box'; + } + + // Columns + if (s.params.slidesPerColumn > 1) { + s.classNames.push(s.params.containerModifierClass + 'multirow'); + } + + // Check for Android + if (s.device.android) { + s.classNames.push(s.params.containerModifierClass + 'android'); + } + + // Add classes + s.container.addClass(s.classNames.join(' ')); + + // Translate + s.translate = 0; + + // Progress + s.progress = 0; + + // Velocity + s.velocity = 0; + + /*========================= + Locks, unlocks + ===========================*/ + s.lockSwipeToNext = function () { + s.params.allowSwipeToNext = false; + if (s.params.allowSwipeToPrev === false && s.params.grabCursor) { + s.unsetGrabCursor(); + } + }; + s.lockSwipeToPrev = function () { + s.params.allowSwipeToPrev = false; + if (s.params.allowSwipeToNext === false && s.params.grabCursor) { + s.unsetGrabCursor(); + } + }; + s.lockSwipes = function () { + s.params.allowSwipeToNext = s.params.allowSwipeToPrev = false; + if (s.params.grabCursor) s.unsetGrabCursor(); + }; + s.unlockSwipeToNext = function () { + s.params.allowSwipeToNext = true; + if (s.params.allowSwipeToPrev === true && s.params.grabCursor) { + s.setGrabCursor(); + } + }; + s.unlockSwipeToPrev = function () { + s.params.allowSwipeToPrev = true; + if (s.params.allowSwipeToNext === true && s.params.grabCursor) { + s.setGrabCursor(); + } + }; + s.unlockSwipes = function () { + s.params.allowSwipeToNext = s.params.allowSwipeToPrev = true; + if (s.params.grabCursor) s.setGrabCursor(); + }; + + /*========================= + Round helper + ===========================*/ + function round(a) { + return Math.floor(a); + } + /*========================= + Set grab cursor + ===========================*/ + s.setGrabCursor = function(moving) { + s.container[0].style.cursor = 'move'; + s.container[0].style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab'; + s.container[0].style.cursor = moving ? '-moz-grabbin' : '-moz-grab'; + s.container[0].style.cursor = moving ? 'grabbing': 'grab'; + }; + s.unsetGrabCursor = function () { + s.container[0].style.cursor = ''; + }; + if (s.params.grabCursor) { + s.setGrabCursor(); + } + /*========================= + Update on Images Ready + ===========================*/ + s.imagesToLoad = []; + s.imagesLoaded = 0; + + s.loadImage = function (imgElement, src, srcset, sizes, checkForComplete, callback) { + var image; + function onReady () { + if (callback) callback(); + } + if (!imgElement.complete || !checkForComplete) { + if (src) { + image = new window.Image(); + image.onload = onReady; + image.onerror = onReady; + if (sizes) { + image.sizes = sizes; + } + if (srcset) { + image.srcset = srcset; + } + if (src) { + image.src = src; + } + } else { + onReady(); + } + + } else {//image already loaded... + onReady(); + } + }; + s.preloadImages = function () { + s.imagesToLoad = s.container.find('img'); + function _onReady() { + if (typeof s === 'undefined' || s === null || !s) return; + if (s.imagesLoaded !== undefined) s.imagesLoaded++; + if (s.imagesLoaded === s.imagesToLoad.length) { + if (s.params.updateOnImagesReady) s.update(); + s.emit('onImagesReady', s); + } + } + for (var i = 0; i < s.imagesToLoad.length; i++) { + s.loadImage(s.imagesToLoad[i], (s.imagesToLoad[i].currentSrc || s.imagesToLoad[i].getAttribute('src')), (s.imagesToLoad[i].srcset || s.imagesToLoad[i].getAttribute('srcset')), s.imagesToLoad[i].sizes || s.imagesToLoad[i].getAttribute('sizes'), true, _onReady); + } + }; + + /*========================= + Autoplay + ===========================*/ + s.autoplayTimeoutId = undefined; + s.autoplaying = false; + s.autoplayPaused = false; + function autoplay() { + var autoplayDelay = s.params.autoplay; + var activeSlide = s.slides.eq(s.activeIndex); + if (activeSlide.attr('data-swiper-autoplay')) { + autoplayDelay = activeSlide.attr('data-swiper-autoplay') || s.params.autoplay; + } + s.autoplayTimeoutId = setTimeout(function () { + if (s.params.loop) { + s.fixLoop(); + s._slideNext(); + s.emit('onAutoplay', s); + } + else { + if (!s.isEnd) { + s._slideNext(); + s.emit('onAutoplay', s); + } + else { + if (!params.autoplayStopOnLast) { + s._slideTo(0); + s.emit('onAutoplay', s); + } + else { + s.stopAutoplay(); + } + } + } + }, autoplayDelay); + } + s.startAutoplay = function () { + if (typeof s.autoplayTimeoutId !== 'undefined') return false; + if (!s.params.autoplay) return false; + if (s.autoplaying) return false; + s.autoplaying = true; + s.emit('onAutoplayStart', s); + autoplay(); + }; + s.stopAutoplay = function (internal) { + if (!s.autoplayTimeoutId) return; + if (s.autoplayTimeoutId) clearTimeout(s.autoplayTimeoutId); + s.autoplaying = false; + s.autoplayTimeoutId = undefined; + s.emit('onAutoplayStop', s); + }; + s.pauseAutoplay = function (speed) { + if (s.autoplayPaused) return; + if (s.autoplayTimeoutId) clearTimeout(s.autoplayTimeoutId); + s.autoplayPaused = true; + if (speed === 0) { + s.autoplayPaused = false; + autoplay(); + } + else { + s.wrapper.transitionEnd(function () { + if (!s) return; + s.autoplayPaused = false; + if (!s.autoplaying) { + s.stopAutoplay(); + } + else { + autoplay(); + } + }); + } + }; + /*========================= + Min/Max Translate + ===========================*/ + s.minTranslate = function () { + return (-s.snapGrid[0]); + }; + s.maxTranslate = function () { + return (-s.snapGrid[s.snapGrid.length - 1]); + }; + /*========================= + Slider/slides sizes + ===========================*/ + s.updateAutoHeight = function () { + var activeSlides = []; + var newHeight = 0; + var i; + + // Find slides currently in view + if(s.params.slidesPerView !== 'auto' && s.params.slidesPerView > 1) { + for (i = 0; i < Math.ceil(s.params.slidesPerView); i++) { + var index = s.activeIndex + i; + if(index > s.slides.length) break; + activeSlides.push(s.slides.eq(index)[0]); + } + } else { + activeSlides.push(s.slides.eq(s.activeIndex)[0]); + } + + // Find new height from heighest slide in view + for (i = 0; i < activeSlides.length; i++) { + if (typeof activeSlides[i] !== 'undefined') { + var height = activeSlides[i].offsetHeight; + newHeight = height > newHeight ? height : newHeight; + } + } + + // Update Height + if (newHeight) s.wrapper.css('height', newHeight + 'px'); + }; + s.updateContainerSize = function () { + var width, height; + if (typeof s.params.width !== 'undefined') { + width = s.params.width; + } + else { + width = s.container[0].clientWidth; + } + if (typeof s.params.height !== 'undefined') { + height = s.params.height; + } + else { + height = s.container[0].clientHeight; + } + if (width === 0 && s.isHorizontal() || height === 0 && !s.isHorizontal()) { + return; + } + + //Subtract paddings + width = width - parseInt(s.container.css('padding-left'), 10) - parseInt(s.container.css('padding-right'), 10); + height = height - parseInt(s.container.css('padding-top'), 10) - parseInt(s.container.css('padding-bottom'), 10); + + // Store values + s.width = width; + s.height = height; + s.size = s.isHorizontal() ? s.width : s.height; + }; + + s.updateSlidesSize = function () { + s.slides = s.wrapper.children('.' + s.params.slideClass); + s.snapGrid = []; + s.slidesGrid = []; + s.slidesSizesGrid = []; + + var spaceBetween = s.params.spaceBetween, + slidePosition = -s.params.slidesOffsetBefore, + i, + prevSlideSize = 0, + index = 0; + if (typeof s.size === 'undefined') return; + if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) { + spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * s.size; + } + + s.virtualSize = -spaceBetween; + // reset margins + if (s.rtl) s.slides.css({marginLeft: '', marginTop: ''}); + else s.slides.css({marginRight: '', marginBottom: ''}); + + var slidesNumberEvenToRows; + if (s.params.slidesPerColumn > 1) { + if (Math.floor(s.slides.length / s.params.slidesPerColumn) === s.slides.length / s.params.slidesPerColumn) { + slidesNumberEvenToRows = s.slides.length; + } + else { + slidesNumberEvenToRows = Math.ceil(s.slides.length / s.params.slidesPerColumn) * s.params.slidesPerColumn; + } + if (s.params.slidesPerView !== 'auto' && s.params.slidesPerColumnFill === 'row') { + slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, s.params.slidesPerView * s.params.slidesPerColumn); + } + } + + // Calc slides + var slideSize; + var slidesPerColumn = s.params.slidesPerColumn; + var slidesPerRow = slidesNumberEvenToRows / slidesPerColumn; + var numFullColumns = slidesPerRow - (s.params.slidesPerColumn * slidesPerRow - s.slides.length); + for (i = 0; i < s.slides.length; i++) { + slideSize = 0; + var slide = s.slides.eq(i); + if (s.params.slidesPerColumn > 1) { + // Set slides order + var newSlideOrderIndex; + var column, row; + if (s.params.slidesPerColumnFill === 'column') { + column = Math.floor(i / slidesPerColumn); + row = i - column * slidesPerColumn; + if (column > numFullColumns || (column === numFullColumns && row === slidesPerColumn-1)) { + if (++row >= slidesPerColumn) { + row = 0; + column++; + } + } + newSlideOrderIndex = column + row * slidesNumberEvenToRows / slidesPerColumn; + slide + .css({ + '-webkit-box-ordinal-group': newSlideOrderIndex, + '-moz-box-ordinal-group': newSlideOrderIndex, + '-ms-flex-order': newSlideOrderIndex, + '-webkit-order': newSlideOrderIndex, + 'order': newSlideOrderIndex + }); + } + else { + row = Math.floor(i / slidesPerRow); + column = i - row * slidesPerRow; + } + slide + .css( + 'margin-' + (s.isHorizontal() ? 'top' : 'left'), + (row !== 0 && s.params.spaceBetween) && (s.params.spaceBetween + 'px') + ) + .attr('data-swiper-column', column) + .attr('data-swiper-row', row); + + } + if (slide.css('display') === 'none') continue; + if (s.params.slidesPerView === 'auto') { + slideSize = s.isHorizontal() ? slide.outerWidth(true) : slide.outerHeight(true); + if (s.params.roundLengths) slideSize = round(slideSize); + } + else { + slideSize = (s.size - (s.params.slidesPerView - 1) * spaceBetween) / s.params.slidesPerView; + if (s.params.roundLengths) slideSize = round(slideSize); + + if (s.isHorizontal()) { + s.slides[i].style.width = slideSize + 'px'; + } + else { + s.slides[i].style.height = slideSize + 'px'; + } + } + s.slides[i].swiperSlideSize = slideSize; + s.slidesSizesGrid.push(slideSize); + + + if (s.params.centeredSlides) { + slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween; + if(prevSlideSize === 0 && i !== 0) slidePosition = slidePosition - s.size / 2 - spaceBetween; + if (i === 0) slidePosition = slidePosition - s.size / 2 - spaceBetween; + if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0; + if ((index) % s.params.slidesPerGroup === 0) s.snapGrid.push(slidePosition); + s.slidesGrid.push(slidePosition); + } + else { + if ((index) % s.params.slidesPerGroup === 0) s.snapGrid.push(slidePosition); + s.slidesGrid.push(slidePosition); + slidePosition = slidePosition + slideSize + spaceBetween; + } + + s.virtualSize += slideSize + spaceBetween; + + prevSlideSize = slideSize; + + index ++; + } + s.virtualSize = Math.max(s.virtualSize, s.size) + s.params.slidesOffsetAfter; + var newSlidesGrid; + + if ( + s.rtl && s.wrongRTL && (s.params.effect === 'slide' || s.params.effect === 'coverflow')) { + s.wrapper.css({width: s.virtualSize + s.params.spaceBetween + 'px'}); + } + if (!s.support.flexbox || s.params.setWrapperSize) { + if (s.isHorizontal()) s.wrapper.css({width: s.virtualSize + s.params.spaceBetween + 'px'}); + else s.wrapper.css({height: s.virtualSize + s.params.spaceBetween + 'px'}); + } + + if (s.params.slidesPerColumn > 1) { + s.virtualSize = (slideSize + s.params.spaceBetween) * slidesNumberEvenToRows; + s.virtualSize = Math.ceil(s.virtualSize / s.params.slidesPerColumn) - s.params.spaceBetween; + if (s.isHorizontal()) s.wrapper.css({width: s.virtualSize + s.params.spaceBetween + 'px'}); + else s.wrapper.css({height: s.virtualSize + s.params.spaceBetween + 'px'}); + if (s.params.centeredSlides) { + newSlidesGrid = []; + for (i = 0; i < s.snapGrid.length; i++) { + if (s.snapGrid[i] < s.virtualSize + s.snapGrid[0]) newSlidesGrid.push(s.snapGrid[i]); + } + s.snapGrid = newSlidesGrid; + } + } + + // Remove last grid elements depending on width + if (!s.params.centeredSlides) { + newSlidesGrid = []; + for (i = 0; i < s.snapGrid.length; i++) { + if (s.snapGrid[i] <= s.virtualSize - s.size) { + newSlidesGrid.push(s.snapGrid[i]); + } + } + s.snapGrid = newSlidesGrid; + if (Math.floor(s.virtualSize - s.size) - Math.floor(s.snapGrid[s.snapGrid.length - 1]) > 1) { + s.snapGrid.push(s.virtualSize - s.size); + } + } + if (s.snapGrid.length === 0) s.snapGrid = [0]; + + if (s.params.spaceBetween !== 0) { + if (s.isHorizontal()) { + if (s.rtl) s.slides.css({marginLeft: spaceBetween + 'px'}); + else s.slides.css({marginRight: spaceBetween + 'px'}); + } + else s.slides.css({marginBottom: spaceBetween + 'px'}); + } + if (s.params.watchSlidesProgress) { + s.updateSlidesOffset(); + } + }; + s.updateSlidesOffset = function () { + for (var i = 0; i < s.slides.length; i++) { + s.slides[i].swiperSlideOffset = s.isHorizontal() ? s.slides[i].offsetLeft : s.slides[i].offsetTop; + } + }; + + /*========================= + Dynamic Slides Per View + ===========================*/ + s.currentSlidesPerView = function () { + var spv = 1, i, j; + if (s.params.centeredSlides) { + var size = s.slides[s.activeIndex].swiperSlideSize; + var breakLoop; + for (i = s.activeIndex + 1; i < s.slides.length; i++) { + if (s.slides[i] && !breakLoop) { + size += s.slides[i].swiperSlideSize; + spv ++; + if (size > s.size) breakLoop = true; + } + } + for (j = s.activeIndex - 1; j >= 0; j--) { + if (s.slides[j] && !breakLoop) { + size += s.slides[j].swiperSlideSize; + spv ++; + if (size > s.size) breakLoop = true; + } + } + } + else { + for (i = s.activeIndex + 1; i < s.slides.length; i++) { + if (s.slidesGrid[i] - s.slidesGrid[s.activeIndex] < s.size) { + spv++; + } + } + } + return spv; + }; + /*========================= + Slider/slides progress + ===========================*/ + s.updateSlidesProgress = function (translate) { + if (typeof translate === 'undefined') { + translate = s.translate || 0; + } + if (s.slides.length === 0) return; + if (typeof s.slides[0].swiperSlideOffset === 'undefined') s.updateSlidesOffset(); + + var offsetCenter = -translate; + if (s.rtl) offsetCenter = translate; + + // Visible Slides + s.slides.removeClass(s.params.slideVisibleClass); + for (var i = 0; i < s.slides.length; i++) { + var slide = s.slides[i]; + var slideProgress = (offsetCenter + (s.params.centeredSlides ? s.minTranslate() : 0) - slide.swiperSlideOffset) / (slide.swiperSlideSize + s.params.spaceBetween); + if (s.params.watchSlidesVisibility) { + var slideBefore = -(offsetCenter - slide.swiperSlideOffset); + var slideAfter = slideBefore + s.slidesSizesGrid[i]; + var isVisible = + (slideBefore >= 0 && slideBefore < s.size) || + (slideAfter > 0 && slideAfter <= s.size) || + (slideBefore <= 0 && slideAfter >= s.size); + if (isVisible) { + s.slides.eq(i).addClass(s.params.slideVisibleClass); + } + } + slide.progress = s.rtl ? -slideProgress : slideProgress; + } + }; + s.updateProgress = function (translate) { + if (typeof translate === 'undefined') { + translate = s.translate || 0; + } + var translatesDiff = s.maxTranslate() - s.minTranslate(); + var wasBeginning = s.isBeginning; + var wasEnd = s.isEnd; + if (translatesDiff === 0) { + s.progress = 0; + s.isBeginning = s.isEnd = true; + } + else { + s.progress = (translate - s.minTranslate()) / (translatesDiff); + s.isBeginning = s.progress <= 0; + s.isEnd = s.progress >= 1; + } + if (s.isBeginning && !wasBeginning) s.emit('onReachBeginning', s); + if (s.isEnd && !wasEnd) s.emit('onReachEnd', s); + + if (s.params.watchSlidesProgress) s.updateSlidesProgress(translate); + s.emit('onProgress', s, s.progress); + }; + s.updateActiveIndex = function () { + var translate = s.rtl ? s.translate : -s.translate; + var newActiveIndex, i, snapIndex; + for (i = 0; i < s.slidesGrid.length; i ++) { + if (typeof s.slidesGrid[i + 1] !== 'undefined') { + if (translate >= s.slidesGrid[i] && translate < s.slidesGrid[i + 1] - (s.slidesGrid[i + 1] - s.slidesGrid[i]) / 2) { + newActiveIndex = i; + } + else if (translate >= s.slidesGrid[i] && translate < s.slidesGrid[i + 1]) { + newActiveIndex = i + 1; + } + } + else { + if (translate >= s.slidesGrid[i]) { + newActiveIndex = i; + } + } + } + // Normalize slideIndex + if(s.params.normalizeSlideIndex){ + if (newActiveIndex < 0 || typeof newActiveIndex === 'undefined') newActiveIndex = 0; + } + // for (i = 0; i < s.slidesGrid.length; i++) { + // if (- translate >= s.slidesGrid[i]) { + // newActiveIndex = i; + // } + // } + snapIndex = Math.floor(newActiveIndex / s.params.slidesPerGroup); + if (snapIndex >= s.snapGrid.length) snapIndex = s.snapGrid.length - 1; + + if (newActiveIndex === s.activeIndex) { + return; + } + s.snapIndex = snapIndex; + s.previousIndex = s.activeIndex; + s.activeIndex = newActiveIndex; + s.updateClasses(); + s.updateRealIndex(); + }; + s.updateRealIndex = function(){ + s.realIndex = parseInt(s.slides.eq(s.activeIndex).attr('data-swiper-slide-index') || s.activeIndex, 10); + }; + + /*========================= + Classes + ===========================*/ + s.updateClasses = function () { + s.slides.removeClass(s.params.slideActiveClass + ' ' + s.params.slideNextClass + ' ' + s.params.slidePrevClass + ' ' + s.params.slideDuplicateActiveClass + ' ' + s.params.slideDuplicateNextClass + ' ' + s.params.slideDuplicatePrevClass); + var activeSlide = s.slides.eq(s.activeIndex); + // Active classes + activeSlide.addClass(s.params.slideActiveClass); + if (params.loop) { + // Duplicate to all looped slides + if (activeSlide.hasClass(s.params.slideDuplicateClass)) { + s.wrapper.children('.' + s.params.slideClass + ':not(.' + s.params.slideDuplicateClass + ')[data-swiper-slide-index="' + s.realIndex + '"]').addClass(s.params.slideDuplicateActiveClass); + } + else { + s.wrapper.children('.' + s.params.slideClass + '.' + s.params.slideDuplicateClass + '[data-swiper-slide-index="' + s.realIndex + '"]').addClass(s.params.slideDuplicateActiveClass); + } + } + // Next Slide + var nextSlide = activeSlide.next('.' + s.params.slideClass).addClass(s.params.slideNextClass); + if (s.params.loop && nextSlide.length === 0) { + nextSlide = s.slides.eq(0); + nextSlide.addClass(s.params.slideNextClass); + } + // Prev Slide + var prevSlide = activeSlide.prev('.' + s.params.slideClass).addClass(s.params.slidePrevClass); + if (s.params.loop && prevSlide.length === 0) { + prevSlide = s.slides.eq(-1); + prevSlide.addClass(s.params.slidePrevClass); + } + if (params.loop) { + // Duplicate to all looped slides + if (nextSlide.hasClass(s.params.slideDuplicateClass)) { + s.wrapper.children('.' + s.params.slideClass + ':not(.' + s.params.slideDuplicateClass + ')[data-swiper-slide-index="' + nextSlide.attr('data-swiper-slide-index') + '"]').addClass(s.params.slideDuplicateNextClass); + } + else { + s.wrapper.children('.' + s.params.slideClass + '.' + s.params.slideDuplicateClass + '[data-swiper-slide-index="' + nextSlide.attr('data-swiper-slide-index') + '"]').addClass(s.params.slideDuplicateNextClass); + } + if (prevSlide.hasClass(s.params.slideDuplicateClass)) { + s.wrapper.children('.' + s.params.slideClass + ':not(.' + s.params.slideDuplicateClass + ')[data-swiper-slide-index="' + prevSlide.attr('data-swiper-slide-index') + '"]').addClass(s.params.slideDuplicatePrevClass); + } + else { + s.wrapper.children('.' + s.params.slideClass + '.' + s.params.slideDuplicateClass + '[data-swiper-slide-index="' + prevSlide.attr('data-swiper-slide-index') + '"]').addClass(s.params.slideDuplicatePrevClass); + } + } + + // Pagination + if (s.paginationContainer && s.paginationContainer.length > 0) { + // Current/Total + var current, + total = s.params.loop ? Math.ceil((s.slides.length - s.loopedSlides * 2) / s.params.slidesPerGroup) : s.snapGrid.length; + if (s.params.loop) { + current = Math.ceil((s.activeIndex - s.loopedSlides)/s.params.slidesPerGroup); + if (current > s.slides.length - 1 - s.loopedSlides * 2) { + current = current - (s.slides.length - s.loopedSlides * 2); + } + if (current > total - 1) current = current - total; + if (current < 0 && s.params.paginationType !== 'bullets') current = total + current; + } + else { + if (typeof s.snapIndex !== 'undefined') { + current = s.snapIndex; + } + else { + current = s.activeIndex || 0; + } + } + // Types + if (s.params.paginationType === 'bullets' && s.bullets && s.bullets.length > 0) { + s.bullets.removeClass(s.params.bulletActiveClass); + if (s.paginationContainer.length > 1) { + s.bullets.each(function () { + if ($(this).index() === current) $(this).addClass(s.params.bulletActiveClass); + }); + } + else { + s.bullets.eq(current).addClass(s.params.bulletActiveClass); + } + } + if (s.params.paginationType === 'fraction') { + s.paginationContainer.find('.' + s.params.paginationCurrentClass).text(current + 1); + s.paginationContainer.find('.' + s.params.paginationTotalClass).text(total); + } + if (s.params.paginationType === 'progress') { + var scale = (current + 1) / total, + scaleX = scale, + scaleY = 1; + if (!s.isHorizontal()) { + scaleY = scale; + scaleX = 1; + } + s.paginationContainer.find('.' + s.params.paginationProgressbarClass).transform('translate3d(0,0,0) scaleX(' + scaleX + ') scaleY(' + scaleY + ')').transition(s.params.speed); + } + if (s.params.paginationType === 'custom' && s.params.paginationCustomRender) { + s.paginationContainer.html(s.params.paginationCustomRender(s, current + 1, total)); + s.emit('onPaginationRendered', s, s.paginationContainer[0]); + } + } + + // Next/active buttons + if (!s.params.loop) { + if (s.params.prevButton && s.prevButton && s.prevButton.length > 0) { + if (s.isBeginning) { + s.prevButton.addClass(s.params.buttonDisabledClass); + if (s.params.a11y && s.a11y) s.a11y.disable(s.prevButton); + } + else { + s.prevButton.removeClass(s.params.buttonDisabledClass); + if (s.params.a11y && s.a11y) s.a11y.enable(s.prevButton); + } + } + if (s.params.nextButton && s.nextButton && s.nextButton.length > 0) { + if (s.isEnd) { + try { + document.getElementById("btnP").removeAttribute("disabled"); + } + catch { + + } + s.nextButton.addClass(s.params.buttonDisabledClass); + if (s.params.a11y && s.a11y) s.a11y.disable(s.nextButton); + } + else { + s.nextButton.removeClass(s.params.buttonDisabledClass); + if (s.params.a11y && s.a11y) s.a11y.enable(s.nextButton); + } + } + } + }; + + /*========================= + Pagination + ===========================*/ + s.updatePagination = function () { + if (!s.params.pagination) return; + if (s.paginationContainer && s.paginationContainer.length > 0) { + var paginationHTML = ''; + if (s.params.paginationType === 'bullets') { + var numberOfBullets = s.params.loop ? Math.ceil((s.slides.length - s.loopedSlides * 2) / s.params.slidesPerGroup) : s.snapGrid.length; + for (var i = 0; i < numberOfBullets; i++) { + if (s.params.paginationBulletRender) { + paginationHTML += s.params.paginationBulletRender(s, i, s.params.bulletClass); + } + else { + paginationHTML += '<' + s.params.paginationElement+' class="' + s.params.bulletClass + '">'; + } + } + s.paginationContainer.html(paginationHTML); + s.bullets = s.paginationContainer.find('.' + s.params.bulletClass); + if (s.params.paginationClickable && s.params.a11y && s.a11y) { + s.a11y.initPagination(); + } + } + if (s.params.paginationType === 'fraction') { + if (s.params.paginationFractionRender) { + paginationHTML = s.params.paginationFractionRender(s, s.params.paginationCurrentClass, s.params.paginationTotalClass); + } + else { + paginationHTML = + '' + + ' / ' + + ''; + } + s.paginationContainer.html(paginationHTML); + } + if (s.params.paginationType === 'progress') { + if (s.params.paginationProgressRender) { + paginationHTML = s.params.paginationProgressRender(s, s.params.paginationProgressbarClass); + } + else { + paginationHTML = ''; + } + s.paginationContainer.html(paginationHTML); + } + if (s.params.paginationType !== 'custom') { + s.emit('onPaginationRendered', s, s.paginationContainer[0]); + } + } + }; + /*========================= + Common update method + ===========================*/ + s.update = function (updateTranslate) { + if (!s) return; + s.updateContainerSize(); + s.updateSlidesSize(); + s.updateProgress(); + s.updatePagination(); + s.updateClasses(); + if (s.params.scrollbar && s.scrollbar) { + s.scrollbar.set(); + } + var newTranslate; + function forceSetTranslate() { + var translate = s.rtl ? -s.translate : s.translate; + newTranslate = Math.min(Math.max(s.translate, s.maxTranslate()), s.minTranslate()); + s.setWrapperTranslate(newTranslate); + s.updateActiveIndex(); + s.updateClasses(); + } + if (updateTranslate) { + var translated; + if (s.controller && s.controller.spline) { + s.controller.spline = undefined; + } + if (s.params.freeMode) { + forceSetTranslate(); + if (s.params.autoHeight) { + s.updateAutoHeight(); + } + } + else { + if ((s.params.slidesPerView === 'auto' || s.params.slidesPerView > 1) && s.isEnd && !s.params.centeredSlides) { + translated = s.slideTo(s.slides.length - 1, 0, false, true); + } + else { + translated = s.slideTo(s.activeIndex, 0, false, true); + } + if (!translated) { + forceSetTranslate(); + } + } + } + else if (s.params.autoHeight) { + s.updateAutoHeight(); + } + }; + + /*========================= + Resize Handler + ===========================*/ + s.onResize = function (forceUpdatePagination) { + if (s.params.onBeforeResize) s.params.onBeforeResize(s); + //Breakpoints + if (s.params.breakpoints) { + s.setBreakpoint(); + } + + // Disable locks on resize + var allowSwipeToPrev = s.params.allowSwipeToPrev; + var allowSwipeToNext = s.params.allowSwipeToNext; + s.params.allowSwipeToPrev = s.params.allowSwipeToNext = true; + + s.updateContainerSize(); + s.updateSlidesSize(); + if (s.params.slidesPerView === 'auto' || s.params.freeMode || forceUpdatePagination) s.updatePagination(); + if (s.params.scrollbar && s.scrollbar) { + s.scrollbar.set(); + } + if (s.controller && s.controller.spline) { + s.controller.spline = undefined; + } + var slideChangedBySlideTo = false; + if (s.params.freeMode) { + var newTranslate = Math.min(Math.max(s.translate, s.maxTranslate()), s.minTranslate()); + s.setWrapperTranslate(newTranslate); + s.updateActiveIndex(); + s.updateClasses(); + + if (s.params.autoHeight) { + s.updateAutoHeight(); + } + } + else { + s.updateClasses(); + if ((s.params.slidesPerView === 'auto' || s.params.slidesPerView > 1) && s.isEnd && !s.params.centeredSlides) { + slideChangedBySlideTo = s.slideTo(s.slides.length - 1, 0, false, true); + } + else { + slideChangedBySlideTo = s.slideTo(s.activeIndex, 0, false, true); + } + } + if (s.params.lazyLoading && !slideChangedBySlideTo && s.lazy) { + s.lazy.load(); + } + // Return locks after resize + s.params.allowSwipeToPrev = allowSwipeToPrev; + s.params.allowSwipeToNext = allowSwipeToNext; + if (s.params.onAfterResize) s.params.onAfterResize(s); + }; + + /*========================= + Events + ===========================*/ + + //Define Touch Events + s.touchEventsDesktop = {start: 'mousedown', move: 'mousemove', end: 'mouseup'}; + if (window.navigator.pointerEnabled) s.touchEventsDesktop = {start: 'pointerdown', move: 'pointermove', end: 'pointerup'}; + else if (window.navigator.msPointerEnabled) s.touchEventsDesktop = {start: 'MSPointerDown', move: 'MSPointerMove', end: 'MSPointerUp'}; + s.touchEvents = { + start : s.support.touch || !s.params.simulateTouch ? 'touchstart' : s.touchEventsDesktop.start, + move : s.support.touch || !s.params.simulateTouch ? 'touchmove' : s.touchEventsDesktop.move, + end : s.support.touch || !s.params.simulateTouch ? 'touchend' : s.touchEventsDesktop.end + }; + + + // WP8 Touch Events Fix + if (window.navigator.pointerEnabled || window.navigator.msPointerEnabled) { + (s.params.touchEventsTarget === 'container' ? s.container : s.wrapper).addClass('swiper-wp8-' + s.params.direction); + } + + // Attach/detach events + s.initEvents = function (detach) { + var actionDom = detach ? 'off' : 'on'; + var action = detach ? 'removeEventListener' : 'addEventListener'; + var touchEventsTarget = s.params.touchEventsTarget === 'container' ? s.container[0] : s.wrapper[0]; + var target = s.support.touch ? touchEventsTarget : document; + + var moveCapture = s.params.nested ? true : false; + + //Touch Events + if (s.browser.ie) { + touchEventsTarget[action](s.touchEvents.start, s.onTouchStart, false); + target[action](s.touchEvents.move, s.onTouchMove, moveCapture); + target[action](s.touchEvents.end, s.onTouchEnd, false); + } + else { + if (s.support.touch) { + var passiveListener = s.touchEvents.start === 'touchstart' && s.support.passiveListener && s.params.passiveListeners ? {passive: true, capture: false} : false; + touchEventsTarget[action](s.touchEvents.start, s.onTouchStart, passiveListener); + touchEventsTarget[action](s.touchEvents.move, s.onTouchMove, moveCapture); + touchEventsTarget[action](s.touchEvents.end, s.onTouchEnd, passiveListener); + } + if ((params.simulateTouch && !s.device.ios && !s.device.android) || (params.simulateTouch && !s.support.touch && s.device.ios)) { + touchEventsTarget[action]('mousedown', s.onTouchStart, false); + document[action]('mousemove', s.onTouchMove, moveCapture); + document[action]('mouseup', s.onTouchEnd, false); + } + } + window[action]('resize', s.onResize); + + // Next, Prev, Index + if (s.params.nextButton && s.nextButton && s.nextButton.length > 0) { + s.nextButton[actionDom]('click', s.onClickNext); + if (s.params.a11y && s.a11y) s.nextButton[actionDom]('keydown', s.a11y.onEnterKey); + } + if (s.params.prevButton && s.prevButton && s.prevButton.length > 0) { + s.prevButton[actionDom]('click', s.onClickPrev); + if (s.params.a11y && s.a11y) s.prevButton[actionDom]('keydown', s.a11y.onEnterKey); + } + if (s.params.pagination && s.params.paginationClickable) { + s.paginationContainer[actionDom]('click', '.' + s.params.bulletClass, s.onClickIndex); + if (s.params.a11y && s.a11y) s.paginationContainer[actionDom]('keydown', '.' + s.params.bulletClass, s.a11y.onEnterKey); + } + + // Prevent Links Clicks + if (s.params.preventClicks || s.params.preventClicksPropagation) touchEventsTarget[action]('click', s.preventClicks, true); + }; + s.attachEvents = function () { + s.initEvents(); + }; + s.detachEvents = function () { + s.initEvents(true); + }; + + /*========================= + Handle Clicks + ===========================*/ + // Prevent Clicks + s.allowClick = true; + s.preventClicks = function (e) { + if (!s.allowClick) { + if (s.params.preventClicks) e.preventDefault(); + if (s.params.preventClicksPropagation && s.animating) { + e.stopPropagation(); + e.stopImmediatePropagation(); + } + } + }; + // Clicks + s.onClickNext = function (e) { + e.preventDefault(); + if (s.isEnd && !s.params.loop) return; + s.slideNext(); + }; + s.onClickPrev = function (e) { + e.preventDefault(); + if (s.isBeginning && !s.params.loop) return; + s.slidePrev(); + }; + s.onClickIndex = function (e) { + e.preventDefault(); + var index = $(this).index() * s.params.slidesPerGroup; + if (s.params.loop) index = index + s.loopedSlides; + s.slideTo(index); + }; + + /*========================= + Handle Touches + ===========================*/ + function findElementInEvent(e, selector) { + var el = $(e.target); + if (!el.is(selector)) { + if (typeof selector === 'string') { + el = el.parents(selector); + } + else if (selector.nodeType) { + var found; + el.parents().each(function (index, _el) { + if (_el === selector) found = selector; + }); + if (!found) return undefined; + else return selector; + } + } + if (el.length === 0) { + return undefined; + } + return el[0]; + } + s.updateClickedSlide = function (e) { + var slide = findElementInEvent(e, '.' + s.params.slideClass); + var slideFound = false; + if (slide) { + for (var i = 0; i < s.slides.length; i++) { + if (s.slides[i] === slide) slideFound = true; + } + } + + if (slide && slideFound) { + s.clickedSlide = slide; + s.clickedIndex = $(slide).index(); + } + else { + s.clickedSlide = undefined; + s.clickedIndex = undefined; + return; + } + if (s.params.slideToClickedSlide && s.clickedIndex !== undefined && s.clickedIndex !== s.activeIndex) { + var slideToIndex = s.clickedIndex, + realIndex, + duplicatedSlides, + slidesPerView = s.params.slidesPerView === 'auto' ? s.currentSlidesPerView() : s.params.slidesPerView; + if (s.params.loop) { + if (s.animating) return; + realIndex = parseInt($(s.clickedSlide).attr('data-swiper-slide-index'), 10); + if (s.params.centeredSlides) { + if ((slideToIndex < s.loopedSlides - slidesPerView/2) || (slideToIndex > s.slides.length - s.loopedSlides + slidesPerView/2)) { + s.fixLoop(); + slideToIndex = s.wrapper.children('.' + s.params.slideClass + '[data-swiper-slide-index="' + realIndex + '"]:not(.' + s.params.slideDuplicateClass + ')').eq(0).index(); + setTimeout(function () { + s.slideTo(slideToIndex); + }, 0); + } + else { + s.slideTo(slideToIndex); + } + } + else { + if (slideToIndex > s.slides.length - slidesPerView) { + s.fixLoop(); + slideToIndex = s.wrapper.children('.' + s.params.slideClass + '[data-swiper-slide-index="' + realIndex + '"]:not(.' + s.params.slideDuplicateClass + ')').eq(0).index(); + setTimeout(function () { + s.slideTo(slideToIndex); + }, 0); + } + else { + s.slideTo(slideToIndex); + } + } + } + else { + s.slideTo(slideToIndex); + } + } + }; + + var isTouched, + isMoved, + allowTouchCallbacks, + touchStartTime, + isScrolling, + currentTranslate, + startTranslate, + allowThresholdMove, + // Form elements to match + formElements = 'input, select, textarea, button, video', + // Last click time + lastClickTime = Date.now(), clickTimeout, + //Velocities + velocities = [], + allowMomentumBounce; + + // Animating Flag + s.animating = false; + + // Touches information + s.touches = { + startX: 0, + startY: 0, + currentX: 0, + currentY: 0, + diff: 0 + }; + + // Touch handlers + var isTouchEvent, startMoving; + s.onTouchStart = function (e) { + if (e.originalEvent) e = e.originalEvent; + isTouchEvent = e.type === 'touchstart'; + if (!isTouchEvent && 'which' in e && e.which === 3) return; + if (s.params.noSwiping && findElementInEvent(e, '.' + s.params.noSwipingClass)) { + s.allowClick = true; + return; + } + if (s.params.swipeHandler) { + if (!findElementInEvent(e, s.params.swipeHandler)) return; + } + + var startX = s.touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX; + var startY = s.touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY; + + // Do NOT start if iOS edge swipe is detected. Otherwise iOS app (UIWebView) cannot swipe-to-go-back anymore + if(s.device.ios && s.params.iOSEdgeSwipeDetection && startX <= s.params.iOSEdgeSwipeThreshold) { + return; + } + + isTouched = true; + isMoved = false; + allowTouchCallbacks = true; + isScrolling = undefined; + startMoving = undefined; + s.touches.startX = startX; + s.touches.startY = startY; + touchStartTime = Date.now(); + s.allowClick = true; + s.updateContainerSize(); + s.swipeDirection = undefined; + if (s.params.threshold > 0) allowThresholdMove = false; + if (e.type !== 'touchstart') { + var preventDefault = true; + if ($(e.target).is(formElements)) preventDefault = false; + if (document.activeElement && $(document.activeElement).is(formElements)) { + document.activeElement.blur(); + } + if (preventDefault) { + e.preventDefault(); + } + } + s.emit('onTouchStart', s, e); + }; + + s.onTouchMove = function (e) { + if (e.originalEvent) e = e.originalEvent; + if (isTouchEvent && e.type === 'mousemove') return; + if (e.preventedByNestedSwiper) { + s.touches.startX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX; + s.touches.startY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY; + return; + } + if (s.params.onlyExternal) { + // isMoved = true; + s.allowClick = false; + if (isTouched) { + s.touches.startX = s.touches.currentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX; + s.touches.startY = s.touches.currentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY; + touchStartTime = Date.now(); + } + return; + } + if (isTouchEvent && s.params.touchReleaseOnEdges && !s.params.loop) { + if (!s.isHorizontal()) { + // Vertical + if ( + (s.touches.currentY < s.touches.startY && s.translate <= s.maxTranslate()) || + (s.touches.currentY > s.touches.startY && s.translate >= s.minTranslate()) + ) { + return; + } + } + else { + if ( + (s.touches.currentX < s.touches.startX && s.translate <= s.maxTranslate()) || + (s.touches.currentX > s.touches.startX && s.translate >= s.minTranslate()) + ) { + return; + } + } + } + if (isTouchEvent && document.activeElement) { + if (e.target === document.activeElement && $(e.target).is(formElements)) { + isMoved = true; + s.allowClick = false; + return; + } + } + if (allowTouchCallbacks) { + s.emit('onTouchMove', s, e); + } + if (e.targetTouches && e.targetTouches.length > 1) return; + + s.touches.currentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX; + s.touches.currentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY; + + if (typeof isScrolling === 'undefined') { + var touchAngle; + if (s.isHorizontal() && s.touches.currentY === s.touches.startY || !s.isHorizontal() && s.touches.currentX === s.touches.startX) { + isScrolling = false; + } + else { + touchAngle = Math.atan2(Math.abs(s.touches.currentY - s.touches.startY), Math.abs(s.touches.currentX - s.touches.startX)) * 180 / Math.PI; + isScrolling = s.isHorizontal() ? touchAngle > s.params.touchAngle : (90 - touchAngle > s.params.touchAngle); + } + } + if (isScrolling) { + s.emit('onTouchMoveOpposite', s, e); + } + if (typeof startMoving === 'undefined') { + if (s.touches.currentX !== s.touches.startX || s.touches.currentY !== s.touches.startY) { + startMoving = true; + } + } + if (!isTouched) return; + if (isScrolling) { + isTouched = false; + return; + } + if (!startMoving) { + return; + } + s.allowClick = false; + s.emit('onSliderMove', s, e); + e.preventDefault(); + if (s.params.touchMoveStopPropagation && !s.params.nested) { + e.stopPropagation(); + } + + if (!isMoved) { + if (params.loop) { + s.fixLoop(); + } + startTranslate = s.getWrapperTranslate(); + s.setWrapperTransition(0); + if (s.animating) { + s.wrapper.trigger('webkitTransitionEnd transitionend oTransitionEnd MSTransitionEnd msTransitionEnd'); + } + if (s.params.autoplay && s.autoplaying) { + if (s.params.autoplayDisableOnInteraction) { + s.stopAutoplay(); + } + else { + s.pauseAutoplay(); + } + } + allowMomentumBounce = false; + //Grab Cursor + if (s.params.grabCursor && (s.params.allowSwipeToNext === true || s.params.allowSwipeToPrev === true)) { + s.setGrabCursor(true); + } + } + isMoved = true; + + var diff = s.touches.diff = s.isHorizontal() ? s.touches.currentX - s.touches.startX : s.touches.currentY - s.touches.startY; + + diff = diff * s.params.touchRatio; + if (s.rtl) diff = -diff; + + s.swipeDirection = diff > 0 ? 'prev' : 'next'; + currentTranslate = diff + startTranslate; + + var disableParentSwiper = true; + if ((diff > 0 && currentTranslate > s.minTranslate())) { + disableParentSwiper = false; + if (s.params.resistance) currentTranslate = s.minTranslate() - 1 + Math.pow(-s.minTranslate() + startTranslate + diff, s.params.resistanceRatio); + } + else if (diff < 0 && currentTranslate < s.maxTranslate()) { + disableParentSwiper = false; + if (s.params.resistance) currentTranslate = s.maxTranslate() + 1 - Math.pow(s.maxTranslate() - startTranslate - diff, s.params.resistanceRatio); + } + + if (disableParentSwiper) { + e.preventedByNestedSwiper = true; + } + + // Directions locks + if (!s.params.allowSwipeToNext && s.swipeDirection === 'next' && currentTranslate < startTranslate) { + currentTranslate = startTranslate; + } + if (!s.params.allowSwipeToPrev && s.swipeDirection === 'prev' && currentTranslate > startTranslate) { + currentTranslate = startTranslate; + } + + + // Threshold + if (s.params.threshold > 0) { + if (Math.abs(diff) > s.params.threshold || allowThresholdMove) { + if (!allowThresholdMove) { + allowThresholdMove = true; + s.touches.startX = s.touches.currentX; + s.touches.startY = s.touches.currentY; + currentTranslate = startTranslate; + s.touches.diff = s.isHorizontal() ? s.touches.currentX - s.touches.startX : s.touches.currentY - s.touches.startY; + return; + } + } + else { + currentTranslate = startTranslate; + return; + } + } + + if (!s.params.followFinger) return; + + // Update active index in free mode + if (s.params.freeMode || s.params.watchSlidesProgress) { + s.updateActiveIndex(); + } + if (s.params.freeMode) { + //Velocity + if (velocities.length === 0) { + velocities.push({ + position: s.touches[s.isHorizontal() ? 'startX' : 'startY'], + time: touchStartTime + }); + } + velocities.push({ + position: s.touches[s.isHorizontal() ? 'currentX' : 'currentY'], + time: (new window.Date()).getTime() + }); + } + // Update progress + s.updateProgress(currentTranslate); + // Update translate + s.setWrapperTranslate(currentTranslate); + }; + s.onTouchEnd = function (e) { + if (e.originalEvent) e = e.originalEvent; + if (allowTouchCallbacks) { + s.emit('onTouchEnd', s, e); + } + allowTouchCallbacks = false; + if (!isTouched) return; + //Return Grab Cursor + if (s.params.grabCursor && isMoved && isTouched && (s.params.allowSwipeToNext === true || s.params.allowSwipeToPrev === true)) { + s.setGrabCursor(false); + } + + // Time diff + var touchEndTime = Date.now(); + var timeDiff = touchEndTime - touchStartTime; + + // Tap, doubleTap, Click + if (s.allowClick) { + s.updateClickedSlide(e); + s.emit('onTap', s, e); + if (timeDiff < 300 && (touchEndTime - lastClickTime) > 300) { + if (clickTimeout) clearTimeout(clickTimeout); + clickTimeout = setTimeout(function () { + if (!s) return; + if (s.params.paginationHide && s.paginationContainer.length > 0 && !$(e.target).hasClass(s.params.bulletClass)) { + s.paginationContainer.toggleClass(s.params.paginationHiddenClass); + } + s.emit('onClick', s, e); + }, 300); + + } + if (timeDiff < 300 && (touchEndTime - lastClickTime) < 300) { + if (clickTimeout) clearTimeout(clickTimeout); + s.emit('onDoubleTap', s, e); + } + } + + lastClickTime = Date.now(); + setTimeout(function () { + if (s) s.allowClick = true; + }, 0); + + if (!isTouched || !isMoved || !s.swipeDirection || s.touches.diff === 0 || currentTranslate === startTranslate) { + isTouched = isMoved = false; + return; + } + isTouched = isMoved = false; + + var currentPos; + if (s.params.followFinger) { + currentPos = s.rtl ? s.translate : -s.translate; + } + else { + currentPos = -currentTranslate; + } + if (s.params.freeMode) { + if (currentPos < -s.minTranslate()) { + s.slideTo(s.activeIndex); + return; + } + else if (currentPos > -s.maxTranslate()) { + if (s.slides.length < s.snapGrid.length) { + s.slideTo(s.snapGrid.length - 1); + } + else { + s.slideTo(s.slides.length - 1); + } + return; + } + + if (s.params.freeModeMomentum) { + if (velocities.length > 1) { + var lastMoveEvent = velocities.pop(), velocityEvent = velocities.pop(); + + var distance = lastMoveEvent.position - velocityEvent.position; + var time = lastMoveEvent.time - velocityEvent.time; + s.velocity = distance / time; + s.velocity = s.velocity / 2; + if (Math.abs(s.velocity) < s.params.freeModeMinimumVelocity) { + s.velocity = 0; + } + // this implies that the user stopped moving a finger then released. + // There would be no events with distance zero, so the last event is stale. + if (time > 150 || (new window.Date().getTime() - lastMoveEvent.time) > 300) { + s.velocity = 0; + } + } else { + s.velocity = 0; + } + s.velocity = s.velocity * s.params.freeModeMomentumVelocityRatio; + + velocities.length = 0; + var momentumDuration = 1000 * s.params.freeModeMomentumRatio; + var momentumDistance = s.velocity * momentumDuration; + + var newPosition = s.translate + momentumDistance; + if (s.rtl) newPosition = - newPosition; + var doBounce = false; + var afterBouncePosition; + var bounceAmount = Math.abs(s.velocity) * 20 * s.params.freeModeMomentumBounceRatio; + if (newPosition < s.maxTranslate()) { + if (s.params.freeModeMomentumBounce) { + if (newPosition + s.maxTranslate() < -bounceAmount) { + newPosition = s.maxTranslate() - bounceAmount; + } + afterBouncePosition = s.maxTranslate(); + doBounce = true; + allowMomentumBounce = true; + } + else { + newPosition = s.maxTranslate(); + } + } + else if (newPosition > s.minTranslate()) { + if (s.params.freeModeMomentumBounce) { + if (newPosition - s.minTranslate() > bounceAmount) { + newPosition = s.minTranslate() + bounceAmount; + } + afterBouncePosition = s.minTranslate(); + doBounce = true; + allowMomentumBounce = true; + } + else { + newPosition = s.minTranslate(); + } + } + else if (s.params.freeModeSticky) { + var j = 0, + nextSlide; + for (j = 0; j < s.snapGrid.length; j += 1) { + if (s.snapGrid[j] > -newPosition) { + nextSlide = j; + break; + } + + } + if (Math.abs(s.snapGrid[nextSlide] - newPosition) < Math.abs(s.snapGrid[nextSlide - 1] - newPosition) || s.swipeDirection === 'next') { + newPosition = s.snapGrid[nextSlide]; + } else { + newPosition = s.snapGrid[nextSlide - 1]; + } + if (!s.rtl) newPosition = - newPosition; + } + //Fix duration + if (s.velocity !== 0) { + if (s.rtl) { + momentumDuration = Math.abs((-newPosition - s.translate) / s.velocity); + } + else { + momentumDuration = Math.abs((newPosition - s.translate) / s.velocity); + } + } + else if (s.params.freeModeSticky) { + s.slideReset(); + return; + } + + if (s.params.freeModeMomentumBounce && doBounce) { + s.updateProgress(afterBouncePosition); + s.setWrapperTransition(momentumDuration); + s.setWrapperTranslate(newPosition); + s.onTransitionStart(); + s.animating = true; + s.wrapper.transitionEnd(function () { + if (!s || !allowMomentumBounce) return; + s.emit('onMomentumBounce', s); + + s.setWrapperTransition(s.params.speed); + s.setWrapperTranslate(afterBouncePosition); + s.wrapper.transitionEnd(function () { + if (!s) return; + s.onTransitionEnd(); + }); + }); + } else if (s.velocity) { + s.updateProgress(newPosition); + s.setWrapperTransition(momentumDuration); + s.setWrapperTranslate(newPosition); + s.onTransitionStart(); + if (!s.animating) { + s.animating = true; + s.wrapper.transitionEnd(function () { + if (!s) return; + s.onTransitionEnd(); + }); + } + + } else { + s.updateProgress(newPosition); + } + + s.updateActiveIndex(); + } + if (!s.params.freeModeMomentum || timeDiff >= s.params.longSwipesMs) { + s.updateProgress(); + s.updateActiveIndex(); + } + return; + } + + // Find current slide + var i, stopIndex = 0, groupSize = s.slidesSizesGrid[0]; + for (i = 0; i < s.slidesGrid.length; i += s.params.slidesPerGroup) { + if (typeof s.slidesGrid[i + s.params.slidesPerGroup] !== 'undefined') { + if (currentPos >= s.slidesGrid[i] && currentPos < s.slidesGrid[i + s.params.slidesPerGroup]) { + stopIndex = i; + groupSize = s.slidesGrid[i + s.params.slidesPerGroup] - s.slidesGrid[i]; + } + } + else { + if (currentPos >= s.slidesGrid[i]) { + stopIndex = i; + groupSize = s.slidesGrid[s.slidesGrid.length - 1] - s.slidesGrid[s.slidesGrid.length - 2]; + } + } + } + + // Find current slide size + var ratio = (currentPos - s.slidesGrid[stopIndex]) / groupSize; + + if (timeDiff > s.params.longSwipesMs) { + // Long touches + if (!s.params.longSwipes) { + s.slideTo(s.activeIndex); + return; + } + if (s.swipeDirection === 'next') { + if (ratio >= s.params.longSwipesRatio) s.slideTo(stopIndex + s.params.slidesPerGroup); + else s.slideTo(stopIndex); + + } + if (s.swipeDirection === 'prev') { + if (ratio > (1 - s.params.longSwipesRatio)) s.slideTo(stopIndex + s.params.slidesPerGroup); + else s.slideTo(stopIndex); + } + } + else { + // Short swipes + if (!s.params.shortSwipes) { + s.slideTo(s.activeIndex); + return; + } + if (s.swipeDirection === 'next') { + s.slideTo(stopIndex + s.params.slidesPerGroup); + + } + if (s.swipeDirection === 'prev') { + s.slideTo(stopIndex); + } + } + }; + /*========================= + Transitions + ===========================*/ + s._slideTo = function (slideIndex, speed) { + return s.slideTo(slideIndex, speed, true, true); + }; + s.slideTo = function (slideIndex, speed, runCallbacks, internal) { + if (typeof runCallbacks === 'undefined') runCallbacks = true; + if (typeof slideIndex === 'undefined') slideIndex = 0; + if (slideIndex < 0) slideIndex = 0; + s.snapIndex = Math.floor(slideIndex / s.params.slidesPerGroup); + if (s.snapIndex >= s.snapGrid.length) s.snapIndex = s.snapGrid.length - 1; + + var translate = - s.snapGrid[s.snapIndex]; + // Stop autoplay + if (s.params.autoplay && s.autoplaying) { + if (internal || !s.params.autoplayDisableOnInteraction) { + s.pauseAutoplay(speed); + } + else { + s.stopAutoplay(); + } + } + // Update progress + s.updateProgress(translate); + + // Normalize slideIndex + if(s.params.normalizeSlideIndex){ + for (var i = 0; i < s.slidesGrid.length; i++) { + if (- Math.floor(translate * 100) >= Math.floor(s.slidesGrid[i] * 100)) { + slideIndex = i; + } + } + } + + // Directions locks + if (!s.params.allowSwipeToNext && translate < s.translate && translate < s.minTranslate()) { + return false; + } + if (!s.params.allowSwipeToPrev && translate > s.translate && translate > s.maxTranslate()) { + if ((s.activeIndex || 0) !== slideIndex ) return false; + } + + // Update Index + if (typeof speed === 'undefined') speed = s.params.speed; + s.previousIndex = s.activeIndex || 0; + s.activeIndex = slideIndex; + s.updateRealIndex(); + if ((s.rtl && -translate === s.translate) || (!s.rtl && translate === s.translate)) { + // Update Height + if (s.params.autoHeight) { + s.updateAutoHeight(); + } + s.updateClasses(); + if (s.params.effect !== 'slide') { + s.setWrapperTranslate(translate); + } + return false; + } + s.updateClasses(); + s.onTransitionStart(runCallbacks); + + if (speed === 0 || s.browser.lteIE9) { + s.setWrapperTranslate(translate); + s.setWrapperTransition(0); + s.onTransitionEnd(runCallbacks); + } + else { + s.setWrapperTranslate(translate); + s.setWrapperTransition(speed); + if (!s.animating) { + s.animating = true; + s.wrapper.transitionEnd(function () { + if (!s) return; + s.onTransitionEnd(runCallbacks); + }); + } + + } + + return true; + }; + + s.onTransitionStart = function (runCallbacks) { + if (typeof runCallbacks === 'undefined') runCallbacks = true; + if (s.params.autoHeight) { + s.updateAutoHeight(); + } + if (s.lazy) s.lazy.onTransitionStart(); + if (runCallbacks) { + s.emit('onTransitionStart', s); + if (s.activeIndex !== s.previousIndex) { + s.emit('onSlideChangeStart', s); + if (s.activeIndex > s.previousIndex) { + s.emit('onSlideNextStart', s); + } + else { + s.emit('onSlidePrevStart', s); + } + } + + } + }; + s.onTransitionEnd = function (runCallbacks) { + s.animating = false; + s.setWrapperTransition(0); + if (typeof runCallbacks === 'undefined') runCallbacks = true; + if (s.lazy) s.lazy.onTransitionEnd(); + if (runCallbacks) { + s.emit('onTransitionEnd', s); + if (s.activeIndex !== s.previousIndex) { + s.emit('onSlideChangeEnd', s); + if (s.activeIndex > s.previousIndex) { + s.emit('onSlideNextEnd', s); + } + else { + s.emit('onSlidePrevEnd', s); + } + } + } + if (s.params.history && s.history) { + s.history.setHistory(s.params.history, s.activeIndex); + } + if (s.params.hashnav && s.hashnav) { + s.hashnav.setHash(); + } + + }; + s.slideNext = function (runCallbacks, speed, internal) { + if (s.params.loop) { + if (s.animating) return false; + s.fixLoop(); + var clientLeft = s.container[0].clientLeft; + return s.slideTo(s.activeIndex + s.params.slidesPerGroup, speed, runCallbacks, internal); + } + else return s.slideTo(s.activeIndex + s.params.slidesPerGroup, speed, runCallbacks, internal); + }; + s._slideNext = function (speed) { + return s.slideNext(true, speed, true); + }; + s.slidePrev = function (runCallbacks, speed, internal) { + if (s.params.loop) { + if (s.animating) return false; + s.fixLoop(); + var clientLeft = s.container[0].clientLeft; + return s.slideTo(s.activeIndex - 1, speed, runCallbacks, internal); + } + else return s.slideTo(s.activeIndex - 1, speed, runCallbacks, internal); + }; + s._slidePrev = function (speed) { + return s.slidePrev(true, speed, true); + }; + s.slideReset = function (runCallbacks, speed, internal) { + return s.slideTo(s.activeIndex, speed, runCallbacks); + }; + + s.disableTouchControl = function () { + s.params.onlyExternal = true; + return true; + }; + s.enableTouchControl = function () { + s.params.onlyExternal = false; + return true; + }; + + /*========================= + Translate/transition helpers + ===========================*/ + s.setWrapperTransition = function (duration, byController) { + s.wrapper.transition(duration); + if (s.params.effect !== 'slide' && s.effects[s.params.effect]) { + s.effects[s.params.effect].setTransition(duration); + } + if (s.params.parallax && s.parallax) { + s.parallax.setTransition(duration); + } + if (s.params.scrollbar && s.scrollbar) { + s.scrollbar.setTransition(duration); + } + if (s.params.control && s.controller) { + s.controller.setTransition(duration, byController); + } + s.emit('onSetTransition', s, duration); + }; + s.setWrapperTranslate = function (translate, updateActiveIndex, byController) { + var x = 0, y = 0, z = 0; + if (s.isHorizontal()) { + x = s.rtl ? -translate : translate; + } + else { + y = translate; + } + + if (s.params.roundLengths) { + x = round(x); + y = round(y); + } + + if (!s.params.virtualTranslate) { + if (s.support.transforms3d) s.wrapper.transform('translate3d(' + x + 'px, ' + y + 'px, ' + z + 'px)'); + else s.wrapper.transform('translate(' + x + 'px, ' + y + 'px)'); + } + + s.translate = s.isHorizontal() ? x : y; + + // Check if we need to update progress + var progress; + var translatesDiff = s.maxTranslate() - s.minTranslate(); + if (translatesDiff === 0) { + progress = 0; + } + else { + progress = (translate - s.minTranslate()) / (translatesDiff); + } + if (progress !== s.progress) { + s.updateProgress(translate); + } + + if (updateActiveIndex) s.updateActiveIndex(); + if (s.params.effect !== 'slide' && s.effects[s.params.effect]) { + s.effects[s.params.effect].setTranslate(s.translate); + } + if (s.params.parallax && s.parallax) { + s.parallax.setTranslate(s.translate); + } + if (s.params.scrollbar && s.scrollbar) { + s.scrollbar.setTranslate(s.translate); + } + if (s.params.control && s.controller) { + s.controller.setTranslate(s.translate, byController); + } + s.emit('onSetTranslate', s, s.translate); + }; + + s.getTranslate = function (el, axis) { + var matrix, curTransform, curStyle, transformMatrix; + + // automatic axis detection + if (typeof axis === 'undefined') { + axis = 'x'; + } + + if (s.params.virtualTranslate) { + return s.rtl ? -s.translate : s.translate; + } + + curStyle = window.getComputedStyle(el, null); + if (window.WebKitCSSMatrix) { + curTransform = curStyle.transform || curStyle.webkitTransform; + if (curTransform.split(',').length > 6) { + curTransform = curTransform.split(', ').map(function(a){ + return a.replace(',','.'); + }).join(', '); + } + // Some old versions of Webkit choke when 'none' is passed; pass + // empty string instead in this case + transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform); + } + else { + transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,'); + matrix = transformMatrix.toString().split(','); + } + + if (axis === 'x') { + //Latest Chrome and webkits Fix + if (window.WebKitCSSMatrix) + curTransform = transformMatrix.m41; + //Crazy IE10 Matrix + else if (matrix.length === 16) + curTransform = parseFloat(matrix[12]); + //Normal Browsers + else + curTransform = parseFloat(matrix[4]); + } + if (axis === 'y') { + //Latest Chrome and webkits Fix + if (window.WebKitCSSMatrix) + curTransform = transformMatrix.m42; + //Crazy IE10 Matrix + else if (matrix.length === 16) + curTransform = parseFloat(matrix[13]); + //Normal Browsers + else + curTransform = parseFloat(matrix[5]); + } + if (s.rtl && curTransform) curTransform = -curTransform; + return curTransform || 0; + }; + s.getWrapperTranslate = function (axis) { + if (typeof axis === 'undefined') { + axis = s.isHorizontal() ? 'x' : 'y'; + } + return s.getTranslate(s.wrapper[0], axis); + }; + + /*========================= + Observer + ===========================*/ + s.observers = []; + function initObserver(target, options) { + options = options || {}; + // create an observer instance + var ObserverFunc = window.MutationObserver || window.WebkitMutationObserver; + var observer = new ObserverFunc(function (mutations) { + mutations.forEach(function (mutation) { + s.onResize(true); + s.emit('onObserverUpdate', s, mutation); + }); + }); + + observer.observe(target, { + attributes: typeof options.attributes === 'undefined' ? true : options.attributes, + childList: typeof options.childList === 'undefined' ? true : options.childList, + characterData: typeof options.characterData === 'undefined' ? true : options.characterData + }); + + s.observers.push(observer); + } + s.initObservers = function () { + if (s.params.observeParents) { + var containerParents = s.container.parents(); + for (var i = 0; i < containerParents.length; i++) { + initObserver(containerParents[i]); + } + } + + // Observe container + initObserver(s.container[0], {childList: false}); + + // Observe wrapper + initObserver(s.wrapper[0], {attributes: false}); + }; + s.disconnectObservers = function () { + for (var i = 0; i < s.observers.length; i++) { + s.observers[i].disconnect(); + } + s.observers = []; + }; + /*========================= + Loop + ===========================*/ + // Create looped slides + s.createLoop = function () { + // Remove duplicated slides + s.wrapper.children('.' + s.params.slideClass + '.' + s.params.slideDuplicateClass).remove(); + + var slides = s.wrapper.children('.' + s.params.slideClass); + + if(s.params.slidesPerView === 'auto' && !s.params.loopedSlides) s.params.loopedSlides = slides.length; + + s.loopedSlides = parseInt(s.params.loopedSlides || s.params.slidesPerView, 10); + s.loopedSlides = s.loopedSlides + s.params.loopAdditionalSlides; + if (s.loopedSlides > slides.length) { + s.loopedSlides = slides.length; + } + + var prependSlides = [], appendSlides = [], i; + slides.each(function (index, el) { + var slide = $(this); + if (index < s.loopedSlides) appendSlides.push(el); + if (index < slides.length && index >= slides.length - s.loopedSlides) prependSlides.push(el); + slide.attr('data-swiper-slide-index', index); + }); + for (i = 0; i < appendSlides.length; i++) { + s.wrapper.append($(appendSlides[i].cloneNode(true)).addClass(s.params.slideDuplicateClass)); + } + for (i = prependSlides.length - 1; i >= 0; i--) { + s.wrapper.prepend($(prependSlides[i].cloneNode(true)).addClass(s.params.slideDuplicateClass)); + } + }; + s.destroyLoop = function () { + s.wrapper.children('.' + s.params.slideClass + '.' + s.params.slideDuplicateClass).remove(); + s.slides.removeAttr('data-swiper-slide-index'); + }; + s.reLoop = function (updatePosition) { + var oldIndex = s.activeIndex - s.loopedSlides; + s.destroyLoop(); + s.createLoop(); + s.updateSlidesSize(); + if (updatePosition) { + s.slideTo(oldIndex + s.loopedSlides, 0, false); + } + + }; + s.fixLoop = function () { + var newIndex; + //Fix For Negative Oversliding + if (s.activeIndex < s.loopedSlides) { + newIndex = s.slides.length - s.loopedSlides * 3 + s.activeIndex; + newIndex = newIndex + s.loopedSlides; + s.slideTo(newIndex, 0, false, true); + } + //Fix For Positive Oversliding + else if ((s.params.slidesPerView === 'auto' && s.activeIndex >= s.loopedSlides * 2) || (s.activeIndex > s.slides.length - s.params.slidesPerView * 2)) { + newIndex = -s.slides.length + s.activeIndex + s.loopedSlides; + newIndex = newIndex + s.loopedSlides; + s.slideTo(newIndex, 0, false, true); + } + }; + /*========================= + Append/Prepend/Remove Slides + ===========================*/ + s.appendSlide = function (slides) { + if (s.params.loop) { + s.destroyLoop(); + } + if (typeof slides === 'object' && slides.length) { + for (var i = 0; i < slides.length; i++) { + if (slides[i]) s.wrapper.append(slides[i]); + } + } + else { + s.wrapper.append(slides); + } + if (s.params.loop) { + s.createLoop(); + } + if (!(s.params.observer && s.support.observer)) { + s.update(true); + } + }; + s.prependSlide = function (slides) { + if (s.params.loop) { + s.destroyLoop(); + } + var newActiveIndex = s.activeIndex + 1; + if (typeof slides === 'object' && slides.length) { + for (var i = 0; i < slides.length; i++) { + if (slides[i]) s.wrapper.prepend(slides[i]); + } + newActiveIndex = s.activeIndex + slides.length; + } + else { + s.wrapper.prepend(slides); + } + if (s.params.loop) { + s.createLoop(); + } + if (!(s.params.observer && s.support.observer)) { + s.update(true); + } + s.slideTo(newActiveIndex, 0, false); + }; + s.removeSlide = function (slidesIndexes) { + if (s.params.loop) { + s.destroyLoop(); + s.slides = s.wrapper.children('.' + s.params.slideClass); + } + var newActiveIndex = s.activeIndex, + indexToRemove; + if (typeof slidesIndexes === 'object' && slidesIndexes.length) { + for (var i = 0; i < slidesIndexes.length; i++) { + indexToRemove = slidesIndexes[i]; + if (s.slides[indexToRemove]) s.slides.eq(indexToRemove).remove(); + if (indexToRemove < newActiveIndex) newActiveIndex--; + } + newActiveIndex = Math.max(newActiveIndex, 0); + } + else { + indexToRemove = slidesIndexes; + if (s.slides[indexToRemove]) s.slides.eq(indexToRemove).remove(); + if (indexToRemove < newActiveIndex) newActiveIndex--; + newActiveIndex = Math.max(newActiveIndex, 0); + } + + if (s.params.loop) { + s.createLoop(); + } + + if (!(s.params.observer && s.support.observer)) { + s.update(true); + } + if (s.params.loop) { + s.slideTo(newActiveIndex + s.loopedSlides, 0, false); + } + else { + s.slideTo(newActiveIndex, 0, false); + } + + }; + s.removeAllSlides = function () { + var slidesIndexes = []; + for (var i = 0; i < s.slides.length; i++) { + slidesIndexes.push(i); + } + s.removeSlide(slidesIndexes); + }; + + + /*========================= + Effects + ===========================*/ + s.effects = { + fade: { + setTranslate: function () { + for (var i = 0; i < s.slides.length; i++) { + var slide = s.slides.eq(i); + var offset = slide[0].swiperSlideOffset; + var tx = -offset; + if (!s.params.virtualTranslate) tx = tx - s.translate; + var ty = 0; + if (!s.isHorizontal()) { + ty = tx; + tx = 0; + } + var slideOpacity = s.params.fade.crossFade ? + Math.max(1 - Math.abs(slide[0].progress), 0) : + 1 + Math.min(Math.max(slide[0].progress, -1), 0); + slide + .css({ + opacity: slideOpacity + }) + .transform('translate3d(' + tx + 'px, ' + ty + 'px, 0px)'); + + } + + }, + setTransition: function (duration) { + s.slides.transition(duration); + if (s.params.virtualTranslate && duration !== 0) { + var eventTriggered = false; + s.slides.transitionEnd(function () { + if (eventTriggered) return; + if (!s) return; + eventTriggered = true; + s.animating = false; + var triggerEvents = ['webkitTransitionEnd', 'transitionend', 'oTransitionEnd', 'MSTransitionEnd', 'msTransitionEnd']; + for (var i = 0; i < triggerEvents.length; i++) { + s.wrapper.trigger(triggerEvents[i]); + } + }); + } + } + }, + flip: { + setTranslate: function () { + for (var i = 0; i < s.slides.length; i++) { + var slide = s.slides.eq(i); + var progress = slide[0].progress; + if (s.params.flip.limitRotation) { + progress = Math.max(Math.min(slide[0].progress, 1), -1); + } + var offset = slide[0].swiperSlideOffset; + var rotate = -180 * progress, + rotateY = rotate, + rotateX = 0, + tx = -offset, + ty = 0; + if (!s.isHorizontal()) { + ty = tx; + tx = 0; + rotateX = -rotateY; + rotateY = 0; + } + else if (s.rtl) { + rotateY = -rotateY; + } + + slide[0].style.zIndex = -Math.abs(Math.round(progress)) + s.slides.length; + + if (s.params.flip.slideShadows) { + //Set shadows + var shadowBefore = s.isHorizontal() ? slide.find('.swiper-slide-shadow-left') : slide.find('.swiper-slide-shadow-top'); + var shadowAfter = s.isHorizontal() ? slide.find('.swiper-slide-shadow-right') : slide.find('.swiper-slide-shadow-bottom'); + if (shadowBefore.length === 0) { + shadowBefore = $('
'); + slide.append(shadowBefore); + } + if (shadowAfter.length === 0) { + shadowAfter = $('
'); + slide.append(shadowAfter); + } + if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0); + if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0); + } + + slide + .transform('translate3d(' + tx + 'px, ' + ty + 'px, 0px) rotateX(' + rotateX + 'deg) rotateY(' + rotateY + 'deg)'); + } + }, + setTransition: function (duration) { + s.slides.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration); + if (s.params.virtualTranslate && duration !== 0) { + var eventTriggered = false; + s.slides.eq(s.activeIndex).transitionEnd(function () { + if (eventTriggered) return; + if (!s) return; + if (!$(this).hasClass(s.params.slideActiveClass)) return; + eventTriggered = true; + s.animating = false; + var triggerEvents = ['webkitTransitionEnd', 'transitionend', 'oTransitionEnd', 'MSTransitionEnd', 'msTransitionEnd']; + for (var i = 0; i < triggerEvents.length; i++) { + s.wrapper.trigger(triggerEvents[i]); + } + }); + } + } + }, + cube: { + setTranslate: function () { + var wrapperRotate = 0, cubeShadow; + if (s.params.cube.shadow) { + if (s.isHorizontal()) { + cubeShadow = s.wrapper.find('.swiper-cube-shadow'); + if (cubeShadow.length === 0) { + cubeShadow = $('
'); + s.wrapper.append(cubeShadow); + } + cubeShadow.css({height: s.width + 'px'}); + } + else { + cubeShadow = s.container.find('.swiper-cube-shadow'); + if (cubeShadow.length === 0) { + cubeShadow = $('
'); + s.container.append(cubeShadow); + } + } + } + for (var i = 0; i < s.slides.length; i++) { + var slide = s.slides.eq(i); + var slideAngle = i * 90; + var round = Math.floor(slideAngle / 360); + if (s.rtl) { + slideAngle = -slideAngle; + round = Math.floor(-slideAngle / 360); + } + var progress = Math.max(Math.min(slide[0].progress, 1), -1); + var tx = 0, ty = 0, tz = 0; + if (i % 4 === 0) { + tx = - round * 4 * s.size; + tz = 0; + } + else if ((i - 1) % 4 === 0) { + tx = 0; + tz = - round * 4 * s.size; + } + else if ((i - 2) % 4 === 0) { + tx = s.size + round * 4 * s.size; + tz = s.size; + } + else if ((i - 3) % 4 === 0) { + tx = - s.size; + tz = 3 * s.size + s.size * 4 * round; + } + if (s.rtl) { + tx = -tx; + } + + if (!s.isHorizontal()) { + ty = tx; + tx = 0; + } + + var transform = 'rotateX(' + (s.isHorizontal() ? 0 : -slideAngle) + 'deg) rotateY(' + (s.isHorizontal() ? slideAngle : 0) + 'deg) translate3d(' + tx + 'px, ' + ty + 'px, ' + tz + 'px)'; + if (progress <= 1 && progress > -1) { + wrapperRotate = i * 90 + progress * 90; + if (s.rtl) wrapperRotate = -i * 90 - progress * 90; + } + slide.transform(transform); + if (s.params.cube.slideShadows) { + //Set shadows + var shadowBefore = s.isHorizontal() ? slide.find('.swiper-slide-shadow-left') : slide.find('.swiper-slide-shadow-top'); + var shadowAfter = s.isHorizontal() ? slide.find('.swiper-slide-shadow-right') : slide.find('.swiper-slide-shadow-bottom'); + if (shadowBefore.length === 0) { + shadowBefore = $('
'); + slide.append(shadowBefore); + } + if (shadowAfter.length === 0) { + shadowAfter = $('
'); + slide.append(shadowAfter); + } + if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0); + if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0); + } + } + s.wrapper.css({ + '-webkit-transform-origin': '50% 50% -' + (s.size / 2) + 'px', + '-moz-transform-origin': '50% 50% -' + (s.size / 2) + 'px', + '-ms-transform-origin': '50% 50% -' + (s.size / 2) + 'px', + 'transform-origin': '50% 50% -' + (s.size / 2) + 'px' + }); + + if (s.params.cube.shadow) { + if (s.isHorizontal()) { + cubeShadow.transform('translate3d(0px, ' + (s.width / 2 + s.params.cube.shadowOffset) + 'px, ' + (-s.width / 2) + 'px) rotateX(90deg) rotateZ(0deg) scale(' + (s.params.cube.shadowScale) + ')'); + } + else { + var shadowAngle = Math.abs(wrapperRotate) - Math.floor(Math.abs(wrapperRotate) / 90) * 90; + var multiplier = 1.5 - (Math.sin(shadowAngle * 2 * Math.PI / 360) / 2 + Math.cos(shadowAngle * 2 * Math.PI / 360) / 2); + var scale1 = s.params.cube.shadowScale, + scale2 = s.params.cube.shadowScale / multiplier, + offset = s.params.cube.shadowOffset; + cubeShadow.transform('scale3d(' + scale1 + ', 1, ' + scale2 + ') translate3d(0px, ' + (s.height / 2 + offset) + 'px, ' + (-s.height / 2 / scale2) + 'px) rotateX(-90deg)'); + } + } + var zFactor = (s.isSafari || s.isUiWebView) ? (-s.size / 2) : 0; + s.wrapper.transform('translate3d(0px,0,' + zFactor + 'px) rotateX(' + (s.isHorizontal() ? 0 : wrapperRotate) + 'deg) rotateY(' + (s.isHorizontal() ? -wrapperRotate : 0) + 'deg)'); + }, + setTransition: function (duration) { + s.slides.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration); + if (s.params.cube.shadow && !s.isHorizontal()) { + s.container.find('.swiper-cube-shadow').transition(duration); + } + } + }, + coverflow: { + setTranslate: function () { + var transform = s.translate; + var center = s.isHorizontal() ? -transform + s.width / 2 : -transform + s.height / 2; + var rotate = s.isHorizontal() ? s.params.coverflow.rotate: -s.params.coverflow.rotate; + var translate = s.params.coverflow.depth; + //Each slide offset from center + for (var i = 0, length = s.slides.length; i < length; i++) { + var slide = s.slides.eq(i); + var slideSize = s.slidesSizesGrid[i]; + var slideOffset = slide[0].swiperSlideOffset; + var offsetMultiplier = (center - slideOffset - slideSize / 2) / slideSize * s.params.coverflow.modifier; + + var rotateY = s.isHorizontal() ? rotate * offsetMultiplier : 0; + var rotateX = s.isHorizontal() ? 0 : rotate * offsetMultiplier; + // var rotateZ = 0 + var translateZ = -translate * Math.abs(offsetMultiplier); + + var translateY = s.isHorizontal() ? 0 : s.params.coverflow.stretch * (offsetMultiplier); + var translateX = s.isHorizontal() ? s.params.coverflow.stretch * (offsetMultiplier) : 0; + + //Fix for ultra small values + if (Math.abs(translateX) < 0.001) translateX = 0; + if (Math.abs(translateY) < 0.001) translateY = 0; + if (Math.abs(translateZ) < 0.001) translateZ = 0; + if (Math.abs(rotateY) < 0.001) rotateY = 0; + if (Math.abs(rotateX) < 0.001) rotateX = 0; + + var slideTransform = 'translate3d(' + translateX + 'px,' + translateY + 'px,' + translateZ + 'px) rotateX(' + rotateX + 'deg) rotateY(' + rotateY + 'deg)'; + + slide.transform(slideTransform); + slide[0].style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1; + if (s.params.coverflow.slideShadows) { + //Set shadows + var shadowBefore = s.isHorizontal() ? slide.find('.swiper-slide-shadow-left') : slide.find('.swiper-slide-shadow-top'); + var shadowAfter = s.isHorizontal() ? slide.find('.swiper-slide-shadow-right') : slide.find('.swiper-slide-shadow-bottom'); + if (shadowBefore.length === 0) { + shadowBefore = $('
'); + slide.append(shadowBefore); + } + if (shadowAfter.length === 0) { + shadowAfter = $('
'); + slide.append(shadowAfter); + } + if (shadowBefore.length) shadowBefore[0].style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0; + if (shadowAfter.length) shadowAfter[0].style.opacity = (-offsetMultiplier) > 0 ? -offsetMultiplier : 0; + } + } + + //Set correct perspective for IE10 + if (s.browser.ie) { + var ws = s.wrapper[0].style; + ws.perspectiveOrigin = center + 'px 50%'; + } + }, + setTransition: function (duration) { + s.slides.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration); + } + } + }; + + + /*========================= + Images Lazy Loading + ===========================*/ + s.lazy = { + initialImageLoaded: false, + loadImageInSlide: function (index, loadInDuplicate) { + if (typeof index === 'undefined') return; + if (typeof loadInDuplicate === 'undefined') loadInDuplicate = true; + if (s.slides.length === 0) return; + + var slide = s.slides.eq(index); + var img = slide.find('.' + s.params.lazyLoadingClass + ':not(.' + s.params.lazyStatusLoadedClass + '):not(.' + s.params.lazyStatusLoadingClass + ')'); + if (slide.hasClass(s.params.lazyLoadingClass) && !slide.hasClass(s.params.lazyStatusLoadedClass) && !slide.hasClass(s.params.lazyStatusLoadingClass)) { + img = img.add(slide[0]); + } + if (img.length === 0) return; + + img.each(function () { + var _img = $(this); + _img.addClass(s.params.lazyStatusLoadingClass); + var background = _img.attr('data-background'); + var src = _img.attr('data-src'), + srcset = _img.attr('data-srcset'), + sizes = _img.attr('data-sizes'); + s.loadImage(_img[0], (src || background), srcset, sizes, false, function () { + if (typeof s === 'undefined' || s === null || !s) return; + if (background) { + _img.css('background-image', 'url("' + background + '")'); + _img.removeAttr('data-background'); + } + else { + if (srcset) { + _img.attr('srcset', srcset); + _img.removeAttr('data-srcset'); + } + if (sizes) { + _img.attr('sizes', sizes); + _img.removeAttr('data-sizes'); + } + if (src) { + _img.attr('src', src); + _img.removeAttr('data-src'); + } + + } + + _img.addClass(s.params.lazyStatusLoadedClass).removeClass(s.params.lazyStatusLoadingClass); + slide.find('.' + s.params.lazyPreloaderClass + ', .' + s.params.preloaderClass).remove(); + if (s.params.loop && loadInDuplicate) { + var slideOriginalIndex = slide.attr('data-swiper-slide-index'); + if (slide.hasClass(s.params.slideDuplicateClass)) { + var originalSlide = s.wrapper.children('[data-swiper-slide-index="' + slideOriginalIndex + '"]:not(.' + s.params.slideDuplicateClass + ')'); + s.lazy.loadImageInSlide(originalSlide.index(), false); + } + else { + var duplicatedSlide = s.wrapper.children('.' + s.params.slideDuplicateClass + '[data-swiper-slide-index="' + slideOriginalIndex + '"]'); + s.lazy.loadImageInSlide(duplicatedSlide.index(), false); + } + } + s.emit('onLazyImageReady', s, slide[0], _img[0]); + }); + + s.emit('onLazyImageLoad', s, slide[0], _img[0]); + }); + + }, + load: function () { + var i; + var slidesPerView = s.params.slidesPerView; + if (slidesPerView === 'auto') { + slidesPerView = 0; + } + if (!s.lazy.initialImageLoaded) s.lazy.initialImageLoaded = true; + if (s.params.watchSlidesVisibility) { + s.wrapper.children('.' + s.params.slideVisibleClass).each(function () { + s.lazy.loadImageInSlide($(this).index()); + }); + } + else { + if (slidesPerView > 1) { + for (i = s.activeIndex; i < s.activeIndex + slidesPerView ; i++) { + if (s.slides[i]) s.lazy.loadImageInSlide(i); + } + } + else { + s.lazy.loadImageInSlide(s.activeIndex); + } + } + if (s.params.lazyLoadingInPrevNext) { + if (slidesPerView > 1 || (s.params.lazyLoadingInPrevNextAmount && s.params.lazyLoadingInPrevNextAmount > 1)) { + var amount = s.params.lazyLoadingInPrevNextAmount; + var spv = slidesPerView; + var maxIndex = Math.min(s.activeIndex + spv + Math.max(amount, spv), s.slides.length); + var minIndex = Math.max(s.activeIndex - Math.max(spv, amount), 0); + // Next Slides + for (i = s.activeIndex + slidesPerView; i < maxIndex; i++) { + if (s.slides[i]) s.lazy.loadImageInSlide(i); + } + // Prev Slides + for (i = minIndex; i < s.activeIndex ; i++) { + if (s.slides[i]) s.lazy.loadImageInSlide(i); + } + } + else { + var nextSlide = s.wrapper.children('.' + s.params.slideNextClass); + if (nextSlide.length > 0) s.lazy.loadImageInSlide(nextSlide.index()); + + var prevSlide = s.wrapper.children('.' + s.params.slidePrevClass); + if (prevSlide.length > 0) s.lazy.loadImageInSlide(prevSlide.index()); + } + } + }, + onTransitionStart: function () { + if (s.params.lazyLoading) { + if (s.params.lazyLoadingOnTransitionStart || (!s.params.lazyLoadingOnTransitionStart && !s.lazy.initialImageLoaded)) { + s.lazy.load(); + } + } + }, + onTransitionEnd: function () { + if (s.params.lazyLoading && !s.params.lazyLoadingOnTransitionStart) { + s.lazy.load(); + } + } + }; + + + /*========================= + Scrollbar + ===========================*/ + s.scrollbar = { + isTouched: false, + setDragPosition: function (e) { + var sb = s.scrollbar; + var x = 0, y = 0; + var translate; + var pointerPosition = s.isHorizontal() ? + ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].pageX : e.pageX || e.clientX) : + ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].pageY : e.pageY || e.clientY) ; + var position = (pointerPosition) - sb.track.offset()[s.isHorizontal() ? 'left' : 'top'] - sb.dragSize / 2; + var positionMin = -s.minTranslate() * sb.moveDivider; + var positionMax = -s.maxTranslate() * sb.moveDivider; + if (position < positionMin) { + position = positionMin; + } + else if (position > positionMax) { + position = positionMax; + } + position = -position / sb.moveDivider; + s.updateProgress(position); + s.setWrapperTranslate(position, true); + }, + dragStart: function (e) { + var sb = s.scrollbar; + sb.isTouched = true; + e.preventDefault(); + e.stopPropagation(); + + sb.setDragPosition(e); + clearTimeout(sb.dragTimeout); + + sb.track.transition(0); + if (s.params.scrollbarHide) { + sb.track.css('opacity', 1); + } + s.wrapper.transition(100); + sb.drag.transition(100); + s.emit('onScrollbarDragStart', s); + }, + dragMove: function (e) { + var sb = s.scrollbar; + if (!sb.isTouched) return; + if (e.preventDefault) e.preventDefault(); + else e.returnValue = false; + sb.setDragPosition(e); + s.wrapper.transition(0); + sb.track.transition(0); + sb.drag.transition(0); + s.emit('onScrollbarDragMove', s); + }, + dragEnd: function (e) { + var sb = s.scrollbar; + if (!sb.isTouched) return; + sb.isTouched = false; + if (s.params.scrollbarHide) { + clearTimeout(sb.dragTimeout); + sb.dragTimeout = setTimeout(function () { + sb.track.css('opacity', 0); + sb.track.transition(400); + }, 1000); + + } + s.emit('onScrollbarDragEnd', s); + if (s.params.scrollbarSnapOnRelease) { + s.slideReset(); + } + }, + draggableEvents: (function () { + if ((s.params.simulateTouch === false && !s.support.touch)) return s.touchEventsDesktop; + else return s.touchEvents; + })(), + enableDraggable: function () { + var sb = s.scrollbar; + var target = s.support.touch ? sb.track : document; + $(sb.track).on(sb.draggableEvents.start, sb.dragStart); + $(target).on(sb.draggableEvents.move, sb.dragMove); + $(target).on(sb.draggableEvents.end, sb.dragEnd); + }, + disableDraggable: function () { + var sb = s.scrollbar; + var target = s.support.touch ? sb.track : document; + $(sb.track).off(sb.draggableEvents.start, sb.dragStart); + $(target).off(sb.draggableEvents.move, sb.dragMove); + $(target).off(sb.draggableEvents.end, sb.dragEnd); + }, + set: function () { + if (!s.params.scrollbar) return; + var sb = s.scrollbar; + sb.track = $(s.params.scrollbar); + if (s.params.uniqueNavElements && typeof s.params.scrollbar === 'string' && sb.track.length > 1 && s.container.find(s.params.scrollbar).length === 1) { + sb.track = s.container.find(s.params.scrollbar); + } + sb.drag = sb.track.find('.swiper-scrollbar-drag'); + if (sb.drag.length === 0) { + sb.drag = $('
'); + sb.track.append(sb.drag); + } + sb.drag[0].style.width = ''; + sb.drag[0].style.height = ''; + sb.trackSize = s.isHorizontal() ? sb.track[0].offsetWidth : sb.track[0].offsetHeight; + + sb.divider = s.size / s.virtualSize; + sb.moveDivider = sb.divider * (sb.trackSize / s.size); + sb.dragSize = sb.trackSize * sb.divider; + + if (s.isHorizontal()) { + sb.drag[0].style.width = sb.dragSize + 'px'; + } + else { + sb.drag[0].style.height = sb.dragSize + 'px'; + } + + if (sb.divider >= 1) { + sb.track[0].style.display = 'none'; + } + else { + sb.track[0].style.display = ''; + } + if (s.params.scrollbarHide) { + sb.track[0].style.opacity = 0; + } + }, + setTranslate: function () { + if (!s.params.scrollbar) return; + var diff; + var sb = s.scrollbar; + var translate = s.translate || 0; + var newPos; + + var newSize = sb.dragSize; + newPos = (sb.trackSize - sb.dragSize) * s.progress; + if (s.rtl && s.isHorizontal()) { + newPos = -newPos; + if (newPos > 0) { + newSize = sb.dragSize - newPos; + newPos = 0; + } + else if (-newPos + sb.dragSize > sb.trackSize) { + newSize = sb.trackSize + newPos; + } + } + else { + if (newPos < 0) { + newSize = sb.dragSize + newPos; + newPos = 0; + } + else if (newPos + sb.dragSize > sb.trackSize) { + newSize = sb.trackSize - newPos; + } + } + if (s.isHorizontal()) { + if (s.support.transforms3d) { + sb.drag.transform('translate3d(' + (newPos) + 'px, 0, 0)'); + } + else { + sb.drag.transform('translateX(' + (newPos) + 'px)'); + } + sb.drag[0].style.width = newSize + 'px'; + } + else { + if (s.support.transforms3d) { + sb.drag.transform('translate3d(0px, ' + (newPos) + 'px, 0)'); + } + else { + sb.drag.transform('translateY(' + (newPos) + 'px)'); + } + sb.drag[0].style.height = newSize + 'px'; + } + if (s.params.scrollbarHide) { + clearTimeout(sb.timeout); + sb.track[0].style.opacity = 1; + sb.timeout = setTimeout(function () { + sb.track[0].style.opacity = 0; + sb.track.transition(400); + }, 1000); + } + }, + setTransition: function (duration) { + if (!s.params.scrollbar) return; + s.scrollbar.drag.transition(duration); + } + }; + + + /*========================= + Controller + ===========================*/ + s.controller = { + LinearSpline: function (x, y) { + var binarySearch = (function() { + var maxIndex, minIndex, guess; + return function(array, val) { + minIndex = -1; + maxIndex = array.length; + while (maxIndex - minIndex > 1) + if (array[guess = maxIndex + minIndex >> 1] <= val) { + minIndex = guess; + } else { + maxIndex = guess; + } + return maxIndex; + }; + })(); + this.x = x; + this.y = y; + this.lastIndex = x.length - 1; + // Given an x value (x2), return the expected y2 value: + // (x1,y1) is the known point before given value, + // (x3,y3) is the known point after given value. + var i1, i3; + var l = this.x.length; + + this.interpolate = function (x2) { + if (!x2) return 0; + + // Get the indexes of x1 and x3 (the array indexes before and after given x2): + i3 = binarySearch(this.x, x2); + i1 = i3 - 1; + + // We have our indexes i1 & i3, so we can calculate already: + // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1 + return ((x2 - this.x[i1]) * (this.y[i3] - this.y[i1])) / (this.x[i3] - this.x[i1]) + this.y[i1]; + }; + }, + //xxx: for now i will just save one spline function to to + getInterpolateFunction: function(c){ + if(!s.controller.spline) s.controller.spline = s.params.loop ? + new s.controller.LinearSpline(s.slidesGrid, c.slidesGrid) : + new s.controller.LinearSpline(s.snapGrid, c.snapGrid); + }, + setTranslate: function (translate, byController) { + var controlled = s.params.control; + var multiplier, controlledTranslate; + function setControlledTranslate(c) { + // this will create an Interpolate function based on the snapGrids + // x is the Grid of the scrolled scroller and y will be the controlled scroller + // it makes sense to create this only once and recall it for the interpolation + // the function does a lot of value caching for performance + translate = c.rtl && c.params.direction === 'horizontal' ? -s.translate : s.translate; + if (s.params.controlBy === 'slide') { + s.controller.getInterpolateFunction(c); + // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid + // but it did not work out + controlledTranslate = -s.controller.spline.interpolate(-translate); + } + + if(!controlledTranslate || s.params.controlBy === 'container'){ + multiplier = (c.maxTranslate() - c.minTranslate()) / (s.maxTranslate() - s.minTranslate()); + controlledTranslate = (translate - s.minTranslate()) * multiplier + c.minTranslate(); + } + + if (s.params.controlInverse) { + controlledTranslate = c.maxTranslate() - controlledTranslate; + } + c.updateProgress(controlledTranslate); + c.setWrapperTranslate(controlledTranslate, false, s); + c.updateActiveIndex(); + } + if (Array.isArray(controlled)) { + for (var i = 0; i < controlled.length; i++) { + if (controlled[i] !== byController && controlled[i] instanceof Swiper) { + setControlledTranslate(controlled[i]); + } + } + } + else if (controlled instanceof Swiper && byController !== controlled) { + + setControlledTranslate(controlled); + } + }, + setTransition: function (duration, byController) { + var controlled = s.params.control; + var i; + function setControlledTransition(c) { + c.setWrapperTransition(duration, s); + if (duration !== 0) { + c.onTransitionStart(); + c.wrapper.transitionEnd(function(){ + if (!controlled) return; + if (c.params.loop && s.params.controlBy === 'slide') { + c.fixLoop(); + } + c.onTransitionEnd(); + + }); + } + } + if (Array.isArray(controlled)) { + for (i = 0; i < controlled.length; i++) { + if (controlled[i] !== byController && controlled[i] instanceof Swiper) { + setControlledTransition(controlled[i]); + } + } + } + else if (controlled instanceof Swiper && byController !== controlled) { + setControlledTransition(controlled); + } + } + }; + + + /*========================= + Hash Navigation + ===========================*/ + s.hashnav = { + onHashCange: function (e, a) { + var newHash = document.location.hash.replace('#', ''); + var activeSlideHash = s.slides.eq(s.activeIndex).attr('data-hash'); + if (newHash !== activeSlideHash) { + s.slideTo(s.wrapper.children('.' + s.params.slideClass + '[data-hash="' + (newHash) + '"]').index()); + } + }, + attachEvents: function (detach) { + var action = detach ? 'off' : 'on'; + $(window)[action]('hashchange', s.hashnav.onHashCange); + }, + setHash: function () { + if (!s.hashnav.initialized || !s.params.hashnav) return; + if (s.params.replaceState && window.history && window.history.replaceState) { + window.history.replaceState(null, null, ('#' + s.slides.eq(s.activeIndex).attr('data-hash') || '')); + } else { + var slide = s.slides.eq(s.activeIndex); + var hash = slide.attr('data-hash') || slide.attr('data-history'); + document.location.hash = hash || ''; + } + }, + init: function () { + if (!s.params.hashnav || s.params.history) return; + s.hashnav.initialized = true; + var hash = document.location.hash.replace('#', ''); + if (hash) { + var speed = 0; + for (var i = 0, length = s.slides.length; i < length; i++) { + var slide = s.slides.eq(i); + var slideHash = slide.attr('data-hash') || slide.attr('data-history'); + if (slideHash === hash && !slide.hasClass(s.params.slideDuplicateClass)) { + var index = slide.index(); + s.slideTo(index, speed, s.params.runCallbacksOnInit, true); + } + } + } + if (s.params.hashnavWatchState) s.hashnav.attachEvents(); + }, + destroy: function () { + if (s.params.hashnavWatchState) s.hashnav.attachEvents(true); + } + }; + + + /*========================= + History Api with fallback to Hashnav + ===========================*/ + s.history = { + init: function () { + if (!s.params.history) return; + if (!window.history || !window.history.pushState) { + s.params.history = false; + s.params.hashnav = true; + return; + } + s.history.initialized = true; + this.paths = this.getPathValues(); + if (!this.paths.key && !this.paths.value) return; + this.scrollToSlide(0, this.paths.value, s.params.runCallbacksOnInit); + if (!s.params.replaceState) { + window.addEventListener('popstate', this.setHistoryPopState); + } + }, + setHistoryPopState: function() { + s.history.paths = s.history.getPathValues(); + s.history.scrollToSlide(s.params.speed, s.history.paths.value, false); + }, + getPathValues: function() { + var pathArray = window.location.pathname.slice(1).split('/'); + var total = pathArray.length; + var key = pathArray[total - 2]; + var value = pathArray[total - 1]; + return { key: key, value: value }; + }, + setHistory: function (key, index) { + if (!s.history.initialized || !s.params.history) return; + var slide = s.slides.eq(index); + var value = this.slugify(slide.attr('data-history')); + if (!window.location.pathname.includes(key)) { + value = key + '/' + value; + } + if (s.params.replaceState) { + window.history.replaceState(null, null, value); + } else { + window.history.pushState(null, null, value); + } + }, + slugify: function(text) { + return text.toString().toLowerCase() + .replace(/\s+/g, '-') + .replace(/[^\w\-]+/g, '') + .replace(/\-\-+/g, '-') + .replace(/^-+/, '') + .replace(/-+$/, ''); + }, + scrollToSlide: function(speed, value, runCallbacks) { + if (value) { + for (var i = 0, length = s.slides.length; i < length; i++) { + var slide = s.slides.eq(i); + var slideHistory = this.slugify(slide.attr('data-history')); + if (slideHistory === value && !slide.hasClass(s.params.slideDuplicateClass)) { + var index = slide.index(); + s.slideTo(index, speed, runCallbacks); + } + } + } else { + s.slideTo(0, speed, runCallbacks); + } + } + }; + + + /*========================= + Keyboard Control + ===========================*/ + function handleKeyboard(e) { + if (e.originalEvent) e = e.originalEvent; //jquery fix + var kc = e.keyCode || e.charCode; + // Directions locks + if (!s.params.allowSwipeToNext && (s.isHorizontal() && kc === 39 || !s.isHorizontal() && kc === 40)) { + return false; + } + if (!s.params.allowSwipeToPrev && (s.isHorizontal() && kc === 37 || !s.isHorizontal() && kc === 38)) { + return false; + } + if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) { + return; + } + if (document.activeElement && document.activeElement.nodeName && (document.activeElement.nodeName.toLowerCase() === 'input' || document.activeElement.nodeName.toLowerCase() === 'textarea')) { + return; + } + if (kc === 37 || kc === 39 || kc === 38 || kc === 40) { + var inView = false; + //Check that swiper should be inside of visible area of window + if (s.container.parents('.' + s.params.slideClass).length > 0 && s.container.parents('.' + s.params.slideActiveClass).length === 0) { + return; + } + var windowScroll = { + left: window.pageXOffset, + top: window.pageYOffset + }; + var windowWidth = window.innerWidth; + var windowHeight = window.innerHeight; + var swiperOffset = s.container.offset(); + if (s.rtl) swiperOffset.left = swiperOffset.left - s.container[0].scrollLeft; + var swiperCoord = [ + [swiperOffset.left, swiperOffset.top], + [swiperOffset.left + s.width, swiperOffset.top], + [swiperOffset.left, swiperOffset.top + s.height], + [swiperOffset.left + s.width, swiperOffset.top + s.height] + ]; + for (var i = 0; i < swiperCoord.length; i++) { + var point = swiperCoord[i]; + if ( + point[0] >= windowScroll.left && point[0] <= windowScroll.left + windowWidth && + point[1] >= windowScroll.top && point[1] <= windowScroll.top + windowHeight + ) { + inView = true; + } + + } + if (!inView) return; + } + if (s.isHorizontal()) { + if (kc === 37 || kc === 39) { + if (e.preventDefault) e.preventDefault(); + else e.returnValue = false; + } + if ((kc === 39 && !s.rtl) || (kc === 37 && s.rtl)) s.slideNext(); + if ((kc === 37 && !s.rtl) || (kc === 39 && s.rtl)) s.slidePrev(); + } + else { + if (kc === 38 || kc === 40) { + if (e.preventDefault) e.preventDefault(); + else e.returnValue = false; + } + if (kc === 40) s.slideNext(); + if (kc === 38) s.slidePrev(); + } + s.emit('onKeyPress', s, kc); + } + s.disableKeyboardControl = function () { + s.params.keyboardControl = false; + $(document).off('keydown', handleKeyboard); + }; + s.enableKeyboardControl = function () { + s.params.keyboardControl = true; + $(document).on('keydown', handleKeyboard); + }; + + + /*========================= + Mousewheel Control + ===========================*/ + s.mousewheel = { + event: false, + lastScrollTime: (new window.Date()).getTime() + }; + function isEventSupported() { + var eventName = 'onwheel'; + var isSupported = eventName in document; + + if (!isSupported) { + var element = document.createElement('div'); + element.setAttribute(eventName, 'return;'); + isSupported = typeof element[eventName] === 'function'; + } + + if (!isSupported && + document.implementation && + document.implementation.hasFeature && + // always returns true in newer browsers as per the standard. + // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature + document.implementation.hasFeature('', '') !== true ) { + // This is the only way to test support for the `wheel` event in IE9+. + isSupported = document.implementation.hasFeature('Events.wheel', '3.0'); + } + + return isSupported; + } + /** + * Mouse wheel (and 2-finger trackpad) support on the web sucks. It is + * complicated, thus this doc is long and (hopefully) detailed enough to answer + * your questions. + * + * If you need to react to the mouse wheel in a predictable way, this code is + * like your bestest friend. * hugs * + * + * As of today, there are 4 DOM event types you can listen to: + * + * 'wheel' -- Chrome(31+), FF(17+), IE(9+) + * 'mousewheel' -- Chrome, IE(6+), Opera, Safari + * 'MozMousePixelScroll' -- FF(3.5 only!) (2010-2013) -- don't bother! + * 'DOMMouseScroll' -- FF(0.9.7+) since 2003 + * + * So what to do? The is the best: + * + * normalizeWheel.getEventType(); + * + * In your event callback, use this code to get sane interpretation of the + * deltas. This code will return an object with properties: + * + * spinX -- normalized spin speed (use for zoom) - x plane + * spinY -- " - y plane + * pixelX -- normalized distance (to pixels) - x plane + * pixelY -- " - y plane + * + * Wheel values are provided by the browser assuming you are using the wheel to + * scroll a web page by a number of lines or pixels (or pages). Values can vary + * significantly on different platforms and browsers, forgetting that you can + * scroll at different speeds. Some devices (like trackpads) emit more events + * at smaller increments with fine granularity, and some emit massive jumps with + * linear speed or acceleration. + * + * This code does its best to normalize the deltas for you: + * + * - spin is trying to normalize how far the wheel was spun (or trackpad + * dragged). This is super useful for zoom support where you want to + * throw away the chunky scroll steps on the PC and make those equal to + * the slow and smooth tiny steps on the Mac. Key data: This code tries to + * resolve a single slow step on a wheel to 1. + * + * - pixel is normalizing the desired scroll delta in pixel units. You'll + * get the crazy differences between browsers, but at least it'll be in + * pixels! + * + * - positive value indicates scrolling DOWN/RIGHT, negative UP/LEFT. This + * should translate to positive value zooming IN, negative zooming OUT. + * This matches the newer 'wheel' event. + * + * Why are there spinX, spinY (or pixels)? + * + * - spinX is a 2-finger side drag on the trackpad, and a shift + wheel turn + * with a mouse. It results in side-scrolling in the browser by default. + * + * - spinY is what you expect -- it's the classic axis of a mouse wheel. + * + * - I dropped spinZ/pixelZ. It is supported by the DOM 3 'wheel' event and + * probably is by browsers in conjunction with fancy 3D controllers .. but + * you know. + * + * Implementation info: + * + * Examples of 'wheel' event if you scroll slowly (down) by one step with an + * average mouse: + * + * OS X + Chrome (mouse) - 4 pixel delta (wheelDelta -120) + * OS X + Safari (mouse) - N/A pixel delta (wheelDelta -12) + * OS X + Firefox (mouse) - 0.1 line delta (wheelDelta N/A) + * Win8 + Chrome (mouse) - 100 pixel delta (wheelDelta -120) + * Win8 + Firefox (mouse) - 3 line delta (wheelDelta -120) + * + * On the trackpad: + * + * OS X + Chrome (trackpad) - 2 pixel delta (wheelDelta -6) + * OS X + Firefox (trackpad) - 1 pixel delta (wheelDelta N/A) + * + * On other/older browsers.. it's more complicated as there can be multiple and + * also missing delta values. + * + * The 'wheel' event is more standard: + * + * http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents + * + * The basics is that it includes a unit, deltaMode (pixels, lines, pages), and + * deltaX, deltaY and deltaZ. Some browsers provide other values to maintain + * backward compatibility with older events. Those other values help us + * better normalize spin speed. Example of what the browsers provide: + * + * | event.wheelDelta | event.detail + * ------------------+------------------+-------------- + * Safari v5/OS X | -120 | 0 + * Safari v5/Win7 | -120 | 0 + * Chrome v17/OS X | -120 | 0 + * Chrome v17/Win7 | -120 | 0 + * IE9/Win7 | -120 | undefined + * Firefox v4/OS X | undefined | 1 + * Firefox v4/Win7 | undefined | 3 + * + */ + function normalizeWheel( /*object*/ event ) /*object*/ { + // Reasonable defaults + var PIXEL_STEP = 10; + var LINE_HEIGHT = 40; + var PAGE_HEIGHT = 800; + + var sX = 0, sY = 0, // spinX, spinY + pX = 0, pY = 0; // pixelX, pixelY + + // Legacy + if( 'detail' in event ) { + sY = event.detail; + } + if( 'wheelDelta' in event ) { + sY = -event.wheelDelta / 120; + } + if( 'wheelDeltaY' in event ) { + sY = -event.wheelDeltaY / 120; + } + if( 'wheelDeltaX' in event ) { + sX = -event.wheelDeltaX / 120; + } + + // side scrolling on FF with DOMMouseScroll + if( 'axis' in event && event.axis === event.HORIZONTAL_AXIS ) { + sX = sY; + sY = 0; + } + + pX = sX * PIXEL_STEP; + pY = sY * PIXEL_STEP; + + if( 'deltaY' in event ) { + pY = event.deltaY; + } + if( 'deltaX' in event ) { + pX = event.deltaX; + } + + if( (pX || pY) && event.deltaMode ) { + if( event.deltaMode === 1 ) { // delta in LINE units + pX *= LINE_HEIGHT; + pY *= LINE_HEIGHT; + } else { // delta in PAGE units + pX *= PAGE_HEIGHT; + pY *= PAGE_HEIGHT; + } + } + + // Fall-back if spin cannot be determined + if( pX && !sX ) { + sX = (pX < 1) ? -1 : 1; + } + if( pY && !sY ) { + sY = (pY < 1) ? -1 : 1; + } + + return { + spinX: sX, + spinY: sY, + pixelX: pX, + pixelY: pY + }; + } + if (s.params.mousewheelControl) { + /** + * The best combination if you prefer spinX + spinY normalization. It favors + * the older DOMMouseScroll for Firefox, as FF does not include wheelDelta with + * 'wheel' event, making spin speed determination impossible. + */ + s.mousewheel.event = (navigator.userAgent.indexOf('firefox') > -1) ? + 'DOMMouseScroll' : + isEventSupported() ? + 'wheel' : 'mousewheel'; + } + function handleMousewheel(e) { + if (e.originalEvent) e = e.originalEvent; //jquery fix + var delta = 0; + var rtlFactor = s.rtl ? -1 : 1; + + var data = normalizeWheel( e ); + + if (s.params.mousewheelForceToAxis) { + if (s.isHorizontal()) { + if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) delta = data.pixelX * rtlFactor; + else return; + } + else { + if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) delta = data.pixelY; + else return; + } + } + else { + delta = Math.abs(data.pixelX) > Math.abs(data.pixelY) ? - data.pixelX * rtlFactor : - data.pixelY; + } + + if (delta === 0) return; + + if (s.params.mousewheelInvert) delta = -delta; + + if (!s.params.freeMode) { + if ((new window.Date()).getTime() - s.mousewheel.lastScrollTime > 60) { + if (delta < 0) { + if ((!s.isEnd || s.params.loop) && !s.animating) { + s.slideNext(); + s.emit('onScroll', s, e); + } + else if (s.params.mousewheelReleaseOnEdges) return true; + } + else { + if ((!s.isBeginning || s.params.loop) && !s.animating) { + s.slidePrev(); + s.emit('onScroll', s, e); + } + else if (s.params.mousewheelReleaseOnEdges) return true; + } + } + s.mousewheel.lastScrollTime = (new window.Date()).getTime(); + + } + else { + //Freemode or scrollContainer: + var position = s.getWrapperTranslate() + delta * s.params.mousewheelSensitivity; + var wasBeginning = s.isBeginning, + wasEnd = s.isEnd; + + if (position >= s.minTranslate()) position = s.minTranslate(); + if (position <= s.maxTranslate()) position = s.maxTranslate(); + + s.setWrapperTransition(0); + s.setWrapperTranslate(position); + s.updateProgress(); + s.updateActiveIndex(); + + if (!wasBeginning && s.isBeginning || !wasEnd && s.isEnd) { + s.updateClasses(); + } + + if (s.params.freeModeSticky) { + clearTimeout(s.mousewheel.timeout); + s.mousewheel.timeout = setTimeout(function () { + s.slideReset(); + }, 300); + } + else { + if (s.params.lazyLoading && s.lazy) { + s.lazy.load(); + } + } + // Emit event + s.emit('onScroll', s, e); + + // Stop autoplay + if (s.params.autoplay && s.params.autoplayDisableOnInteraction) s.stopAutoplay(); + + // Return page scroll on edge positions + if (position === 0 || position === s.maxTranslate()) return; + } + + if (e.preventDefault) e.preventDefault(); + else e.returnValue = false; + return false; + } + s.disableMousewheelControl = function () { + if (!s.mousewheel.event) return false; + var target = s.container; + if (s.params.mousewheelEventsTarged !== 'container') { + target = $(s.params.mousewheelEventsTarged); + } + target.off(s.mousewheel.event, handleMousewheel); + s.params.mousewheelControl = false; + return true; + }; + + s.enableMousewheelControl = function () { + if (!s.mousewheel.event) return false; + var target = s.container; + if (s.params.mousewheelEventsTarged !== 'container') { + target = $(s.params.mousewheelEventsTarged); + } + target.on(s.mousewheel.event, handleMousewheel); + s.params.mousewheelControl = true; + return true; + }; + + + /*========================= + Parallax + ===========================*/ + function setParallaxTransform(el, progress) { + el = $(el); + var p, pX, pY; + var rtlFactor = s.rtl ? -1 : 1; + + p = el.attr('data-swiper-parallax') || '0'; + pX = el.attr('data-swiper-parallax-x'); + pY = el.attr('data-swiper-parallax-y'); + if (pX || pY) { + pX = pX || '0'; + pY = pY || '0'; + } + else { + if (s.isHorizontal()) { + pX = p; + pY = '0'; + } + else { + pY = p; + pX = '0'; + } + } + + if ((pX).indexOf('%') >= 0) { + pX = parseInt(pX, 10) * progress * rtlFactor + '%'; + } + else { + pX = pX * progress * rtlFactor + 'px' ; + } + if ((pY).indexOf('%') >= 0) { + pY = parseInt(pY, 10) * progress + '%'; + } + else { + pY = pY * progress + 'px' ; + } + + el.transform('translate3d(' + pX + ', ' + pY + ',0px)'); + } + s.parallax = { + setTranslate: function () { + s.container.children('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]').each(function(){ + setParallaxTransform(this, s.progress); + + }); + s.slides.each(function () { + var slide = $(this); + slide.find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]').each(function () { + var progress = Math.min(Math.max(slide[0].progress, -1), 1); + setParallaxTransform(this, progress); + }); + }); + }, + setTransition: function (duration) { + if (typeof duration === 'undefined') duration = s.params.speed; + s.container.find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]').each(function(){ + var el = $(this); + var parallaxDuration = parseInt(el.attr('data-swiper-parallax-duration'), 10) || duration; + if (duration === 0) parallaxDuration = 0; + el.transition(parallaxDuration); + }); + } + }; + + + /*========================= + Zoom + ===========================*/ + s.zoom = { + // "Global" Props + scale: 1, + currentScale: 1, + isScaling: false, + gesture: { + slide: undefined, + slideWidth: undefined, + slideHeight: undefined, + image: undefined, + imageWrap: undefined, + zoomMax: s.params.zoomMax + }, + image: { + isTouched: undefined, + isMoved: undefined, + currentX: undefined, + currentY: undefined, + minX: undefined, + minY: undefined, + maxX: undefined, + maxY: undefined, + width: undefined, + height: undefined, + startX: undefined, + startY: undefined, + touchesStart: {}, + touchesCurrent: {} + }, + velocity: { + x: undefined, + y: undefined, + prevPositionX: undefined, + prevPositionY: undefined, + prevTime: undefined + }, + // Calc Scale From Multi-touches + getDistanceBetweenTouches: function (e) { + if (e.targetTouches.length < 2) return 1; + var x1 = e.targetTouches[0].pageX, + y1 = e.targetTouches[0].pageY, + x2 = e.targetTouches[1].pageX, + y2 = e.targetTouches[1].pageY; + var distance = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)); + return distance; + }, + // Events + onGestureStart: function (e) { + var z = s.zoom; + if (!s.support.gestures) { + if (e.type !== 'touchstart' || e.type === 'touchstart' && e.targetTouches.length < 2) { + return; + } + z.gesture.scaleStart = z.getDistanceBetweenTouches(e); + } + if (!z.gesture.slide || !z.gesture.slide.length) { + z.gesture.slide = $(this); + if (z.gesture.slide.length === 0) z.gesture.slide = s.slides.eq(s.activeIndex); + z.gesture.image = z.gesture.slide.find('img, svg, canvas'); + z.gesture.imageWrap = z.gesture.image.parent('.' + s.params.zoomContainerClass); + z.gesture.zoomMax = z.gesture.imageWrap.attr('data-swiper-zoom') || s.params.zoomMax ; + if (z.gesture.imageWrap.length === 0) { + z.gesture.image = undefined; + return; + } + } + z.gesture.image.transition(0); + z.isScaling = true; + }, + onGestureChange: function (e) { + var z = s.zoom; + if (!s.support.gestures) { + if (e.type !== 'touchmove' || e.type === 'touchmove' && e.targetTouches.length < 2) { + return; + } + z.gesture.scaleMove = z.getDistanceBetweenTouches(e); + } + if (!z.gesture.image || z.gesture.image.length === 0) return; + if (s.support.gestures) { + z.scale = e.scale * z.currentScale; + } + else { + z.scale = (z.gesture.scaleMove / z.gesture.scaleStart) * z.currentScale; + } + if (z.scale > z.gesture.zoomMax) { + z.scale = z.gesture.zoomMax - 1 + Math.pow((z.scale - z.gesture.zoomMax + 1), 0.5); + } + if (z.scale < s.params.zoomMin) { + z.scale = s.params.zoomMin + 1 - Math.pow((s.params.zoomMin - z.scale + 1), 0.5); + } + z.gesture.image.transform('translate3d(0,0,0) scale(' + z.scale + ')'); + }, + onGestureEnd: function (e) { + var z = s.zoom; + if (!s.support.gestures) { + if (e.type !== 'touchend' || e.type === 'touchend' && e.changedTouches.length < 2) { + return; + } + } + if (!z.gesture.image || z.gesture.image.length === 0) return; + z.scale = Math.max(Math.min(z.scale, z.gesture.zoomMax), s.params.zoomMin); + z.gesture.image.transition(s.params.speed).transform('translate3d(0,0,0) scale(' + z.scale + ')'); + z.currentScale = z.scale; + z.isScaling = false; + if (z.scale === 1) z.gesture.slide = undefined; + }, + onTouchStart: function (s, e) { + var z = s.zoom; + if (!z.gesture.image || z.gesture.image.length === 0) return; + if (z.image.isTouched) return; + if (s.device.os === 'android') e.preventDefault(); + z.image.isTouched = true; + z.image.touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX; + z.image.touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY; + }, + onTouchMove: function (e) { + var z = s.zoom; + if (!z.gesture.image || z.gesture.image.length === 0) return; + s.allowClick = false; + if (!z.image.isTouched || !z.gesture.slide) return; + + if (!z.image.isMoved) { + z.image.width = z.gesture.image[0].offsetWidth; + z.image.height = z.gesture.image[0].offsetHeight; + z.image.startX = s.getTranslate(z.gesture.imageWrap[0], 'x') || 0; + z.image.startY = s.getTranslate(z.gesture.imageWrap[0], 'y') || 0; + z.gesture.slideWidth = z.gesture.slide[0].offsetWidth; + z.gesture.slideHeight = z.gesture.slide[0].offsetHeight; + z.gesture.imageWrap.transition(0); + if (s.rtl) z.image.startX = -z.image.startX; + if (s.rtl) z.image.startY = -z.image.startY; + } + // Define if we need image drag + var scaledWidth = z.image.width * z.scale; + var scaledHeight = z.image.height * z.scale; + + if (scaledWidth < z.gesture.slideWidth && scaledHeight < z.gesture.slideHeight) return; + + z.image.minX = Math.min((z.gesture.slideWidth / 2 - scaledWidth / 2), 0); + z.image.maxX = -z.image.minX; + z.image.minY = Math.min((z.gesture.slideHeight / 2 - scaledHeight / 2), 0); + z.image.maxY = -z.image.minY; + + z.image.touchesCurrent.x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX; + z.image.touchesCurrent.y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY; + + if (!z.image.isMoved && !z.isScaling) { + if (s.isHorizontal() && + (Math.floor(z.image.minX) === Math.floor(z.image.startX) && z.image.touchesCurrent.x < z.image.touchesStart.x) || + (Math.floor(z.image.maxX) === Math.floor(z.image.startX) && z.image.touchesCurrent.x > z.image.touchesStart.x) + ) { + z.image.isTouched = false; + return; + } + else if (!s.isHorizontal() && + (Math.floor(z.image.minY) === Math.floor(z.image.startY) && z.image.touchesCurrent.y < z.image.touchesStart.y) || + (Math.floor(z.image.maxY) === Math.floor(z.image.startY) && z.image.touchesCurrent.y > z.image.touchesStart.y) + ) { + z.image.isTouched = false; + return; + } + } + e.preventDefault(); + e.stopPropagation(); + + z.image.isMoved = true; + z.image.currentX = z.image.touchesCurrent.x - z.image.touchesStart.x + z.image.startX; + z.image.currentY = z.image.touchesCurrent.y - z.image.touchesStart.y + z.image.startY; + + if (z.image.currentX < z.image.minX) { + z.image.currentX = z.image.minX + 1 - Math.pow((z.image.minX - z.image.currentX + 1), 0.8); + } + if (z.image.currentX > z.image.maxX) { + z.image.currentX = z.image.maxX - 1 + Math.pow((z.image.currentX - z.image.maxX + 1), 0.8); + } + + if (z.image.currentY < z.image.minY) { + z.image.currentY = z.image.minY + 1 - Math.pow((z.image.minY - z.image.currentY + 1), 0.8); + } + if (z.image.currentY > z.image.maxY) { + z.image.currentY = z.image.maxY - 1 + Math.pow((z.image.currentY - z.image.maxY + 1), 0.8); + } + + //Velocity + if (!z.velocity.prevPositionX) z.velocity.prevPositionX = z.image.touchesCurrent.x; + if (!z.velocity.prevPositionY) z.velocity.prevPositionY = z.image.touchesCurrent.y; + if (!z.velocity.prevTime) z.velocity.prevTime = Date.now(); + z.velocity.x = (z.image.touchesCurrent.x - z.velocity.prevPositionX) / (Date.now() - z.velocity.prevTime) / 2; + z.velocity.y = (z.image.touchesCurrent.y - z.velocity.prevPositionY) / (Date.now() - z.velocity.prevTime) / 2; + if (Math.abs(z.image.touchesCurrent.x - z.velocity.prevPositionX) < 2) z.velocity.x = 0; + if (Math.abs(z.image.touchesCurrent.y - z.velocity.prevPositionY) < 2) z.velocity.y = 0; + z.velocity.prevPositionX = z.image.touchesCurrent.x; + z.velocity.prevPositionY = z.image.touchesCurrent.y; + z.velocity.prevTime = Date.now(); + + z.gesture.imageWrap.transform('translate3d(' + z.image.currentX + 'px, ' + z.image.currentY + 'px,0)'); + }, + onTouchEnd: function (s, e) { + var z = s.zoom; + if (!z.gesture.image || z.gesture.image.length === 0) return; + if (!z.image.isTouched || !z.image.isMoved) { + z.image.isTouched = false; + z.image.isMoved = false; + return; + } + z.image.isTouched = false; + z.image.isMoved = false; + var momentumDurationX = 300; + var momentumDurationY = 300; + var momentumDistanceX = z.velocity.x * momentumDurationX; + var newPositionX = z.image.currentX + momentumDistanceX; + var momentumDistanceY = z.velocity.y * momentumDurationY; + var newPositionY = z.image.currentY + momentumDistanceY; + + //Fix duration + if (z.velocity.x !== 0) momentumDurationX = Math.abs((newPositionX - z.image.currentX) / z.velocity.x); + if (z.velocity.y !== 0) momentumDurationY = Math.abs((newPositionY - z.image.currentY) / z.velocity.y); + var momentumDuration = Math.max(momentumDurationX, momentumDurationY); + + z.image.currentX = newPositionX; + z.image.currentY = newPositionY; + + // Define if we need image drag + var scaledWidth = z.image.width * z.scale; + var scaledHeight = z.image.height * z.scale; + z.image.minX = Math.min((z.gesture.slideWidth / 2 - scaledWidth / 2), 0); + z.image.maxX = -z.image.minX; + z.image.minY = Math.min((z.gesture.slideHeight / 2 - scaledHeight / 2), 0); + z.image.maxY = -z.image.minY; + z.image.currentX = Math.max(Math.min(z.image.currentX, z.image.maxX), z.image.minX); + z.image.currentY = Math.max(Math.min(z.image.currentY, z.image.maxY), z.image.minY); + + z.gesture.imageWrap.transition(momentumDuration).transform('translate3d(' + z.image.currentX + 'px, ' + z.image.currentY + 'px,0)'); + }, + onTransitionEnd: function (s) { + var z = s.zoom; + if (z.gesture.slide && s.previousIndex !== s.activeIndex) { + z.gesture.image.transform('translate3d(0,0,0) scale(1)'); + z.gesture.imageWrap.transform('translate3d(0,0,0)'); + z.gesture.slide = z.gesture.image = z.gesture.imageWrap = undefined; + z.scale = z.currentScale = 1; + } + }, + // Toggle Zoom + toggleZoom: function (s, e) { + var z = s.zoom; + if (!z.gesture.slide) { + z.gesture.slide = s.clickedSlide ? $(s.clickedSlide) : s.slides.eq(s.activeIndex); + z.gesture.image = z.gesture.slide.find('img, svg, canvas'); + z.gesture.imageWrap = z.gesture.image.parent('.' + s.params.zoomContainerClass); + } + if (!z.gesture.image || z.gesture.image.length === 0) return; + + var touchX, touchY, offsetX, offsetY, diffX, diffY, translateX, translateY, imageWidth, imageHeight, scaledWidth, scaledHeight, translateMinX, translateMinY, translateMaxX, translateMaxY, slideWidth, slideHeight; + + if (typeof z.image.touchesStart.x === 'undefined' && e) { + touchX = e.type === 'touchend' ? e.changedTouches[0].pageX : e.pageX; + touchY = e.type === 'touchend' ? e.changedTouches[0].pageY : e.pageY; + } + else { + touchX = z.image.touchesStart.x; + touchY = z.image.touchesStart.y; + } + + if (z.scale && z.scale !== 1) { + // Zoom Out + z.scale = z.currentScale = 1; + z.gesture.imageWrap.transition(300).transform('translate3d(0,0,0)'); + z.gesture.image.transition(300).transform('translate3d(0,0,0) scale(1)'); + z.gesture.slide = undefined; + } + else { + // Zoom In + z.scale = z.currentScale = z.gesture.imageWrap.attr('data-swiper-zoom') || s.params.zoomMax; + if (e) { + slideWidth = z.gesture.slide[0].offsetWidth; + slideHeight = z.gesture.slide[0].offsetHeight; + offsetX = z.gesture.slide.offset().left; + offsetY = z.gesture.slide.offset().top; + diffX = offsetX + slideWidth/2 - touchX; + diffY = offsetY + slideHeight/2 - touchY; + + imageWidth = z.gesture.image[0].offsetWidth; + imageHeight = z.gesture.image[0].offsetHeight; + scaledWidth = imageWidth * z.scale; + scaledHeight = imageHeight * z.scale; + + translateMinX = Math.min((slideWidth / 2 - scaledWidth / 2), 0); + translateMinY = Math.min((slideHeight / 2 - scaledHeight / 2), 0); + translateMaxX = -translateMinX; + translateMaxY = -translateMinY; + + translateX = diffX * z.scale; + translateY = diffY * z.scale; + + if (translateX < translateMinX) { + translateX = translateMinX; + } + if (translateX > translateMaxX) { + translateX = translateMaxX; + } + + if (translateY < translateMinY) { + translateY = translateMinY; + } + if (translateY > translateMaxY) { + translateY = translateMaxY; + } + } + else { + translateX = 0; + translateY = 0; + } + z.gesture.imageWrap.transition(300).transform('translate3d(' + translateX + 'px, ' + translateY + 'px,0)'); + z.gesture.image.transition(300).transform('translate3d(0,0,0) scale(' + z.scale + ')'); + } + }, + // Attach/Detach Events + attachEvents: function (detach) { + var action = detach ? 'off' : 'on'; + + if (s.params.zoom) { + var target = s.slides; + var passiveListener = s.touchEvents.start === 'touchstart' && s.support.passiveListener && s.params.passiveListeners ? {passive: true, capture: false} : false; + // Scale image + if (s.support.gestures) { + s.slides[action]('gesturestart', s.zoom.onGestureStart, passiveListener); + s.slides[action]('gesturechange', s.zoom.onGestureChange, passiveListener); + s.slides[action]('gestureend', s.zoom.onGestureEnd, passiveListener); + } + else if (s.touchEvents.start === 'touchstart') { + s.slides[action](s.touchEvents.start, s.zoom.onGestureStart, passiveListener); + s.slides[action](s.touchEvents.move, s.zoom.onGestureChange, passiveListener); + s.slides[action](s.touchEvents.end, s.zoom.onGestureEnd, passiveListener); + } + + // Move image + s[action]('touchStart', s.zoom.onTouchStart); + s.slides.each(function (index, slide){ + if ($(slide).find('.' + s.params.zoomContainerClass).length > 0) { + $(slide)[action](s.touchEvents.move, s.zoom.onTouchMove); + } + }); + s[action]('touchEnd', s.zoom.onTouchEnd); + + // Scale Out + s[action]('transitionEnd', s.zoom.onTransitionEnd); + if (s.params.zoomToggle) { + s.on('doubleTap', s.zoom.toggleZoom); + } + } + }, + init: function () { + s.zoom.attachEvents(); + }, + destroy: function () { + s.zoom.attachEvents(true); + } + }; + + + /*========================= + Plugins API. Collect all and init all plugins + ===========================*/ + s._plugins = []; + for (var plugin in s.plugins) { + var p = s.plugins[plugin](s, s.params[plugin]); + if (p) s._plugins.push(p); + } + // Method to call all plugins event/method + s.callPlugins = function (eventName) { + for (var i = 0; i < s._plugins.length; i++) { + if (eventName in s._plugins[i]) { + s._plugins[i][eventName](arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]); + } + } + }; + + + /*========================= + Events/Callbacks/Plugins Emitter + ===========================*/ + function normalizeEventName (eventName) { + if (eventName.indexOf('on') !== 0) { + if (eventName[0] !== eventName[0].toUpperCase()) { + eventName = 'on' + eventName[0].toUpperCase() + eventName.substring(1); + } + else { + eventName = 'on' + eventName; + } + } + return eventName; + } + s.emitterEventListeners = { + + }; + s.emit = function (eventName) { + // Trigger callbacks + if (s.params[eventName]) { + s.params[eventName](arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]); + } + var i; + // Trigger events + if (s.emitterEventListeners[eventName]) { + for (i = 0; i < s.emitterEventListeners[eventName].length; i++) { + s.emitterEventListeners[eventName][i](arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]); + } + } + // Trigger plugins + if (s.callPlugins) s.callPlugins(eventName, arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]); + }; + s.on = function (eventName, handler) { + eventName = normalizeEventName(eventName); + if (!s.emitterEventListeners[eventName]) s.emitterEventListeners[eventName] = []; + s.emitterEventListeners[eventName].push(handler); + return s; + }; + s.off = function (eventName, handler) { + var i; + eventName = normalizeEventName(eventName); + if (typeof handler === 'undefined') { + // Remove all handlers for such event + s.emitterEventListeners[eventName] = []; + return s; + } + if (!s.emitterEventListeners[eventName] || s.emitterEventListeners[eventName].length === 0) return; + for (i = 0; i < s.emitterEventListeners[eventName].length; i++) { + if(s.emitterEventListeners[eventName][i] === handler) s.emitterEventListeners[eventName].splice(i, 1); + } + return s; + }; + s.once = function (eventName, handler) { + eventName = normalizeEventName(eventName); + var _handler = function () { + handler(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4]); + s.off(eventName, _handler); + }; + s.on(eventName, _handler); + return s; + }; + + + // Accessibility tools + s.a11y = { + makeFocusable: function ($el) { + $el.attr('tabIndex', '0'); + return $el; + }, + addRole: function ($el, role) { + $el.attr('role', role); + return $el; + }, + + addLabel: function ($el, label) { + $el.attr('aria-label', label); + return $el; + }, + + disable: function ($el) { + $el.attr('aria-disabled', true); + return $el; + }, + + enable: function ($el) { + $el.attr('aria-disabled', false); + return $el; + }, + + onEnterKey: function (event) { + if (event.keyCode !== 13) return; + if ($(event.target).is(s.params.nextButton)) { + s.onClickNext(event); + if (s.isEnd) { + s.a11y.notify(s.params.lastSlideMessage); + } + else { + s.a11y.notify(s.params.nextSlideMessage); + } + } + else if ($(event.target).is(s.params.prevButton)) { + s.onClickPrev(event); + if (s.isBeginning) { + s.a11y.notify(s.params.firstSlideMessage); + } + else { + s.a11y.notify(s.params.prevSlideMessage); + } + } + if ($(event.target).is('.' + s.params.bulletClass)) { + $(event.target)[0].click(); + } + }, + + liveRegion: $(''), + + notify: function (message) { + var notification = s.a11y.liveRegion; + if (notification.length === 0) return; + notification.html(''); + notification.html(message); + }, + init: function () { + // Setup accessibility + if (s.params.nextButton && s.nextButton && s.nextButton.length > 0) { + s.a11y.makeFocusable(s.nextButton); + s.a11y.addRole(s.nextButton, 'button'); + s.a11y.addLabel(s.nextButton, s.params.nextSlideMessage); + } + if (s.params.prevButton && s.prevButton && s.prevButton.length > 0) { + s.a11y.makeFocusable(s.prevButton); + s.a11y.addRole(s.prevButton, 'button'); + s.a11y.addLabel(s.prevButton, s.params.prevSlideMessage); + } + + $(s.container).append(s.a11y.liveRegion); + }, + initPagination: function () { + if (s.params.pagination && s.params.paginationClickable && s.bullets && s.bullets.length) { + s.bullets.each(function () { + var bullet = $(this); + s.a11y.makeFocusable(bullet); + s.a11y.addRole(bullet, 'button'); + s.a11y.addLabel(bullet, s.params.paginationBulletMessage.replace(/{{index}}/, bullet.index() + 1)); + }); + } + }, + destroy: function () { + if (s.a11y.liveRegion && s.a11y.liveRegion.length > 0) s.a11y.liveRegion.remove(); + } + }; + + + /*========================= + Init/Destroy + ===========================*/ + s.init = function () { + if (s.params.loop) s.createLoop(); + s.updateContainerSize(); + s.updateSlidesSize(); + s.updatePagination(); + if (s.params.scrollbar && s.scrollbar) { + s.scrollbar.set(); + if (s.params.scrollbarDraggable) { + s.scrollbar.enableDraggable(); + } + } + if (s.params.effect !== 'slide' && s.effects[s.params.effect]) { + if (!s.params.loop) s.updateProgress(); + s.effects[s.params.effect].setTranslate(); + } + if (s.params.loop) { + s.slideTo(s.params.initialSlide + s.loopedSlides, 0, s.params.runCallbacksOnInit); + } + else { + s.slideTo(s.params.initialSlide, 0, s.params.runCallbacksOnInit); + if (s.params.initialSlide === 0) { + if (s.parallax && s.params.parallax) s.parallax.setTranslate(); + if (s.lazy && s.params.lazyLoading) { + s.lazy.load(); + s.lazy.initialImageLoaded = true; + } + } + } + s.attachEvents(); + if (s.params.observer && s.support.observer) { + s.initObservers(); + } + if (s.params.preloadImages && !s.params.lazyLoading) { + s.preloadImages(); + } + if (s.params.zoom && s.zoom) { + s.zoom.init(); + } + if (s.params.autoplay) { + s.startAutoplay(); + } + if (s.params.keyboardControl) { + if (s.enableKeyboardControl) s.enableKeyboardControl(); + } + if (s.params.mousewheelControl) { + if (s.enableMousewheelControl) s.enableMousewheelControl(); + } + // Deprecated hashnavReplaceState changed to replaceState for use in hashnav and history + if (s.params.hashnavReplaceState) { + s.params.replaceState = s.params.hashnavReplaceState; + } + if (s.params.history) { + if (s.history) s.history.init(); + } + if (s.params.hashnav) { + if (s.hashnav) s.hashnav.init(); + } + if (s.params.a11y && s.a11y) s.a11y.init(); + s.emit('onInit', s); + }; + + // Cleanup dynamic styles + s.cleanupStyles = function () { + // Container + s.container.removeClass(s.classNames.join(' ')).removeAttr('style'); + + // Wrapper + s.wrapper.removeAttr('style'); + + // Slides + if (s.slides && s.slides.length) { + s.slides + .removeClass([ + s.params.slideVisibleClass, + s.params.slideActiveClass, + s.params.slideNextClass, + s.params.slidePrevClass + ].join(' ')) + .removeAttr('style') + .removeAttr('data-swiper-column') + .removeAttr('data-swiper-row'); + } + + // Pagination/Bullets + if (s.paginationContainer && s.paginationContainer.length) { + s.paginationContainer.removeClass(s.params.paginationHiddenClass); + } + if (s.bullets && s.bullets.length) { + s.bullets.removeClass(s.params.bulletActiveClass); + } + + // Buttons + if (s.params.prevButton) $(s.params.prevButton).removeClass(s.params.buttonDisabledClass); + if (s.params.nextButton) $(s.params.nextButton).removeClass(s.params.buttonDisabledClass); + + // Scrollbar + if (s.params.scrollbar && s.scrollbar) { + if (s.scrollbar.track && s.scrollbar.track.length) s.scrollbar.track.removeAttr('style'); + if (s.scrollbar.drag && s.scrollbar.drag.length) s.scrollbar.drag.removeAttr('style'); + } + }; + + // Destroy + s.destroy = function (deleteInstance, cleanupStyles) { + // Detach evebts + s.detachEvents(); + // Stop autoplay + s.stopAutoplay(); + // Disable draggable + if (s.params.scrollbar && s.scrollbar) { + if (s.params.scrollbarDraggable) { + s.scrollbar.disableDraggable(); + } + } + // Destroy loop + if (s.params.loop) { + s.destroyLoop(); + } + // Cleanup styles + if (cleanupStyles) { + s.cleanupStyles(); + } + // Disconnect observer + s.disconnectObservers(); + + // Destroy zoom + if (s.params.zoom && s.zoom) { + s.zoom.destroy(); + } + // Disable keyboard/mousewheel + if (s.params.keyboardControl) { + if (s.disableKeyboardControl) s.disableKeyboardControl(); + } + if (s.params.mousewheelControl) { + if (s.disableMousewheelControl) s.disableMousewheelControl(); + } + // Disable a11y + if (s.params.a11y && s.a11y) s.a11y.destroy(); + // Delete history popstate + if (s.params.history && !s.params.replaceState) { + window.removeEventListener('popstate', s.history.setHistoryPopState); + } + if (s.params.hashnav && s.hashnav) { + s.hashnav.destroy(); + } + // Destroy callback + s.emit('onDestroy'); + // Delete instance + if (deleteInstance !== false) s = null; + }; + + s.init(); + + + + // Return swiper instance + return s; + }; + + + /*================================================== + Prototype + ====================================================*/ + Swiper.prototype = { + isSafari: (function () { + var ua = window.navigator.userAgent.toLowerCase(); + return (ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0); + })(), + isUiWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent), + isArray: function (arr) { + return Object.prototype.toString.apply(arr) === '[object Array]'; + }, + /*================================================== + Browser + ====================================================*/ + browser: { + ie: window.navigator.pointerEnabled || window.navigator.msPointerEnabled, + ieTouch: (window.navigator.msPointerEnabled && window.navigator.msMaxTouchPoints > 1) || (window.navigator.pointerEnabled && window.navigator.maxTouchPoints > 1), + lteIE9: (function() { + // create temporary DIV + var div = document.createElement('div'); + // add content to tmp DIV which is wrapped into the IE HTML conditional statement + div.innerHTML = ''; + // return true / false value based on what will browser render + return div.getElementsByTagName('i').length === 1; + })() + }, + /*================================================== + Devices + ====================================================*/ + device: (function () { + var ua = window.navigator.userAgent; + var android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); + var ipad = ua.match(/(iPad).*OS\s([\d_]+)/); + var ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/); + var iphone = !ipad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/); + return { + ios: ipad || iphone || ipod, + android: android + }; + })(), + /*================================================== + Feature Detection + ====================================================*/ + support: { + touch : (window.Modernizr && Modernizr.touch === true) || (function () { + return !!(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch); + })(), + + transforms3d : (window.Modernizr && Modernizr.csstransforms3d === true) || (function () { + var div = document.createElement('div').style; + return ('webkitPerspective' in div || 'MozPerspective' in div || 'OPerspective' in div || 'MsPerspective' in div || 'perspective' in div); + })(), + + flexbox: (function () { + var div = document.createElement('div').style; + var styles = ('alignItems webkitAlignItems webkitBoxAlign msFlexAlign mozBoxAlign webkitFlexDirection msFlexDirection mozBoxDirection mozBoxOrient webkitBoxDirection webkitBoxOrient').split(' '); + for (var i = 0; i < styles.length; i++) { + if (styles[i] in div) return true; + } + })(), + + observer: (function () { + return ('MutationObserver' in window || 'WebkitMutationObserver' in window); + })(), + + passiveListener: (function () { + var supportsPassive = false; + try { + var opts = Object.defineProperty({}, 'passive', { + get: function() { + supportsPassive = true; + } + }); + window.addEventListener('testPassiveListener', null, opts); + } catch (e) {} + return supportsPassive; + })(), + + gestures: (function () { + return 'ongesturestart' in window; + })() + }, + /*================================================== + Plugins + ====================================================*/ + plugins: {} + }; + + + /*=========================== + Dom7 Library + ===========================*/ + var Dom7 = (function () { + var Dom7 = function (arr) { + var _this = this, i = 0; + // Create array-like object + for (i = 0; i < arr.length; i++) { + _this[i] = arr[i]; + } + _this.length = arr.length; + // Return collection with methods + return this; + }; + var $ = function (selector, context) { + var arr = [], i = 0; + if (selector && !context) { + if (selector instanceof Dom7) { + return selector; + } + } + if (selector) { + // String + if (typeof selector === 'string') { + var els, tempParent, html = selector.trim(); + if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) { + var toCreate = 'div'; + if (html.indexOf(':~]/)) { + // Pure ID selector + els = [document.getElementById(selector.split('#')[1])]; + } + else { + // Other selectors + els = (context || document).querySelectorAll(selector); + } + for (i = 0; i < els.length; i++) { + if (els[i]) arr.push(els[i]); + } + } + } + // Node/element + else if (selector.nodeType || selector === window || selector === document) { + arr.push(selector); + } + //Array of elements or instance of Dom + else if (selector.length > 0 && selector[0].nodeType) { + for (i = 0; i < selector.length; i++) { + arr.push(selector[i]); + } + } + } + return new Dom7(arr); + }; + Dom7.prototype = { + // Classes and attriutes + addClass: function (className) { + if (typeof className === 'undefined') { + return this; + } + var classes = className.split(' '); + for (var i = 0; i < classes.length; i++) { + for (var j = 0; j < this.length; j++) { + this[j].classList.add(classes[i]); + } + } + return this; + }, + removeClass: function (className) { + var classes = className.split(' '); + for (var i = 0; i < classes.length; i++) { + for (var j = 0; j < this.length; j++) { + this[j].classList.remove(classes[i]); + } + } + return this; + }, + hasClass: function (className) { + if (!this[0]) return false; + else return this[0].classList.contains(className); + }, + toggleClass: function (className) { + var classes = className.split(' '); + for (var i = 0; i < classes.length; i++) { + for (var j = 0; j < this.length; j++) { + this[j].classList.toggle(classes[i]); + } + } + return this; + }, + attr: function (attrs, value) { + if (arguments.length === 1 && typeof attrs === 'string') { + // Get attr + if (this[0]) return this[0].getAttribute(attrs); + else return undefined; + } + else { + // Set attrs + for (var i = 0; i < this.length; i++) { + if (arguments.length === 2) { + // String + this[i].setAttribute(attrs, value); + } + else { + // Object + for (var attrName in attrs) { + this[i][attrName] = attrs[attrName]; + this[i].setAttribute(attrName, attrs[attrName]); + } + } + } + return this; + } + }, + removeAttr: function (attr) { + for (var i = 0; i < this.length; i++) { + this[i].removeAttribute(attr); + } + return this; + }, + data: function (key, value) { + if (typeof value === 'undefined') { + // Get value + if (this[0]) { + var dataKey = this[0].getAttribute('data-' + key); + if (dataKey) return dataKey; + else if (this[0].dom7ElementDataStorage && (key in this[0].dom7ElementDataStorage)) return this[0].dom7ElementDataStorage[key]; + else return undefined; + } + else return undefined; + } + else { + // Set value + for (var i = 0; i < this.length; i++) { + var el = this[i]; + if (!el.dom7ElementDataStorage) el.dom7ElementDataStorage = {}; + el.dom7ElementDataStorage[key] = value; + } + return this; + } + }, + // Transforms + transform : function (transform) { + for (var i = 0; i < this.length; i++) { + var elStyle = this[i].style; + elStyle.webkitTransform = elStyle.MsTransform = elStyle.msTransform = elStyle.MozTransform = elStyle.OTransform = elStyle.transform = transform; + } + return this; + }, + transition: function (duration) { + if (typeof duration !== 'string') { + duration = duration + 'ms'; + } + for (var i = 0; i < this.length; i++) { + var elStyle = this[i].style; + elStyle.webkitTransitionDuration = elStyle.MsTransitionDuration = elStyle.msTransitionDuration = elStyle.MozTransitionDuration = elStyle.OTransitionDuration = elStyle.transitionDuration = duration; + } + return this; + }, + //Events + on: function (eventName, targetSelector, listener, capture) { + function handleLiveEvent(e) { + var target = e.target; + if ($(target).is(targetSelector)) listener.call(target, e); + else { + var parents = $(target).parents(); + for (var k = 0; k < parents.length; k++) { + if ($(parents[k]).is(targetSelector)) listener.call(parents[k], e); + } + } + } + var events = eventName.split(' '); + var i, j; + for (i = 0; i < this.length; i++) { + if (typeof targetSelector === 'function' || targetSelector === false) { + // Usual events + if (typeof targetSelector === 'function') { + listener = arguments[1]; + capture = arguments[2] || false; + } + for (j = 0; j < events.length; j++) { + this[i].addEventListener(events[j], listener, capture); + } + } + else { + //Live events + for (j = 0; j < events.length; j++) { + if (!this[i].dom7LiveListeners) this[i].dom7LiveListeners = []; + this[i].dom7LiveListeners.push({listener: listener, liveListener: handleLiveEvent}); + this[i].addEventListener(events[j], handleLiveEvent, capture); + } + } + } + + return this; + }, + off: function (eventName, targetSelector, listener, capture) { + var events = eventName.split(' '); + for (var i = 0; i < events.length; i++) { + for (var j = 0; j < this.length; j++) { + if (typeof targetSelector === 'function' || targetSelector === false) { + // Usual events + if (typeof targetSelector === 'function') { + listener = arguments[1]; + capture = arguments[2] || false; + } + this[j].removeEventListener(events[i], listener, capture); + } + else { + // Live event + if (this[j].dom7LiveListeners) { + for (var k = 0; k < this[j].dom7LiveListeners.length; k++) { + if (this[j].dom7LiveListeners[k].listener === listener) { + this[j].removeEventListener(events[i], this[j].dom7LiveListeners[k].liveListener, capture); + } + } + } + } + } + } + return this; + }, + once: function (eventName, targetSelector, listener, capture) { + var dom = this; + if (typeof targetSelector === 'function') { + targetSelector = false; + listener = arguments[1]; + capture = arguments[2]; + } + function proxy(e) { + listener(e); + dom.off(eventName, targetSelector, proxy, capture); + } + dom.on(eventName, targetSelector, proxy, capture); + }, + trigger: function (eventName, eventData) { + for (var i = 0; i < this.length; i++) { + var evt; + try { + evt = new window.CustomEvent(eventName, {detail: eventData, bubbles: true, cancelable: true}); + } + catch (e) { + evt = document.createEvent('Event'); + evt.initEvent(eventName, true, true); + evt.detail = eventData; + } + this[i].dispatchEvent(evt); + } + return this; + }, + transitionEnd: function (callback) { + var events = ['webkitTransitionEnd', 'transitionend', 'oTransitionEnd', 'MSTransitionEnd', 'msTransitionEnd'], + i, j, dom = this; + function fireCallBack(e) { + /*jshint validthis:true */ + if (e.target !== this) return; + callback.call(this, e); + for (i = 0; i < events.length; i++) { + dom.off(events[i], fireCallBack); + } + } + if (callback) { + for (i = 0; i < events.length; i++) { + dom.on(events[i], fireCallBack); + } + } + return this; + }, + // Sizing/Styles + width: function () { + if (this[0] === window) { + return window.innerWidth; + } + else { + if (this.length > 0) { + return parseFloat(this.css('width')); + } + else { + return null; + } + } + }, + outerWidth: function (includeMargins) { + if (this.length > 0) { + if (includeMargins) + return this[0].offsetWidth + parseFloat(this.css('margin-right')) + parseFloat(this.css('margin-left')); + else + return this[0].offsetWidth; + } + else return null; + }, + height: function () { + if (this[0] === window) { + return window.innerHeight; + } + else { + if (this.length > 0) { + return parseFloat(this.css('height')); + } + else { + return null; + } + } + }, + outerHeight: function (includeMargins) { + if (this.length > 0) { + if (includeMargins) + return this[0].offsetHeight + parseFloat(this.css('margin-top')) + parseFloat(this.css('margin-bottom')); + else + return this[0].offsetHeight; + } + else return null; + }, + offset: function () { + if (this.length > 0) { + var el = this[0]; + var box = el.getBoundingClientRect(); + var body = document.body; + var clientTop = el.clientTop || body.clientTop || 0; + var clientLeft = el.clientLeft || body.clientLeft || 0; + var scrollTop = window.pageYOffset || el.scrollTop; + var scrollLeft = window.pageXOffset || el.scrollLeft; + return { + top: box.top + scrollTop - clientTop, + left: box.left + scrollLeft - clientLeft + }; + } + else { + return null; + } + }, + css: function (props, value) { + var i; + if (arguments.length === 1) { + if (typeof props === 'string') { + if (this[0]) return window.getComputedStyle(this[0], null).getPropertyValue(props); + } + else { + for (i = 0; i < this.length; i++) { + for (var prop in props) { + this[i].style[prop] = props[prop]; + } + } + return this; + } + } + if (arguments.length === 2 && typeof props === 'string') { + for (i = 0; i < this.length; i++) { + this[i].style[props] = value; + } + return this; + } + return this; + }, + + //Dom manipulation + each: function (callback) { + for (var i = 0; i < this.length; i++) { + callback.call(this[i], i, this[i]); + } + return this; + }, + html: function (html) { + if (typeof html === 'undefined') { + return this[0] ? this[0].innerHTML : undefined; + } + else { + for (var i = 0; i < this.length; i++) { + this[i].innerHTML = html; + } + return this; + } + }, + text: function (text) { + if (typeof text === 'undefined') { + if (this[0]) { + return this[0].textContent.trim(); + } + else return null; + } + else { + for (var i = 0; i < this.length; i++) { + this[i].textContent = text; + } + return this; + } + }, + is: function (selector) { + if (!this[0]) return false; + var compareWith, i; + if (typeof selector === 'string') { + var el = this[0]; + if (el === document) return selector === document; + if (el === window) return selector === window; + + if (el.matches) return el.matches(selector); + else if (el.webkitMatchesSelector) return el.webkitMatchesSelector(selector); + else if (el.mozMatchesSelector) return el.mozMatchesSelector(selector); + else if (el.msMatchesSelector) return el.msMatchesSelector(selector); + else { + compareWith = $(selector); + for (i = 0; i < compareWith.length; i++) { + if (compareWith[i] === this[0]) return true; + } + return false; + } + } + else if (selector === document) return this[0] === document; + else if (selector === window) return this[0] === window; + else { + if (selector.nodeType || selector instanceof Dom7) { + compareWith = selector.nodeType ? [selector] : selector; + for (i = 0; i < compareWith.length; i++) { + if (compareWith[i] === this[0]) return true; + } + return false; + } + return false; + } + + }, + index: function () { + if (this[0]) { + var child = this[0]; + var i = 0; + while ((child = child.previousSibling) !== null) { + if (child.nodeType === 1) i++; + } + return i; + } + else return undefined; + }, + eq: function (index) { + if (typeof index === 'undefined') return this; + var length = this.length; + var returnIndex; + if (index > length - 1) { + return new Dom7([]); + } + if (index < 0) { + returnIndex = length + index; + if (returnIndex < 0) return new Dom7([]); + else return new Dom7([this[returnIndex]]); + } + return new Dom7([this[index]]); + }, + append: function (newChild) { + var i, j; + for (i = 0; i < this.length; i++) { + if (typeof newChild === 'string') { + var tempDiv = document.createElement('div'); + tempDiv.innerHTML = newChild; + while (tempDiv.firstChild) { + this[i].appendChild(tempDiv.firstChild); + } + } + else if (newChild instanceof Dom7) { + for (j = 0; j < newChild.length; j++) { + this[i].appendChild(newChild[j]); + } + } + else { + this[i].appendChild(newChild); + } + } + return this; + }, + prepend: function (newChild) { + var i, j; + for (i = 0; i < this.length; i++) { + if (typeof newChild === 'string') { + var tempDiv = document.createElement('div'); + tempDiv.innerHTML = newChild; + for (j = tempDiv.childNodes.length - 1; j >= 0; j--) { + this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]); + } + // this[i].insertAdjacentHTML('afterbegin', newChild); + } + else if (newChild instanceof Dom7) { + for (j = 0; j < newChild.length; j++) { + this[i].insertBefore(newChild[j], this[i].childNodes[0]); + } + } + else { + this[i].insertBefore(newChild, this[i].childNodes[0]); + } + } + return this; + }, + insertBefore: function (selector) { + var before = $(selector); + for (var i = 0; i < this.length; i++) { + if (before.length === 1) { + before[0].parentNode.insertBefore(this[i], before[0]); + } + else if (before.length > 1) { + for (var j = 0; j < before.length; j++) { + before[j].parentNode.insertBefore(this[i].cloneNode(true), before[j]); + } + } + } + }, + insertAfter: function (selector) { + var after = $(selector); + for (var i = 0; i < this.length; i++) { + if (after.length === 1) { + after[0].parentNode.insertBefore(this[i], after[0].nextSibling); + } + else if (after.length > 1) { + for (var j = 0; j < after.length; j++) { + after[j].parentNode.insertBefore(this[i].cloneNode(true), after[j].nextSibling); + } + } + } + }, + next: function (selector) { + if (this.length > 0) { + if (selector) { + if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) return new Dom7([this[0].nextElementSibling]); + else return new Dom7([]); + } + else { + if (this[0].nextElementSibling) return new Dom7([this[0].nextElementSibling]); + else return new Dom7([]); + } + } + else return new Dom7([]); + }, + nextAll: function (selector) { + var nextEls = []; + var el = this[0]; + if (!el) return new Dom7([]); + while (el.nextElementSibling) { + var next = el.nextElementSibling; + if (selector) { + if($(next).is(selector)) nextEls.push(next); + } + else nextEls.push(next); + el = next; + } + return new Dom7(nextEls); + }, + prev: function (selector) { + if (this.length > 0) { + if (selector) { + if (this[0].previousElementSibling && $(this[0].previousElementSibling).is(selector)) return new Dom7([this[0].previousElementSibling]); + else return new Dom7([]); + } + else { + if (this[0].previousElementSibling) return new Dom7([this[0].previousElementSibling]); + else return new Dom7([]); + } + } + else return new Dom7([]); + }, + prevAll: function (selector) { + var prevEls = []; + var el = this[0]; + if (!el) return new Dom7([]); + while (el.previousElementSibling) { + var prev = el.previousElementSibling; + if (selector) { + if($(prev).is(selector)) prevEls.push(prev); + } + else prevEls.push(prev); + el = prev; + } + return new Dom7(prevEls); + }, + parent: function (selector) { + var parents = []; + for (var i = 0; i < this.length; i++) { + if (selector) { + if ($(this[i].parentNode).is(selector)) parents.push(this[i].parentNode); + } + else { + parents.push(this[i].parentNode); + } + } + return $($.unique(parents)); + }, + parents: function (selector) { + var parents = []; + for (var i = 0; i < this.length; i++) { + var parent = this[i].parentNode; + while (parent) { + if (selector) { + if ($(parent).is(selector)) parents.push(parent); + } + else { + parents.push(parent); + } + parent = parent.parentNode; + } + } + return $($.unique(parents)); + }, + find : function (selector) { + var foundElements = []; + for (var i = 0; i < this.length; i++) { + var found = this[i].querySelectorAll(selector); + for (var j = 0; j < found.length; j++) { + foundElements.push(found[j]); + } + } + return new Dom7(foundElements); + }, + children: function (selector) { + var children = []; + for (var i = 0; i < this.length; i++) { + var childNodes = this[i].childNodes; + + for (var j = 0; j < childNodes.length; j++) { + if (!selector) { + if (childNodes[j].nodeType === 1) children.push(childNodes[j]); + } + else { + if (childNodes[j].nodeType === 1 && $(childNodes[j]).is(selector)) children.push(childNodes[j]); + } + } + } + return new Dom7($.unique(children)); + }, + remove: function () { + for (var i = 0; i < this.length; i++) { + if (this[i].parentNode) this[i].parentNode.removeChild(this[i]); + } + return this; + }, + add: function () { + var dom = this; + var i, j; + for (i = 0; i < arguments.length; i++) { + var toAdd = $(arguments[i]); + for (j = 0; j < toAdd.length; j++) { + dom[dom.length] = toAdd[j]; + dom.length++; + } + } + return dom; + } + }; + $.fn = Dom7.prototype; + $.unique = function (arr) { + var unique = []; + for (var i = 0; i < arr.length; i++) { + if (unique.indexOf(arr[i]) === -1) unique.push(arr[i]); + } + return unique; + }; + + return $; + })(); + + + /*=========================== + Get Dom libraries + ===========================*/ + var swiperDomPlugins = ['jQuery', 'Zepto', 'Dom7']; + for (var i = 0; i < swiperDomPlugins.length; i++) { + if (window[swiperDomPlugins[i]]) { + addLibraryPlugin(window[swiperDomPlugins[i]]); + } + } + // Required DOM Plugins + var domLib; + if (typeof Dom7 === 'undefined') { + domLib = window.Dom7 || window.Zepto || window.jQuery; + } + else { + domLib = Dom7; + } + + + /*=========================== + Add .swiper plugin from Dom libraries + ===========================*/ + function addLibraryPlugin(lib) { + lib.fn.swiper = function (params) { + var firstInstance; + lib(this).each(function () { + var s = new Swiper(this, params); + if (!firstInstance) firstInstance = s; + }); + return firstInstance; + }; + } + + if (domLib) { + if (!('transitionEnd' in domLib.fn)) { + domLib.fn.transitionEnd = function (callback) { + var events = ['webkitTransitionEnd', 'transitionend', 'oTransitionEnd', 'MSTransitionEnd', 'msTransitionEnd'], + i, j, dom = this; + function fireCallBack(e) { + /*jshint validthis:true */ + if (e.target !== this) return; + callback.call(this, e); + for (i = 0; i < events.length; i++) { + dom.off(events[i], fireCallBack); + } + } + if (callback) { + for (i = 0; i < events.length; i++) { + dom.on(events[i], fireCallBack); + } + } + return this; + }; + } + if (!('transform' in domLib.fn)) { + domLib.fn.transform = function (transform) { + for (var i = 0; i < this.length; i++) { + var elStyle = this[i].style; + elStyle.webkitTransform = elStyle.MsTransform = elStyle.msTransform = elStyle.MozTransform = elStyle.OTransform = elStyle.transform = transform; + } + return this; + }; + } + if (!('transition' in domLib.fn)) { + domLib.fn.transition = function (duration) { + if (typeof duration !== 'string') { + duration = duration + 'ms'; + } + for (var i = 0; i < this.length; i++) { + var elStyle = this[i].style; + elStyle.webkitTransitionDuration = elStyle.MsTransitionDuration = elStyle.msTransitionDuration = elStyle.MozTransitionDuration = elStyle.OTransitionDuration = elStyle.transitionDuration = duration; + } + return this; + }; + } + if (!('outerWidth' in domLib.fn)) { + domLib.fn.outerWidth = function (includeMargins) { + if (this.length > 0) { + if (includeMargins) + return this[0].offsetWidth + parseFloat(this.css('margin-right')) + parseFloat(this.css('margin-left')); + else + return this[0].offsetWidth; + } + else return null; + }; + } + } + + + window.Swiper = Swiper; +})(); + +/*=========================== +Swiper AMD Export +===========================*/ +if (typeof(module) !== 'undefined') +{ + module.exports = window.Swiper; +} +else if (typeof define === 'function' && define.amd) { + define([], function () { + 'use strict'; + return window.Swiper; + }); +} + +//# sourceMappingURL=maps/swiper.js.map \ No newline at end of file diff --git a/src/assets/sucripts/swiper.min.css b/src/assets/sucripts/swiper.min.css new file mode 100644 index 0000000..542f193 --- /dev/null +++ b/src/assets/sucripts/swiper.min.css @@ -0,0 +1,15 @@ +/** + * Swiper 3.4.2 + * Most modern mobile touch slider and framework with hardware accelerated transitions + * + * http://www.idangero.us/swiper/ + * + * Copyright 2017, Vladimir Kharlampidi + * The iDangero.us + * http://www.idangero.us/ + * + * Licensed under MIT + * + * Released on: March 10, 2017 + */ + .swiper-container{margin-left:auto;margin-right:auto;position:relative;overflow:hidden;z-index:1}.swiper-container-no-flexbox .swiper-slide{float:left}.swiper-container-vertical>.swiper-wrapper{-webkit-box-orient:vertical;-moz-box-orient:vertical;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column}.swiper-wrapper{position:relative;width:100%;height:100%;z-index:1;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.swiper-container-android .swiper-slide,.swiper-wrapper{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-o-transform:translate(0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.swiper-container-multirow>.swiper-wrapper{-webkit-box-lines:multiple;-moz-box-lines:multiple;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap}.swiper-container-free-mode>.swiper-wrapper{-webkit-transition-timing-function:ease-out;-moz-transition-timing-function:ease-out;-ms-transition-timing-function:ease-out;-o-transition-timing-function:ease-out;transition-timing-function:ease-out;margin:0 auto}.swiper-slide{-webkit-flex-shrink:0;-ms-flex:0 0 auto;flex-shrink:0;width:100%;height:100%;position:relative}.swiper-container-autoheight,.swiper-container-autoheight .swiper-slide{height:auto}.swiper-container-autoheight .swiper-wrapper{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start;-webkit-transition-property:-webkit-transform,height;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform,height}.swiper-container .swiper-notification{position:absolute;left:0;top:0;pointer-events:none;opacity:0;z-index:-1000}.swiper-wp8-horizontal{-ms-touch-action:pan-y;touch-action:pan-y}.swiper-wp8-vertical{-ms-touch-action:pan-x;touch-action:pan-x}.swiper-button-next,.swiper-button-prev{position:absolute;top:50%;width:27px;height:44px;margin-top:-22px;z-index:10;cursor:pointer;-moz-background-size:27px 44px;-webkit-background-size:27px 44px;background-size:27px 44px;background-position:center;background-repeat:no-repeat}.swiper-button-next.swiper-button-disabled,.swiper-button-prev.swiper-button-disabled{opacity:.35;cursor:auto;pointer-events:none}.swiper-button-prev,.swiper-container-rtl .swiper-button-next{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");left:10px;right:auto}.swiper-button-prev.swiper-button-black,.swiper-container-rtl .swiper-button-next.swiper-button-black{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E")}.swiper-button-prev.swiper-button-white,.swiper-container-rtl .swiper-button-next.swiper-button-white{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E")}.swiper-button-next,.swiper-container-rtl .swiper-button-prev{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");right:10px;left:auto}.swiper-button-next.swiper-button-black,.swiper-container-rtl .swiper-button-prev.swiper-button-black{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E")}.swiper-button-next.swiper-button-white,.swiper-container-rtl .swiper-button-prev.swiper-button-white{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E")}.swiper-pagination{position:absolute;text-align:center;-webkit-transition:.3s;-moz-transition:.3s;-o-transition:.3s;transition:.3s;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0);z-index:10}.swiper-pagination.swiper-pagination-hidden{opacity:0}.swiper-container-horizontal>.swiper-pagination-bullets,.swiper-pagination-custom,.swiper-pagination-fraction{bottom:10px;left:0;width:100%}.swiper-pagination-bullet{width:8px;height:8px;display:inline-block;border-radius:100%;background:#000;opacity:.2}button.swiper-pagination-bullet{border:none;margin:0;padding:0;box-shadow:none;-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;appearance:none}.swiper-pagination-clickable .swiper-pagination-bullet{cursor:pointer}.swiper-pagination-white .swiper-pagination-bullet{background:#fff}.swiper-pagination-bullet-active{opacity:1;background:#007aff}.swiper-pagination-white .swiper-pagination-bullet-active{background:#fff}.swiper-pagination-black .swiper-pagination-bullet-active{background:#000}.swiper-container-vertical>.swiper-pagination-bullets{right:10px;top:50%;-webkit-transform:translate3d(0,-50%,0);-moz-transform:translate3d(0,-50%,0);-o-transform:translate(0,-50%);-ms-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0)}.swiper-container-vertical>.swiper-pagination-bullets .swiper-pagination-bullet{margin:5px 0;display:block}.swiper-container-horizontal>.swiper-pagination-bullets .swiper-pagination-bullet{margin:0 5px}.swiper-pagination-progress{background:rgba(0,0,0,.25);position:absolute}.swiper-pagination-progress .swiper-pagination-progressbar{background:#007aff;position:absolute;left:0;top:0;width:100%;height:100%;-webkit-transform:scale(0);-ms-transform:scale(0);-o-transform:scale(0);transform:scale(0);-webkit-transform-origin:left top;-moz-transform-origin:left top;-ms-transform-origin:left top;-o-transform-origin:left top;transform-origin:left top}.swiper-container-rtl .swiper-pagination-progress .swiper-pagination-progressbar{-webkit-transform-origin:right top;-moz-transform-origin:right top;-ms-transform-origin:right top;-o-transform-origin:right top;transform-origin:right top}.swiper-container-horizontal>.swiper-pagination-progress{width:100%;height:4px;left:0;top:0}.swiper-container-vertical>.swiper-pagination-progress{width:4px;height:100%;left:0;top:0}.swiper-pagination-progress.swiper-pagination-white{background:rgba(255,255,255,.5)}.swiper-pagination-progress.swiper-pagination-white .swiper-pagination-progressbar{background:#fff}.swiper-pagination-progress.swiper-pagination-black .swiper-pagination-progressbar{background:#000}.swiper-container-3d{-webkit-perspective:1200px;-moz-perspective:1200px;-o-perspective:1200px;perspective:1200px}.swiper-container-3d .swiper-cube-shadow,.swiper-container-3d .swiper-slide,.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top,.swiper-container-3d .swiper-wrapper{-webkit-transform-style:preserve-3d;-moz-transform-style:preserve-3d;-ms-transform-style:preserve-3d;transform-style:preserve-3d}.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:10}.swiper-container-3d .swiper-slide-shadow-left{background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,0)));background-image:-webkit-linear-gradient(right,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-moz-linear-gradient(right,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-o-linear-gradient(right,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:linear-gradient(to left,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-3d .swiper-slide-shadow-right{background-image:-webkit-gradient(linear,right top,left top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,0)));background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-moz-linear-gradient(left,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-o-linear-gradient(left,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:linear-gradient(to right,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-3d .swiper-slide-shadow-top{background-image:-webkit-gradient(linear,left top,left bottom,from(rgba(0,0,0,.5)),to(rgba(0,0,0,0)));background-image:-webkit-linear-gradient(bottom,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-moz-linear-gradient(bottom,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-o-linear-gradient(bottom,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:linear-gradient(to top,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-3d .swiper-slide-shadow-bottom{background-image:-webkit-gradient(linear,left bottom,left top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,0)));background-image:-webkit-linear-gradient(top,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-moz-linear-gradient(top,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-o-linear-gradient(top,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:linear-gradient(to bottom,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-coverflow .swiper-wrapper,.swiper-container-flip .swiper-wrapper{-ms-perspective:1200px}.swiper-container-cube,.swiper-container-flip{overflow:visible}.swiper-container-cube .swiper-slide,.swiper-container-flip .swiper-slide{pointer-events:none;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden;z-index:1}.swiper-container-cube .swiper-slide .swiper-slide,.swiper-container-flip .swiper-slide .swiper-slide{pointer-events:none}.swiper-container-cube .swiper-slide-active,.swiper-container-cube .swiper-slide-active .swiper-slide-active,.swiper-container-flip .swiper-slide-active,.swiper-container-flip .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-container-cube .swiper-slide-shadow-bottom,.swiper-container-cube .swiper-slide-shadow-left,.swiper-container-cube .swiper-slide-shadow-right,.swiper-container-cube .swiper-slide-shadow-top,.swiper-container-flip .swiper-slide-shadow-bottom,.swiper-container-flip .swiper-slide-shadow-left,.swiper-container-flip .swiper-slide-shadow-right,.swiper-container-flip .swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden}.swiper-container-cube .swiper-slide{visibility:hidden;-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;width:100%;height:100%}.swiper-container-cube.swiper-container-rtl .swiper-slide{-webkit-transform-origin:100% 0;-moz-transform-origin:100% 0;-ms-transform-origin:100% 0;transform-origin:100% 0}.swiper-container-cube .swiper-slide-active,.swiper-container-cube .swiper-slide-next,.swiper-container-cube .swiper-slide-next+.swiper-slide,.swiper-container-cube .swiper-slide-prev{pointer-events:auto;visibility:visible}.swiper-container-cube .swiper-cube-shadow{position:absolute;left:0;bottom:0;width:100%;height:100%;background:#000;opacity:.6;-webkit-filter:blur(50px);filter:blur(50px);z-index:0}.swiper-container-fade.swiper-container-free-mode .swiper-slide{-webkit-transition-timing-function:ease-out;-moz-transition-timing-function:ease-out;-ms-transition-timing-function:ease-out;-o-transition-timing-function:ease-out;transition-timing-function:ease-out}.swiper-container-fade .swiper-slide{pointer-events:none;-webkit-transition-property:opacity;-moz-transition-property:opacity;-o-transition-property:opacity;transition-property:opacity}.swiper-container-fade .swiper-slide .swiper-slide{pointer-events:none}.swiper-container-fade .swiper-slide-active,.swiper-container-fade .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-zoom-container{width:100%;height:100%;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-pack:center;-moz-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-align:center;-moz-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;text-align:center}.swiper-zoom-container>canvas,.swiper-zoom-container>img,.swiper-zoom-container>svg{max-width:100%;max-height:100%;object-fit:contain}.swiper-scrollbar{border-radius:10px;position:relative;-ms-touch-action:none;background:rgba(0,0,0,.1)}.swiper-container-horizontal>.swiper-scrollbar{position:absolute;left:1%;bottom:3px;z-index:50;height:5px;width:98%}.swiper-container-vertical>.swiper-scrollbar{position:absolute;right:3px;top:1%;z-index:50;width:5px;height:98%}.swiper-scrollbar-drag{height:100%;width:100%;position:relative;background:rgba(0,0,0,.5);border-radius:10px;left:0;top:0}.swiper-scrollbar-cursor-drag{cursor:move}.swiper-lazy-preloader{width:42px;height:42px;position:absolute;left:50%;top:50%;margin-left:-21px;margin-top:-21px;z-index:10;-webkit-transform-origin:50%;-moz-transform-origin:50%;transform-origin:50%;-webkit-animation:swiper-preloader-spin 1s steps(12,end) infinite;-moz-animation:swiper-preloader-spin 1s steps(12,end) infinite;animation:swiper-preloader-spin 1s steps(12,end) infinite}.swiper-lazy-preloader:after{display:block;content:"";width:100%;height:100%;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");background-position:50%;-webkit-background-size:100%;background-size:100%;background-repeat:no-repeat}.swiper-lazy-preloader-white:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%23fff'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E")}@-webkit-keyframes swiper-preloader-spin{100%{-webkit-transform:rotate(360deg)}}@keyframes swiper-preloader-spin{100%{transform:rotate(360deg)}} \ No newline at end of file diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts new file mode 100644 index 0000000..eb78be0 --- /dev/null +++ b/src/environments/environment.prod.ts @@ -0,0 +1,38 @@ +//"http://ec2-34-222-134-101.us-west-2.compute.amazonaws.com" DNS +//"http://zendioninc.mooo.com" SITE +//"http://127.0.0.1" PRODUÇÃO +import { Router } from '@angular/router'; + +export class FuncoesGlobais { + + constructor(private router: Router) { } + + Logout() { + localStorage.removeItem("Session"); + localStorage.removeItem("UserID"); + localStorage.removeItem("UserName"); + localStorage.removeItem("Role"); + window.history.pushState("", "", environment.LinkProjeto + "/home"); + window.location.reload(); + } + + CheckAdminRoute() { + if (localStorage.getItem("Role") != "1") { + if (localStorage.getItem("Role") == "2") + this.router.navigate(['/dashboard/cliente']); + else + this.router.navigate(['/login']); + } + } + +} + +export const environment = { + production: true, + Titulo: "Zendion, INC", + LinkProjeto: "https://zendioninc.com.br", + ApiUrl: "https://zendioninc.com.br/api", + GeoAPI: "01f438a7f97b3f8baafa65c58a9b4fc8&query", + emailContato: "contato@zendioninc.com.br", + telefoneContato: "+55 (19) 99871-7560" +}; \ No newline at end of file diff --git a/src/environments/environment.ts b/src/environments/environment.ts new file mode 100644 index 0000000..c37ad80 --- /dev/null +++ b/src/environments/environment.ts @@ -0,0 +1,38 @@ +//"http://ec2-34-222-134-101.us-west-2.compute.amazonaws.com" DNS +//"http://zendioninc.mooo.com" SITE +//"http://127.0.0.1" PRODUÇÃO +import { Router } from '@angular/router'; + +export class FuncoesGlobais { + + constructor(private router: Router) { } + + Logout() { + localStorage.removeItem("Session"); + localStorage.removeItem("UserID"); + localStorage.removeItem("UserName"); + localStorage.removeItem("Role"); + window.history.pushState("", "", environment.LinkProjeto + "/home"); + window.location.reload(); + } + + CheckAdminRoute() { + if (localStorage.getItem("Role") != "1") { + if (localStorage.getItem("Role") == "2") + this.router.navigate(['/dashboard/cliente']); + else + this.router.navigate(['/login']); + } + } + +} + +export const environment = { + production: false, + Titulo: "Zendion, INC", + LinkProjeto: "https://zendioninc.com.br", + ApiUrl: "http://127.0.0.1:1337", + GeoAPI: "01f438a7f97b3f8baafa65c58a9b4fc8&query", + emailContato: "contato@zendioninc.com.br", + telefoneContato: "+55 (19) 99871-7560" +}; \ No newline at end of file diff --git a/src/favicon.ico b/src/favicon.ico new file mode 100644 index 0000000..5af82df Binary files /dev/null and b/src/favicon.ico differ diff --git a/src/index.html b/src/index.html new file mode 100644 index 0000000..c037b02 --- /dev/null +++ b/src/index.html @@ -0,0 +1,21 @@ + + + + + Carregando... + + + + + + + + + + + + + + + + diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..3b2b7d0 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,13 @@ +import 'hammerjs'; +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; + +if (environment.production) { + enableProdMode(); +} + +platformBrowserDynamic().bootstrapModule(AppModule) + .catch(err => console.error(err)); diff --git a/src/polyfills.ts b/src/polyfills.ts new file mode 100644 index 0000000..aa665d6 --- /dev/null +++ b/src/polyfills.ts @@ -0,0 +1,63 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), + * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. + * + * Learn more in https://angular.io/guide/browser-support + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** IE10 and IE11 requires the following for NgClass support on SVG elements */ +// import 'classlist.js'; // Run `npm install --save classlist.js`. + +/** + * Web Animations `@angular/platform-browser/animations` + * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. + * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). + */ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. + +/** + * By default, zone.js will patch all possible macroTask and DomEvents + * user can disable parts of macroTask/DomEvents patch by setting following flags + * because those flags need to be set before `zone.js` being loaded, and webpack + * will put import in the top of bundle, so user need to create a separate file + * in this directory (for example: zone-flags.ts), and put the following flags + * into that file, and then add the following code before importing zone.js. + * import './zone-flags.ts'; + * + * The flags allowed in zone-flags.ts are listed here. + * + * The following flags will work for all browsers. + * + * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame + * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick + * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames + * + * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js + * with the following flag, it will bypass `zone.js` patch for IE/Edge + * + * (window as any).__Zone_enable_cross_context_check = true; + * + */ + +/*************************************************************************************************** + * Zone JS is required by default for Angular itself. + */ +import 'zone.js/dist/zone'; // Included with Angular CLI. + + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ diff --git a/src/styles.scss b/src/styles.scss new file mode 100644 index 0000000..2850164 --- /dev/null +++ b/src/styles.scss @@ -0,0 +1,139 @@ +/* Global Styles */ +body { + overflow-x: hidden; + background: radial-gradient(ellipse at bottom, #0d1d31 0%, #0c0d13 100%); + background-attachment: fixed; /* Faz o background ficar fixo ao scrollar */ + background-size: cover; /* Faz com que o background cubra a tela inteira */ + color: #FFF; + font-family: 'Roboto', "Helvetica Neue", sans-serif; + margin: 0; + line-height: 1.6; + height: 100%; +} + + +html, body { + height: 100%; +} + +hr { + background-color: #FFF; + border: none; + height: 1px; + margin: 2em auto; + width: 70%; +} + +/* Header Improvements */ +.header { + background: #003366; /* Azul escuro sólido para combinar com a identidade visual */ + border-bottom: 2px solid #001F3F; /* Um tom mais escuro para destaque */ + height: 3em; + width: 100vw; + position: fixed; + top: 0; + left: 0; + z-index: 10; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 2em; +} + +.header img { + height: 80%; +} + +.header .btnSearch { + color: #FFF; + font-size: 1.1rem; + cursor: pointer; + transition: color 0.3s ease; +} + +.header .btnSearch:hover { + color: #FFD700; /* Adiciona um efeito de hover com um dourado suave */ +} + +.header .btn { + background-color: #001F3F; + border-color: #001F3F; + color: white; + transition: background-color 0.3s ease, border-color 0.3s ease; +} + +.header .btn:hover { + background-color: #FFD700; + border-color: #FFD700; +} + +/* Footer Improvements */ +.footer { + background-color: #001F3F; /* Azul escuro para o footer */ + color: white; + padding: 2em; + text-align: center; + position: relative; + bottom: 0; + width: 100%; + box-shadow: 0px -5px 15px rgba(0, 0, 0, 0.3); +} + +.footer p { + margin: 0.5em 0; + font-size: 1rem; +} + +.footer a { + color: #FFD700; + text-decoration: none; + transition: color 0.3s ease; +} + +.footer a:hover { + color: #FFF; +} + +/* Scrollbar Customization */ +body::-webkit-scrollbar { + width: 10px; +} + +body::-webkit-scrollbar-track { + background: #111; +} + +body::-webkit-scrollbar-thumb { + background: #003366; + border-radius: 10px; +} + +body::-webkit-scrollbar-thumb:hover { + background: #FFD700; +} + +/* Buttons */ +.btn { + background-color: #003366; + border: none; + color: white; + padding: 0.75em 1.5em; + font-size: 1rem; + cursor: pointer; + transition: background-color 0.3s ease; +} + +.btn:hover { + background-color: #001F3F; +} + +/* Links */ +a { + color: #FFD700; + text-decoration: none; + transition: color 0.3s ease; +} + +a:hover { + color: #FFF; +} diff --git a/src/test.ts b/src/test.ts new file mode 100644 index 0000000..1631789 --- /dev/null +++ b/src/test.ts @@ -0,0 +1,20 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/zone-testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require: any; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); diff --git a/termos.html b/termos.html new file mode 100644 index 0000000..6ce86ba --- /dev/null +++ b/termos.html @@ -0,0 +1 @@ +

1. Termos

Ao acessar ao site Zendion Inc, concorda em cumprir estes termos de serviço, todas as leis e regulamentos aplicáveis ​​e concorda que é responsável pelo cumprimento de todas as leis locais aplicáveis. Se você não concordar com algum desses termos, está proibido de usar ou acessar este site. Os materiais contidos neste site são protegidos pelas leis de direitos autorais e marcas comerciais aplicáveis.

2. Uso de Licença

É concedida permissão para baixar temporariamente uma cópia dos materiais (informações ou software) no site Zendion Inc , apenas para visualização transitória pessoal e não comercial. Esta é a concessão de uma licença, não uma transferência de título e, sob esta licença, você não pode: 

  1. modificar ou copiar os materiais; 
  2. usar os materiais para qualquer finalidade comercial ou para exibição pública (comercial ou não comercial); 
  3. tentar descompilar ou fazer engenharia reversa de qualquer software contido no site Zendion Inc; 
  4. remover quaisquer direitos autorais ou outras notações de propriedade dos materiais; ou 
  5. transferir os materiais para outra pessoa ou 'espelhe' os materiais em qualquer outro servidor.

Esta licença será automaticamente rescindida se você violar alguma dessas restrições e poderá ser rescindida por Zendion Inc a qualquer momento. Ao encerrar a visualização desses materiais ou após o término desta licença, você deve apagar todos os materiais baixados em sua posse, seja em formato eletrónico ou impresso.

3. Isenção de responsabilidade

  1. Os materiais no site da Zendion Inc são fornecidos 'como estão'. Zendion Inc não oferece garantias, expressas ou implícitas, e, por este meio, isenta e nega todas as outras garantias, incluindo, sem limitação, garantias implícitas ou condições de comercialização, adequação a um fim específico ou não violação de propriedade intelectual ou outra violação de direitos.
  2. Além disso, o Zendion Inc não garante ou faz qualquer representação relativa à precisão, aos resultados prováveis ​​ou à confiabilidade do uso dos materiais em seu site ou de outra forma relacionado a esses materiais ou em sites vinculados a este site.

4. Limitações

Em nenhum caso o Zendion Inc ou seus fornecedores serão responsáveis ​​por quaisquer danos (incluindo, sem limitação, danos por perda de dados ou lucro ou devido a interrupção dos negócios) decorrentes do uso ou da incapacidade de usar os materiais em Zendion Inc, mesmo que Zendion Inc ou um representante autorizado da Zendion Inc tenha sido notificado oralmente ou por escrito da possibilidade de tais danos. Como algumas jurisdições não permitem limitações em garantias implícitas, ou limitações de responsabilidade por danos conseqüentes ou incidentais, essas limitações podem não se aplicar a você.

5. Precisão dos materiais

Os materiais exibidos no site da Zendion Inc podem incluir erros técnicos, tipográficos ou fotográficos. Zendion Inc não garante que qualquer material em seu site seja preciso, completo ou atual. Zendion Inc pode fazer alterações nos materiais contidos em seu site a qualquer momento, sem aviso prévio. No entanto, Zendion Inc não se compromete a atualizar os materiais.

6. Links

O Zendion Inc não analisou todos os sites vinculados ao seu site e não é responsável pelo conteúdo de nenhum site vinculado. A inclusão de qualquer link não implica endosso por Zendion Inc do site. O uso de qualquer site vinculado é por conta e risco do usuário.


Modificações

O Zendion Inc pode revisar estes termos de serviço do site a qualquer momento, sem aviso prévio. Ao usar este site, você concorda em ficar vinculado à versão atual desses termos de serviço.

Lei aplicável

Estes termos e condições são regidos e interpretados de acordo com as leis do Zendion Inc e você se submete irrevogavelmente à jurisdição exclusiva dos tribunais naquele estado ou localidade.

\ No newline at end of file diff --git a/termos.txt b/termos.txt new file mode 100644 index 0000000..25ec777 --- /dev/null +++ b/termos.txt @@ -0,0 +1 @@ +1. TermosAo acessar ao site Zendion Inc, concorda em cumprir estes termos de serviço, todas as leis e regulamentos aplicáveis ​​e concorda que é responsável pelo cumprimento de todas as leis locais aplicáveis. Se você não concordar com algum desses termos, está proibido de usar ou acessar este site. Os materiais contidos neste site são protegidos pelas leis de direitos autorais e marcas comerciais aplicáveis.2. Uso de LicençaÉ concedida permissão para baixar temporariamente uma cópia dos materiais (informações ou software) no site Zendion Inc , apenas para visualização transitória pessoal e não comercial. Esta é a concessão de uma licença, não uma transferência de título e, sob esta licença, você não pode: modificar ou copiar os materiais; usar os materiais para qualquer finalidade comercial ou para exibição pública (comercial ou não comercial); tentar descompilar ou fazer engenharia reversa de qualquer software contido no site Zendion Inc; remover quaisquer direitos autorais ou outras notações de propriedade dos materiais; ou transferir os materiais para outra pessoa ou 'espelhe' os materiais em qualquer outro servidor.Esta licença será automaticamente rescindida se você violar alguma dessas restrições e poderá ser rescindida por Zendion Inc a qualquer momento. Ao encerrar a visualização desses materiais ou após o término desta licença, você deve apagar todos os materiais baixados em sua posse, seja em formato eletrónico ou impresso.3. Isenção de responsabilidadeOs materiais no site da Zendion Inc são fornecidos 'como estão'. Zendion Inc não oferece garantias, expressas ou implícitas, e, por este meio, isenta e nega todas as outras garantias, incluindo, sem limitação, garantias implícitas ou condições de comercialização, adequação a um fim específico ou não violação de propriedade intelectual ou outra violação de direitos.Além disso, o Zendion Inc não garante ou faz qualquer representação relativa à precisão, aos resultados prováveis ​​ou à confiabilidade do uso dos materiais em seu site ou de outra forma relacionado a esses materiais ou em sites vinculados a este site.4. LimitaçõesEm nenhum caso o Zendion Inc ou seus fornecedores serão responsáveis ​​por quaisquer danos (incluindo, sem limitação, danos por perda de dados ou lucro ou devido a interrupção dos negócios) decorrentes do uso ou da incapacidade de usar os materiais em Zendion Inc, mesmo que Zendion Inc ou um representante autorizado da Zendion Inc tenha sido notificado oralmente ou por escrito da possibilidade de tais danos. Como algumas jurisdições não permitem limitações em garantias implícitas, ou limitações de responsabilidade por danos conseqüentes ou incidentais, essas limitações podem não se aplicar a você.5. Precisão dos materiaisOs materiais exibidos no site da Zendion Inc podem incluir erros técnicos, tipográficos ou fotográficos. Zendion Inc não garante que qualquer material em seu site seja preciso, completo ou atual. Zendion Inc pode fazer alterações nos materiais contidos em seu site a qualquer momento, sem aviso prévio. No entanto, Zendion Inc não se compromete a atualizar os materiais.6. LinksO Zendion Inc não analisou todos os sites vinculados ao seu site e não é responsável pelo conteúdo de nenhum site vinculado. A inclusão de qualquer link não implica endosso por Zendion Inc do site. O uso de qualquer site vinculado é por conta e risco do usuário.ModificaçõesO Zendion Inc pode revisar estes termos de serviço do site a qualquer momento, sem aviso prévio. Ao usar este site, você concorda em ficar vinculado à versão atual desses termos de serviço.Lei aplicávelEstes termos e condições são regidos e interpretados de acordo com as leis do Zendion Inc e você se submete irrevogavelmente à jurisdição exclusiva dos tribunais naquele estado ou localidade. \ No newline at end of file diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..31f8397 --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,14 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [] + }, + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "src/test.ts", + "src/**/*.spec.ts" + ] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..30956ae --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "downlevelIteration": true, + "experimentalDecorators": true, + "module": "esnext", + "moduleResolution": "node", + "importHelpers": true, + "target": "es2015", + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "es2018", + "dom" + ] + }, + "angularCompilerOptions": { + "fullTemplateTypeCheck": true, + "strictInjectionParameters": true + } +} diff --git a/tsconfig.spec.json b/tsconfig.spec.json new file mode 100644 index 0000000..6400fde --- /dev/null +++ b/tsconfig.spec.json @@ -0,0 +1,18 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "src/test.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} diff --git a/tslint.json b/tslint.json new file mode 100644 index 0000000..f0adae9 --- /dev/null +++ b/tslint.json @@ -0,0 +1,92 @@ +{ + "extends": "tslint:recommended", + "rules": { + "array-type": false, + "arrow-parens": false, + "deprecation": { + "severity": "warning" + }, + "component-class-suffix": true, + "contextual-lifecycle": true, + "directive-class-suffix": true, + "directive-selector": [ + true, + "attribute", + "app", + "camelCase" + ], + "component-selector": [ + true, + "element", + "app", + "kebab-case" + ], + "import-blacklist": [ + true, + "rxjs/Rx" + ], + "interface-name": false, + "max-classes-per-file": false, + "max-line-length": [ + true, + 140 + ], + "member-access": false, + "member-ordering": [ + true, + { + "order": [ + "static-field", + "instance-field", + "static-method", + "instance-method" + ] + } + ], + "no-consecutive-blank-lines": false, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-empty": false, + "no-inferrable-types": [ + true, + "ignore-params" + ], + "no-non-null-assertion": true, + "no-redundant-jsdoc": true, + "no-switch-case-fall-through": true, + "no-use-before-declare": true, + "no-var-requires": false, + "object-literal-key-quotes": [ + true, + "as-needed" + ], + "object-literal-sort-keys": false, + "ordered-imports": false, + "quotemark": [ + true, + "single" + ], + "trailing-comma": false, + "no-conflicting-lifecycle": true, + "no-host-metadata-property": true, + "no-input-rename": true, + "no-inputs-metadata-property": true, + "no-output-native": true, + "no-output-on-prefix": true, + "no-output-rename": true, + "no-outputs-metadata-property": true, + "template-banana-in-box": true, + "template-no-negated-async": true, + "use-lifecycle-interface": true, + "use-pipe-transform-interface": true + }, + "rulesDirectory": [ + "codelyzer" + ] +} \ No newline at end of file