├── ios ├── Flutter │ ├── Debug.xcconfig │ ├── Release.xcconfig │ └── AppFrameworkInfo.plist ├── Runner │ ├── Runner-Bridging-Header.h │ ├── Assets.xcassets │ │ ├── LaunchImage.imageset │ │ │ ├── LaunchImage.png │ │ │ ├── LaunchImage@2x.png │ │ │ ├── LaunchImage@3x.png │ │ │ ├── README.md │ │ │ └── Contents.json │ │ └── AppIcon.appiconset │ │ │ ├── Icon-App-20x20@1x.png │ │ │ ├── Icon-App-20x20@2x.png │ │ │ ├── Icon-App-20x20@3x.png │ │ │ ├── Icon-App-29x29@1x.png │ │ │ ├── Icon-App-29x29@2x.png │ │ │ ├── Icon-App-29x29@3x.png │ │ │ ├── Icon-App-40x40@1x.png │ │ │ ├── Icon-App-40x40@2x.png │ │ │ ├── Icon-App-40x40@3x.png │ │ │ ├── Icon-App-50x50@1x.png │ │ │ ├── Icon-App-50x50@2x.png │ │ │ ├── Icon-App-57x57@1x.png │ │ │ ├── Icon-App-57x57@2x.png │ │ │ ├── Icon-App-60x60@2x.png │ │ │ ├── Icon-App-60x60@3x.png │ │ │ ├── Icon-App-72x72@1x.png │ │ │ ├── Icon-App-72x72@2x.png │ │ │ ├── Icon-App-76x76@1x.png │ │ │ ├── Icon-App-76x76@2x.png │ │ │ ├── Icon-App-1024x1024@1x.png │ │ │ ├── Icon-App-83.5x83.5@2x.png │ │ │ └── Contents.json │ ├── AppDelegate.swift │ ├── Base.lproj │ │ ├── Main.storyboard │ │ └── LaunchScreen.storyboard │ └── Info.plist ├── Runner.xcworkspace │ └── contents.xcworkspacedata ├── Runner.xcodeproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ ├── xcshareddata │ │ └── xcschemes │ │ │ └── Runner.xcscheme │ └── project.pbxproj └── .gitignore ├── Server ├── config.js ├── db.js ├── model │ ├── user.js │ └── question.js ├── package.json ├── app.js ├── auth │ ├── verifyToken.js │ └── authController.js ├── question │ └── questionController.js └── package-lock.json ├── assets └── images │ ├── bio2.png │ ├── chem.png │ ├── comp2.png │ ├── math.png │ ├── phys.png │ ├── quiz3.png │ ├── user.png │ ├── headIcon.png │ └── headIcon2.png ├── android ├── gradle.properties ├── .gitignore ├── app │ ├── src │ │ ├── main │ │ │ ├── res │ │ │ │ ├── mipmap-hdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── values │ │ │ │ │ └── styles.xml │ │ │ │ └── drawable │ │ │ │ │ └── launch_background.xml │ │ │ ├── kotlin │ │ │ │ └── com │ │ │ │ │ └── example │ │ │ │ │ └── guru │ │ │ │ │ └── MainActivity.kt │ │ │ └── AndroidManifest.xml │ │ ├── debug │ │ │ └── AndroidManifest.xml │ │ └── profile │ │ │ └── AndroidManifest.xml │ └── build.gradle ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties ├── settings.gradle └── build.gradle ├── .metadata ├── lib ├── main.dart ├── utils │ └── getQuestion.dart ├── screen │ ├── result.dart │ ├── home.dart │ └── mcq.dart └── auth │ ├── login.dart │ └── register.dart ├── README.md ├── .gitignore ├── pubspec.yaml └── pubspec.lock /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /Server/config.js: -------------------------------------------------------------------------------- 1 | module.exports={ 2 | "secret":"supersecret" 3 | } -------------------------------------------------------------------------------- /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" -------------------------------------------------------------------------------- /assets/images/bio2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/assets/images/bio2.png -------------------------------------------------------------------------------- /assets/images/chem.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/assets/images/chem.png -------------------------------------------------------------------------------- /assets/images/comp2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/assets/images/comp2.png -------------------------------------------------------------------------------- /assets/images/math.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/assets/images/math.png -------------------------------------------------------------------------------- /assets/images/phys.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/assets/images/phys.png -------------------------------------------------------------------------------- /assets/images/quiz3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/assets/images/quiz3.png -------------------------------------------------------------------------------- /assets/images/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/assets/images/user.png -------------------------------------------------------------------------------- /assets/images/headIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/assets/images/headIcon.png -------------------------------------------------------------------------------- /assets/images/headIcon2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/assets/images/headIcon2.png -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.enableR8=true 3 | android.useAndroidX=true 4 | android.enableJetifier=true 5 | -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samiptimalsena/Flutter-Guru/master/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Server/db.js: -------------------------------------------------------------------------------- 1 | const mongoose=require("mongoose") 2 | 3 | mongoose.connect("mongodb+srv://samip:mongoDB@cluster0-tgqgy.mongodb.net/test?retryWrites=true&w=majority",{ useNewUrlParser: true,useUnifiedTopology: true }) 4 | .then(()=>{console.log("DB connected")}) -------------------------------------------------------------------------------- /Server/model/user.js: -------------------------------------------------------------------------------- 1 | const mongoose=require("mongoose") 2 | 3 | const userSchema=new mongoose.Schema({ 4 | name: String, 5 | email: String, 6 | password: String 7 | }) 8 | 9 | mongoose.model("User",userSchema) 10 | 11 | module.exports=mongoose.model("User"); -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 23 08:50:38 CEST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip 7 | -------------------------------------------------------------------------------- /.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: f139b11009aeb8ed2a3a3aa8b0066e482709dde3 8 | channel: stable 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Server/model/question.js: -------------------------------------------------------------------------------- 1 | const mongoose=require("mongoose") 2 | 3 | const questionSchema=mongoose.Schema({ 4 | type: String, 5 | question: String , 6 | option1: String, 7 | option2: String, 8 | option3: String, 9 | option4: String, 10 | correctAnswer: String 11 | }) 12 | 13 | mongoose.model("Question",questionSchema); 14 | 15 | module.exports=mongoose.model("Question") -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | -------------------------------------------------------------------------------- /Server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "auth", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "app.js", 6 | "scripts": { 7 | "start": "nodemon app.js" 8 | }, 9 | "author": "Samip Timalsena", 10 | "license": "ISC", 11 | "dependencies": { 12 | "bcryptjs": "^2.4.3", 13 | "body-parser": "^1.19.0", 14 | "express": "^4.17.1", 15 | "jsonwebtoken": "^8.5.1", 16 | "mongoose": "^5.9.9", 17 | "nodemon": "^2.0.3" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | 4 | @UIApplicationMain 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /android/app/src/main/kotlin/com/example/guru/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.guru 2 | 3 | import androidx.annotation.NonNull; 4 | import io.flutter.embedding.android.FlutterActivity 5 | import io.flutter.embedding.engine.FlutterEngine 6 | import io.flutter.plugins.GeneratedPluginRegistrant 7 | 8 | class MainActivity: FlutterActivity() { 9 | override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { 10 | GeneratedPluginRegistrant.registerWith(flutterEngine); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import './auth/register.dart'; 3 | import './auth/login.dart'; 4 | import 'package:flutter_dotenv/flutter_dotenv.dart'; 5 | 6 | Future main()async { 7 | await DotEnv().load('.env'); 8 | runApp(MaterialApp( 9 | debugShowCheckedModeBanner: false, 10 | title: "Guru", 11 | initialRoute: "/", 12 | routes: { 13 | "/": (context) => Login(), 14 | "/register": (context) => Register() 15 | })); 16 | } 17 | 18 | 19 | -------------------------------------------------------------------------------- /Server/app.js: -------------------------------------------------------------------------------- 1 | const express=require("express") 2 | const app=express(); 3 | const db=require("./db"); 4 | const auth=require("./auth/authController") 5 | const question=require("./question/questionController") 6 | 7 | app.get("/",(req,res)=>{ 8 | res.status(200).send("Welcome to authentication"); 9 | }) 10 | 11 | app.use("/auth",auth); 12 | 13 | app.use("/question",question); 14 | 15 | 16 | const port=process.env.PORT || 3000; 17 | 18 | app.listen(port,()=>{ 19 | console.log(`Express listening at port ${port}`) 20 | }) -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchImage@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "LaunchImage@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | 3 | def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() 4 | 5 | def plugins = new Properties() 6 | def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') 7 | if (pluginsFile.exists()) { 8 | pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } 9 | } 10 | 11 | plugins.each { name, path -> 12 | def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() 13 | include ":$name" 14 | project(":$name").projectDir = pluginDirectory 15 | } 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Some Screenshots of UI: 2 | 3 |

4 | 5 | 6 |

7 | 8 |

9 | 10 | 11 |

12 | -------------------------------------------------------------------------------- /ios/.gitignore: -------------------------------------------------------------------------------- 1 | *.mode1v3 2 | *.mode2v3 3 | *.moved-aside 4 | *.pbxuser 5 | *.perspectivev3 6 | **/*sync/ 7 | .sconsign.dblite 8 | .tags* 9 | **/.vagrant/ 10 | **/DerivedData/ 11 | Icon? 12 | **/Pods/ 13 | **/.symlinks/ 14 | profile 15 | xcuserdata 16 | **/.generated/ 17 | Flutter/App.framework 18 | Flutter/Flutter.framework 19 | Flutter/Flutter.podspec 20 | Flutter/Generated.xcconfig 21 | Flutter/app.flx 22 | Flutter/app.zip 23 | Flutter/flutter_assets/ 24 | Flutter/flutter_export_environment.sh 25 | ServiceDefinitions.json 26 | Runner/GeneratedPluginRegistrant.* 27 | 28 | # Exceptions to above rules. 29 | !default.mode1v3 30 | !default.mode2v3 31 | !default.pbxuser 32 | !default.perspectivev3 33 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.3.50' 3 | repositories { 4 | google() 5 | jcenter() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:3.5.0' 10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 | } 12 | } 13 | 14 | allprojects { 15 | repositories { 16 | google() 17 | jcenter() 18 | } 19 | } 20 | 21 | rootProject.buildDir = '../build' 22 | subprojects { 23 | project.buildDir = "${rootProject.buildDir}/${project.name}" 24 | } 25 | subprojects { 26 | project.evaluationDependsOn(':app') 27 | } 28 | 29 | task clean(type: Delete) { 30 | delete rootProject.buildDir 31 | } 32 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | 12 | # IntelliJ related 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea/ 17 | *.env 18 | 19 | # The .vscode folder contains launch configuration and tasks you configure in 20 | # VS Code which you may wish to be included in version control, so this line 21 | # is commented out by default. 22 | #.vscode/ 23 | 24 | # Flutter/Dart/Pub related 25 | **/doc/api/ 26 | .dart_tool/ 27 | .flutter-plugins 28 | .flutter-plugins-dependencies 29 | .packages 30 | .pub-cache/ 31 | .pub/ 32 | /build/ 33 | 34 | # Web related 35 | lib/generated_plugin_registrant.dart 36 | 37 | # Exceptions to above rules. 38 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages 39 | -------------------------------------------------------------------------------- /Server/auth/verifyToken.js: -------------------------------------------------------------------------------- 1 | var jwt = require('jsonwebtoken'); // used to create, sign, and verify tokens 2 | var config = require('../config'); // get our config file 3 | 4 | function verifyToken(req, res, next) { 5 | 6 | // check header or url parameters or post parameters for token 7 | var token = req.headers['x-access-token']; 8 | if (!token) 9 | return res.status(403).send({ auth: false, message: 'No token provided.' }); 10 | 11 | // verifies secret and checks exp 12 | jwt.verify(token, config.secret, function(err, decoded) { 13 | if (err) 14 | return res.status(500).send({ auth: false, message: 'Failed to authenticate token.' }); 15 | 16 | // if everything is good, save to request for use in other routes 17 | req.userId = decoded.id; 18 | next(); 19 | }); 20 | 21 | } 22 | 23 | module.exports = verifyToken; -------------------------------------------------------------------------------- /ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 8.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /lib/utils/getQuestion.dart: -------------------------------------------------------------------------------- 1 | import 'package:http/http.dart' as http; 2 | import 'dart:convert'; 3 | import 'package:flutter_dotenv/flutter_dotenv.dart'; 4 | 5 | class Question{ 6 | String type; 7 | String que; 8 | String option1; 9 | String option2; 10 | String option3; 11 | String option4; 12 | String correctAnswer; 13 | 14 | Question({this.type,this.que,this.option1,this.option2,this.option3,this.option4,this.correctAnswer}); 15 | 16 | factory Question.fromJson(Map json){ 17 | return Question( 18 | type: json["type"], 19 | que: json["question"], 20 | option1: json["option1"], 21 | option2: json["option2"], 22 | option3: json["option3"], 23 | option4: json["option4"], 24 | correctAnswer: json["correctAnswer"] 25 | ); 26 | } 27 | } 28 | 29 | Future> getQuestion(String type)async{ 30 | var response=await http.get(DotEnv().env['API']+type); 31 | var getData=json.decode(response.body) as List; 32 | List questionList=getData.map((data)=>Question.fromJson(data)).toList(); 33 | return questionList; 34 | } -------------------------------------------------------------------------------- /Server/question/questionController.js: -------------------------------------------------------------------------------- 1 | const express=require("express") 2 | const router=express.Router(); 3 | 4 | const bodyParser=require("body-parser") 5 | 6 | router.use(bodyParser.json()); 7 | router.use(bodyParser.urlencoded({extended:false})) 8 | 9 | const Question=require("../model/question") 10 | 11 | router.get("/",(req,res)=>{ 12 | res.status(200).send("You are on question set. So be Prepared."); 13 | }) 14 | 15 | router.get("/getQuestion",(req,res)=>{ 16 | Question.find({ type:req.query.type},(err,question)=>{ 17 | if(err) return res.status(500).send("Error on the server"); 18 | 19 | if(!question) return res.status(404).send("No result found"); 20 | 21 | res.status(200).send(question); 22 | }) 23 | 24 | }) 25 | 26 | router.post("/postQuestion",(req,res)=>{ 27 | Question.create({ 28 | type: req.body.type, 29 | question: req.body.question, 30 | option1: req.body.option1, 31 | option2: req.body.option2, 32 | option3: req.body.option3, 33 | option4: req.body.option4, 34 | correctAnswer: req.body.correctAnswer 35 | }, 36 | (err,question)=>{ 37 | if(err) return res.status(500).send("Question addition unsuccessful"); 38 | 39 | res.status(200).send("Successful"); 40 | } 41 | 42 | ) 43 | }) 44 | 45 | module.exports=router; -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 8 | 12 | 19 | 20 | 21 | 22 | 23 | 24 | 26 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | guru 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | $(FLUTTER_BUILD_NAME) 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(FLUTTER_BUILD_NUMBER) 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UISupportedInterfaceOrientations 30 | 31 | UIInterfaceOrientationPortrait 32 | UIInterfaceOrientationLandscapeLeft 33 | UIInterfaceOrientationLandscapeRight 34 | 35 | UISupportedInterfaceOrientations~ipad 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationPortraitUpsideDown 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | UIViewControllerBasedStatusBarAppearance 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /Server/auth/authController.js: -------------------------------------------------------------------------------- 1 | const express=require("express") 2 | const router=express.Router(); 3 | const bodyParser=require("body-parser") 4 | 5 | router.use(bodyParser.json()); 6 | router.use(bodyParser.urlencoded({extended:false})); 7 | 8 | const User=require("../model/user") 9 | 10 | const jwt=require("jsonwebtoken") 11 | const bcrypt=require("bcryptjs") 12 | const config=require("../config") 13 | const verifyToken=require("./verifyToken") 14 | 15 | router.get("/",(req,res)=>{ 16 | res.status(200).send("Your authentication now proceeds") 17 | }) 18 | 19 | 20 | router.post("/register",(req,res)=>{ 21 | var hashedPassword=bcrypt.hashSync(req.body.password,8); 22 | 23 | User.create({ 24 | name: req.body.name, 25 | email: req.body.email, 26 | password: hashedPassword 27 | }, 28 | (err,user)=>{ 29 | if (err) return res.status(500).send("There was a problem registering the user`."); 30 | 31 | var token=jwt.sign({id: user._id},config.secret,{ 32 | expiresIn: 86400 33 | }); 34 | 35 | res.status(200).send({auth:true,token:token}); 36 | } 37 | 38 | ) 39 | }) 40 | 41 | router.get("/me",verifyToken,(req,res,next)=>{ 42 | User.findById(req.userId, { password: 0 }, function (err, user) { 43 | if (err) return res.status(500).send("There was a problem finding the user."); 44 | if (!user) return res.status(404).send("No user found."); 45 | res.status(200).send(user); 46 | }); 47 | }) 48 | 49 | router.post("/login",(req,res)=>{ 50 | User.findOne({email:req.body.email},(err,user)=>{ 51 | if (err) return res.status(500).send('Error on the server.'); 52 | if (!user) return res.status(404).send('No user found.'); 53 | 54 | var passwordIsValid=bcrypt.compareSync(req.body.password,user.password) 55 | 56 | if (!passwordIsValid) return res.status(401).send({ auth: false, token: null }); 57 | 58 | var token = jwt.sign({ id: user._id }, config.secret, { 59 | expiresIn: 86400 // expires in 24 hours 60 | }); 61 | res.status(200).send({ auth: true, token: token }); 62 | }) 63 | }) 64 | 65 | module.exports=router; -------------------------------------------------------------------------------- /lib/screen/result.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class Result extends StatefulWidget { 4 | final qList; 5 | final scr; 6 | 7 | Result(this.qList, this.scr); 8 | @override 9 | _ResultState createState() => _ResultState(); 10 | } 11 | 12 | class _ResultState extends State { 13 | var questionList; 14 | int score; 15 | @override 16 | void initState() { 17 | super.initState(); 18 | questionList = widget.qList; 19 | score = widget.scr == null ? 0 : widget.scr; 20 | } 21 | 22 | Widget answer(int n) { 23 | return Container( 24 | margin: const EdgeInsets.only(bottom:10), 25 | child: Column( 26 | crossAxisAlignment: CrossAxisAlignment.start, 27 | children: [ 28 | Text((n+1).toString()+" "+ questionList[n].que), 29 | RichText(text: TextSpan( 30 | children:[ 31 | TextSpan(text:"ans: ",style:TextStyle(color: Colors.green,fontSize:15,fontWeight:FontWeight.w500)), 32 | TextSpan(text: questionList[n].correctAnswer,style: TextStyle(color: Colors.black)) 33 | ] 34 | ),), 35 | ], 36 | ), 37 | ); 38 | } 39 | 40 | Widget answerList() { 41 | return ListView.builder( 42 | shrinkWrap: true, 43 | physics: ScrollPhysics(), 44 | padding: EdgeInsets.zero, 45 | itemCount: 15, 46 | itemBuilder: (context, index) { 47 | return answer(index); 48 | }); 49 | } 50 | 51 | @override 52 | Widget build(BuildContext context) { 53 | return Container( 54 | margin: const EdgeInsets.fromLTRB(15,23,15,0), 55 | child: ListView( 56 | padding: EdgeInsets.zero, 57 | children: [ 58 | Container( 59 | alignment: Alignment.center, 60 | child: Text("Answers", 61 | style: TextStyle( 62 | color: Colors.green, 63 | fontWeight: FontWeight.w600, 64 | fontSize: 20)), 65 | ), 66 | Container( 67 | 68 | margin: const EdgeInsets.only(top:10), 69 | child: answerList() 70 | ) 71 | ], 72 | ), 73 | ); 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /android/app/build.gradle: -------------------------------------------------------------------------------- 1 | def localProperties = new Properties() 2 | def localPropertiesFile = rootProject.file('local.properties') 3 | if (localPropertiesFile.exists()) { 4 | localPropertiesFile.withReader('UTF-8') { reader -> 5 | localProperties.load(reader) 6 | } 7 | } 8 | 9 | def flutterRoot = localProperties.getProperty('flutter.sdk') 10 | if (flutterRoot == null) { 11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") 12 | } 13 | 14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 15 | if (flutterVersionCode == null) { 16 | flutterVersionCode = '1' 17 | } 18 | 19 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 20 | if (flutterVersionName == null) { 21 | flutterVersionName = '1.0' 22 | } 23 | 24 | apply plugin: 'com.android.application' 25 | apply plugin: 'kotlin-android' 26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 27 | 28 | android { 29 | compileSdkVersion 28 30 | 31 | sourceSets { 32 | main.java.srcDirs += 'src/main/kotlin' 33 | } 34 | 35 | lintOptions { 36 | disable 'InvalidPackage' 37 | } 38 | 39 | defaultConfig { 40 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 41 | applicationId "com.example.guru" 42 | minSdkVersion 16 43 | targetSdkVersion 28 44 | versionCode flutterVersionCode.toInteger() 45 | versionName flutterVersionName 46 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 47 | } 48 | 49 | buildTypes { 50 | release { 51 | // TODO: Add your own signing config for the release build. 52 | // Signing with the debug keys for now, so `flutter run --release` works. 53 | signingConfig signingConfigs.debug 54 | } 55 | } 56 | } 57 | 58 | flutter { 59 | source '../..' 60 | } 61 | 62 | dependencies { 63 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 64 | testImplementation 'junit:junit:4.12' 65 | androidTestImplementation 'androidx.test:runner:1.1.1' 66 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' 67 | } 68 | -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: guru 2 | description: A new Flutter project. 3 | 4 | # The following defines the version and build number for your application. 5 | # A version number is three numbers separated by dots, like 1.2.43 6 | # followed by an optional build number separated by a +. 7 | # Both the version and the builder number may be overridden in flutter 8 | # build by specifying --build-name and --build-number, respectively. 9 | # In Android, build-name is used as versionName while build-number used as versionCode. 10 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning 11 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. 12 | # Read more about iOS versioning at 13 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html 14 | version: 1.0.0+1 15 | 16 | environment: 17 | sdk: ">=2.1.0 <3.0.0" 18 | 19 | dependencies: 20 | flutter_dotenv: ^2.1.0 21 | http: ^0.12.0+4 22 | shared_preferences: ^0.5.6+3 23 | flutter: 24 | sdk: flutter 25 | 26 | # The following adds the Cupertino Icons font to your application. 27 | # Use with the CupertinoIcons class for iOS style icons. 28 | cupertino_icons: ^0.1.2 29 | 30 | dev_dependencies: 31 | flutter_launcher_icons: "^0.7.3" 32 | google_fonts: ^0.5.0+1 33 | flutter_test: 34 | sdk: flutter 35 | 36 | flutter_icons: 37 | android: true 38 | ios: true 39 | image_path: "assets/images/headIcon.png" 40 | 41 | 42 | # For information on the generic Dart part of this file, see the 43 | # following page: https://dart.dev/tools/pub/pubspec 44 | 45 | # The following section is specific to Flutter. 46 | flutter: 47 | 48 | # The following line ensures that the Material Icons font is 49 | # included with your application, so that you can use the icons in 50 | # the material Icons class. 51 | uses-material-design: true 52 | 53 | # To add assets to your application, add an assets section, like this: 54 | assets: 55 | - assets/images/ 56 | - .env 57 | # - images/a_dot_ham.jpeg 58 | 59 | # An image asset can refer to one or more resolution-specific "variants", see 60 | # https://flutter.dev/assets-and-images/#resolution-aware. 61 | 62 | # For details regarding adding assets from package dependencies, see 63 | # https://flutter.dev/assets-and-images/#from-packages 64 | 65 | # To add custom fonts to your application, add a fonts section here, 66 | # in this "flutter" section. Each entry in this list should have a 67 | # "family" key with the font family name, and a "fonts" key with a 68 | # list giving the asset and other descriptors for the font. For 69 | # example: 70 | # fonts: 71 | # - family: Schyler 72 | # fonts: 73 | # - asset: fonts/Schyler-Regular.ttf 74 | # - asset: fonts/Schyler-Italic.ttf 75 | # style: italic 76 | # - family: Trajan Pro 77 | # fonts: 78 | # - asset: fonts/TrajanPro.ttf 79 | # - asset: fonts/TrajanPro_Bold.ttf 80 | # weight: 700 81 | # 82 | # For details regarding fonts from package dependencies, 83 | # see https://flutter.dev/custom-fonts/#from-packages 84 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-29x29@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-40x40@3x.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "Icon-App-60x60@3x.png", 55 | "scale" : "3x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-App-20x20@1x.png", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "size" : "20x20", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-App-20x20@2x.png", 67 | "scale" : "2x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-29x29@1x.png", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "29x29", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-29x29@2x.png", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-40x40@1x.png", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "40x40", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-40x40@2x.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-76x76@1x.png", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "76x76", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-76x76@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "83.5x83.5", 107 | "idiom" : "ipad", 108 | "filename" : "Icon-App-83.5x83.5@2x.png", 109 | "scale" : "2x" 110 | }, 111 | { 112 | "size" : "1024x1024", 113 | "idiom" : "ios-marketing", 114 | "filename" : "Icon-App-1024x1024@1x.png", 115 | "scale" : "1x" 116 | } 117 | ], 118 | "info" : { 119 | "version" : 1, 120 | "author" : "xcode" 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /lib/screen/home.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:shared_preferences/shared_preferences.dart'; 3 | import '../auth/login.dart'; 4 | import 'mcq.dart'; 5 | 6 | class Home extends StatefulWidget { 7 | @override 8 | _HomeState createState() => _HomeState(); 9 | } 10 | 11 | class _HomeState extends State { 12 | SharedPreferences sharedPreferences; 13 | var scaffoldKey = GlobalKey(); 14 | 15 | logOut() async { 16 | sharedPreferences = await SharedPreferences.getInstance(); 17 | sharedPreferences.clear(); 18 | Navigator.of(context).pushAndRemoveUntil( 19 | MaterialPageRoute(builder: (BuildContext context) => Login()), 20 | (Route route) => false); 21 | } 22 | 23 | Widget drawerItem(var icon, String text) { 24 | return ListTile( 25 | leading: Icon( 26 | icon, 27 | size: 30, 28 | ), 29 | onTap: () { 30 | if (text == "Logout") { 31 | logOut(); 32 | } 33 | }, 34 | title: Text( 35 | text, 36 | style: TextStyle( 37 | color: Colors.blueGrey, fontSize: 20, fontWeight: FontWeight.w300), 38 | ), 39 | ); 40 | } 41 | 42 | Widget imageHolder(String path, String text, double margin, double imgHeight, 43 | String subject) { 44 | return GestureDetector( 45 | onTap: () { 46 | Navigator.of(context).push(MaterialPageRoute( 47 | builder: (BuildContext context) => Mcq(subject))); 48 | 49 | }, 50 | child: Container( 51 | margin: EdgeInsets.fromLTRB(margin, 40, 0, 0), 52 | child: Column( 53 | children: [ 54 | Container( 55 | height: imgHeight, 56 | width: 50, 57 | decoration: BoxDecoration( 58 | image: new DecorationImage( 59 | image: new AssetImage(path), 60 | fit: BoxFit.fill, 61 | )), 62 | ), 63 | Text(text), 64 | ], 65 | ), 66 | ), 67 | ); 68 | } 69 | 70 | @override 71 | Widget build(BuildContext context) { 72 | var ht = MediaQuery.of(context).size.height; 73 | return Scaffold( 74 | key: scaffoldKey, 75 | endDrawer: Drawer( 76 | child: Container( 77 | color: Colors.green[100], 78 | child: ListView( 79 | children: [ 80 | DrawerHeader( 81 | child: Container( 82 | decoration: BoxDecoration( 83 | color: Colors.white, 84 | shape: BoxShape.circle, 85 | image: DecorationImage( 86 | image: AssetImage("assets/images/user.png"), 87 | ), 88 | ), 89 | )), 90 | drawerItem(Icons.person, "My profile"), 91 | drawerItem(Icons.info, "About"), 92 | drawerItem(Icons.help_outline, "Help"), 93 | drawerItem(Icons.exit_to_app, "Logout") 94 | ], 95 | )), 96 | ), 97 | body: SingleChildScrollView( 98 | child: Stack( 99 | children: [ 100 | Container( 101 | height: MediaQuery.of(context).size.height, 102 | color: Colors.grey[200], 103 | child: ListView(children: [ 104 | Container( 105 | height: (MediaQuery.of(context).size.height) / 2.6, 106 | decoration: BoxDecoration( 107 | color: Colors.green[300], 108 | borderRadius: new BorderRadius.only( 109 | bottomLeft: const Radius.circular(40), 110 | bottomRight: const Radius.circular(40))), 111 | ) 112 | ]) 113 | ), 114 | Positioned( 115 | right: 5, 116 | top: 40, 117 | child: IconButton( 118 | icon: Icon( 119 | Icons.menu, 120 | color: Colors.blueGrey, 121 | size: 35, 122 | ), 123 | onPressed: () { 124 | scaffoldKey.currentState.openEndDrawer(); 125 | }, 126 | )), 127 | Center( 128 | child: Container( 129 | margin: EdgeInsets.only(top: 70), 130 | height: 150, 131 | child: Column( 132 | children: [ 133 | Image.asset( 134 | "assets/images/headIcon2.png", 135 | height: 90, 136 | ), 137 | Container( 138 | margin: const EdgeInsets.only(top: 10), 139 | child: Text( 140 | "GURU", 141 | style: TextStyle( 142 | fontSize: 30, color: Colors.blue[900],fontWeight: FontWeight.w500), 143 | )) 144 | ], 145 | ))), 146 | Center( 147 | child: Container( 148 | height: 450, 149 | width: 290, 150 | margin: new EdgeInsets.only(top: ht / 3.3), 151 | decoration: BoxDecoration( 152 | boxShadow: [ 153 | BoxShadow( 154 | color: Colors.grey, 155 | offset: Offset(0.0, 3.0), 156 | blurRadius: 7.0) 157 | ], 158 | color: Colors.white, 159 | borderRadius: new BorderRadius.only( 160 | topLeft: const Radius.circular(100), 161 | topRight: const Radius.circular(5), 162 | bottomLeft: const Radius.circular(10), 163 | bottomRight: const Radius.circular(5))), 164 | child: ListView( 165 | children: [ 166 | Center( 167 | child: Container( 168 | margin: const EdgeInsets.only(bottom: 15), 169 | child: Text( 170 | "Please Select", 171 | style: TextStyle(fontSize: 18), 172 | ))), 173 | Divider( 174 | thickness: 2, 175 | color: Colors.black12, 176 | indent: 50, 177 | endIndent: 25, 178 | ), 179 | Wrap( 180 | children: [ 181 | imageHolder("assets/images/chem.png", "Chemistry", 40, 182 | 60, "Chemistry"), 183 | imageHolder("assets/images/phys.png", "Physics", 80, 184 | 60, "Physics"), 185 | imageHolder("assets/images/math.png", "Math", 45, 60, 186 | "Physics"), 187 | imageHolder("assets/images/bio2.png", "Biology", 85, 188 | 60, "Physics"), 189 | imageHolder("assets/images/comp2.png", "Computer", 40, 190 | 50, "Physics"), 191 | imageHolder( 192 | "assets/images/quiz3.png", "Quiz", 80, 55, "Chemistry") 193 | ], 194 | ) 195 | ], 196 | ), 197 | ), 198 | ) 199 | ], 200 | ), 201 | )); 202 | } 203 | } 204 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | archive: 5 | dependency: transitive 6 | description: 7 | name: archive 8 | url: "https://pub.dartlang.org" 9 | source: hosted 10 | version: "2.0.11" 11 | args: 12 | dependency: transitive 13 | description: 14 | name: args 15 | url: "https://pub.dartlang.org" 16 | source: hosted 17 | version: "1.5.2" 18 | async: 19 | dependency: transitive 20 | description: 21 | name: async 22 | url: "https://pub.dartlang.org" 23 | source: hosted 24 | version: "2.4.0" 25 | boolean_selector: 26 | dependency: transitive 27 | description: 28 | name: boolean_selector 29 | url: "https://pub.dartlang.org" 30 | source: hosted 31 | version: "1.0.5" 32 | charcode: 33 | dependency: transitive 34 | description: 35 | name: charcode 36 | url: "https://pub.dartlang.org" 37 | source: hosted 38 | version: "1.1.2" 39 | collection: 40 | dependency: transitive 41 | description: 42 | name: collection 43 | url: "https://pub.dartlang.org" 44 | source: hosted 45 | version: "1.14.11" 46 | convert: 47 | dependency: transitive 48 | description: 49 | name: convert 50 | url: "https://pub.dartlang.org" 51 | source: hosted 52 | version: "2.1.1" 53 | crypto: 54 | dependency: transitive 55 | description: 56 | name: crypto 57 | url: "https://pub.dartlang.org" 58 | source: hosted 59 | version: "2.1.3" 60 | cupertino_icons: 61 | dependency: "direct main" 62 | description: 63 | name: cupertino_icons 64 | url: "https://pub.dartlang.org" 65 | source: hosted 66 | version: "0.1.3" 67 | flutter: 68 | dependency: "direct main" 69 | description: flutter 70 | source: sdk 71 | version: "0.0.0" 72 | flutter_dotenv: 73 | dependency: "direct main" 74 | description: 75 | name: flutter_dotenv 76 | url: "https://pub.dartlang.org" 77 | source: hosted 78 | version: "2.1.0" 79 | flutter_launcher_icons: 80 | dependency: "direct dev" 81 | description: 82 | name: flutter_launcher_icons 83 | url: "https://pub.dartlang.org" 84 | source: hosted 85 | version: "0.7.4" 86 | flutter_test: 87 | dependency: "direct dev" 88 | description: flutter 89 | source: sdk 90 | version: "0.0.0" 91 | flutter_web_plugins: 92 | dependency: transitive 93 | description: flutter 94 | source: sdk 95 | version: "0.0.0" 96 | google_fonts: 97 | dependency: "direct dev" 98 | description: 99 | name: google_fonts 100 | url: "https://pub.dartlang.org" 101 | source: hosted 102 | version: "0.5.0+1" 103 | http: 104 | dependency: "direct main" 105 | description: 106 | name: http 107 | url: "https://pub.dartlang.org" 108 | source: hosted 109 | version: "0.12.0+4" 110 | http_parser: 111 | dependency: transitive 112 | description: 113 | name: http_parser 114 | url: "https://pub.dartlang.org" 115 | source: hosted 116 | version: "3.1.4" 117 | image: 118 | dependency: transitive 119 | description: 120 | name: image 121 | url: "https://pub.dartlang.org" 122 | source: hosted 123 | version: "2.1.4" 124 | matcher: 125 | dependency: transitive 126 | description: 127 | name: matcher 128 | url: "https://pub.dartlang.org" 129 | source: hosted 130 | version: "0.12.6" 131 | meta: 132 | dependency: transitive 133 | description: 134 | name: meta 135 | url: "https://pub.dartlang.org" 136 | source: hosted 137 | version: "1.1.8" 138 | path: 139 | dependency: transitive 140 | description: 141 | name: path 142 | url: "https://pub.dartlang.org" 143 | source: hosted 144 | version: "1.6.4" 145 | path_provider: 146 | dependency: transitive 147 | description: 148 | name: path_provider 149 | url: "https://pub.dartlang.org" 150 | source: hosted 151 | version: "1.6.5" 152 | path_provider_macos: 153 | dependency: transitive 154 | description: 155 | name: path_provider_macos 156 | url: "https://pub.dartlang.org" 157 | source: hosted 158 | version: "0.0.4" 159 | path_provider_platform_interface: 160 | dependency: transitive 161 | description: 162 | name: path_provider_platform_interface 163 | url: "https://pub.dartlang.org" 164 | source: hosted 165 | version: "1.0.1" 166 | pedantic: 167 | dependency: transitive 168 | description: 169 | name: pedantic 170 | url: "https://pub.dartlang.org" 171 | source: hosted 172 | version: "1.8.0+1" 173 | petitparser: 174 | dependency: transitive 175 | description: 176 | name: petitparser 177 | url: "https://pub.dartlang.org" 178 | source: hosted 179 | version: "2.4.0" 180 | platform: 181 | dependency: transitive 182 | description: 183 | name: platform 184 | url: "https://pub.dartlang.org" 185 | source: hosted 186 | version: "2.2.1" 187 | plugin_platform_interface: 188 | dependency: transitive 189 | description: 190 | name: plugin_platform_interface 191 | url: "https://pub.dartlang.org" 192 | source: hosted 193 | version: "1.0.2" 194 | quiver: 195 | dependency: transitive 196 | description: 197 | name: quiver 198 | url: "https://pub.dartlang.org" 199 | source: hosted 200 | version: "2.0.5" 201 | shared_preferences: 202 | dependency: "direct main" 203 | description: 204 | name: shared_preferences 205 | url: "https://pub.dartlang.org" 206 | source: hosted 207 | version: "0.5.6+3" 208 | shared_preferences_macos: 209 | dependency: transitive 210 | description: 211 | name: shared_preferences_macos 212 | url: "https://pub.dartlang.org" 213 | source: hosted 214 | version: "0.0.1+6" 215 | shared_preferences_platform_interface: 216 | dependency: transitive 217 | description: 218 | name: shared_preferences_platform_interface 219 | url: "https://pub.dartlang.org" 220 | source: hosted 221 | version: "1.0.3" 222 | shared_preferences_web: 223 | dependency: transitive 224 | description: 225 | name: shared_preferences_web 226 | url: "https://pub.dartlang.org" 227 | source: hosted 228 | version: "0.1.2+4" 229 | sky_engine: 230 | dependency: transitive 231 | description: flutter 232 | source: sdk 233 | version: "0.0.99" 234 | source_span: 235 | dependency: transitive 236 | description: 237 | name: source_span 238 | url: "https://pub.dartlang.org" 239 | source: hosted 240 | version: "1.5.5" 241 | stack_trace: 242 | dependency: transitive 243 | description: 244 | name: stack_trace 245 | url: "https://pub.dartlang.org" 246 | source: hosted 247 | version: "1.9.3" 248 | stream_channel: 249 | dependency: transitive 250 | description: 251 | name: stream_channel 252 | url: "https://pub.dartlang.org" 253 | source: hosted 254 | version: "2.0.0" 255 | string_scanner: 256 | dependency: transitive 257 | description: 258 | name: string_scanner 259 | url: "https://pub.dartlang.org" 260 | source: hosted 261 | version: "1.0.5" 262 | term_glyph: 263 | dependency: transitive 264 | description: 265 | name: term_glyph 266 | url: "https://pub.dartlang.org" 267 | source: hosted 268 | version: "1.1.0" 269 | test_api: 270 | dependency: transitive 271 | description: 272 | name: test_api 273 | url: "https://pub.dartlang.org" 274 | source: hosted 275 | version: "0.2.11" 276 | typed_data: 277 | dependency: transitive 278 | description: 279 | name: typed_data 280 | url: "https://pub.dartlang.org" 281 | source: hosted 282 | version: "1.1.6" 283 | vector_math: 284 | dependency: transitive 285 | description: 286 | name: vector_math 287 | url: "https://pub.dartlang.org" 288 | source: hosted 289 | version: "2.0.8" 290 | xml: 291 | dependency: transitive 292 | description: 293 | name: xml 294 | url: "https://pub.dartlang.org" 295 | source: hosted 296 | version: "3.5.0" 297 | yaml: 298 | dependency: transitive 299 | description: 300 | name: yaml 301 | url: "https://pub.dartlang.org" 302 | source: hosted 303 | version: "2.2.0" 304 | sdks: 305 | dart: ">=2.4.0 <3.0.0" 306 | flutter: ">=1.12.13+hotfix.4 <2.0.0" 307 | -------------------------------------------------------------------------------- /lib/auth/login.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:http/http.dart' as http; 3 | import 'dart:convert'; 4 | import 'package:shared_preferences/shared_preferences.dart'; 5 | import '../screen/home.dart'; 6 | 7 | 8 | class Login extends StatefulWidget { 9 | @override 10 | _LoginState createState() => _LoginState(); 11 | } 12 | 13 | class _LoginState extends State { 14 | SharedPreferences sharedPreferences; 15 | bool _isLoading = false; 16 | var _obscureText = true; 17 | final _loginFormKey = GlobalKey(); 18 | final _scaffoldKey = GlobalKey(); 19 | 20 | TextEditingController email = new TextEditingController(); 21 | TextEditingController password = new TextEditingController(); 22 | 23 | signIn(String email, String password) async { 24 | sharedPreferences = await SharedPreferences.getInstance(); 25 | Map data = {"email": email, "password": password}; 26 | var response = await http.post("https://auth1234.herokuapp.com/auth/login", 27 | body: data); 28 | var getData = json.decode(response.body); 29 | if (getData["token"] != null) { 30 | sharedPreferences.setString("token", getData['token']); 31 | Navigator.of(context).pushAndRemoveUntil( 32 | MaterialPageRoute(builder: (BuildContext context) => Home()), 33 | (Route route) => false); 34 | } else { 35 | setState(() { 36 | _isLoading = false; 37 | }); 38 | _scaffoldKey.currentState.showSnackBar(new SnackBar( 39 | content: new Text("Emaill and Password didn't matched"), 40 | backgroundColor: Colors.red, 41 | )); 42 | } 43 | } 44 | 45 | Widget inputText(String text, var handler) { 46 | return Container( 47 | margin: const EdgeInsets.fromLTRB(10, 10, 10, 0), 48 | child: TextFormField( 49 | validator: (String value) { 50 | if (text == "Email") { 51 | return !value.contains("@") || !value.endsWith(".com") 52 | ? "Please enter a valid email address" 53 | : null; 54 | } else { 55 | return value.isEmpty ? "Please enter Password" : null; 56 | } 57 | }, 58 | controller: handler, 59 | keyboardType: 60 | text == "Email" ? TextInputType.emailAddress : TextInputType.text, 61 | obscureText: text == "Password" ? _obscureText : false, 62 | decoration: InputDecoration( 63 | prefixIcon: Icon( 64 | text == "Email" ? Icons.email : Icons.lock, 65 | color: Colors.green, 66 | ), 67 | suffixIcon: _obscureText && text == "Password" 68 | ? IconButton( 69 | icon: Icon( 70 | Icons.visibility, 71 | color: Colors.grey, 72 | ), 73 | onPressed: () { 74 | setState(() { 75 | _obscureText = !_obscureText; 76 | }); 77 | }, 78 | ) 79 | : !_obscureText && text == "Password" 80 | ? IconButton( 81 | icon: Icon( 82 | Icons.visibility_off, 83 | color: Colors.grey, 84 | ), 85 | onPressed: () { 86 | setState(() { 87 | _obscureText = !_obscureText; 88 | }); 89 | }, 90 | ) 91 | : null, 92 | labelText: text, 93 | labelStyle: TextStyle(color: Colors.green), 94 | focusedBorder: new UnderlineInputBorder( 95 | borderSide: BorderSide(color: Colors.green)))), 96 | ); 97 | } 98 | 99 | checkLoginStatus() async { 100 | sharedPreferences = await SharedPreferences.getInstance(); 101 | if (sharedPreferences.getString("token") != null) { 102 | Navigator.of(context).pushAndRemoveUntil( 103 | MaterialPageRoute(builder: (BuildContext context) => Home()), 104 | (Route route) => false); 105 | } 106 | } 107 | 108 | void initState() { 109 | super.initState(); 110 | checkLoginStatus(); 111 | } 112 | 113 | @override 114 | Widget build(BuildContext context) { 115 | var ht = MediaQuery.of(context).size.height; 116 | return Scaffold( 117 | key: _scaffoldKey, 118 | // resizeToAvoidBottomInset: false, 119 | body: _isLoading 120 | ? Center( 121 | child: CircularProgressIndicator(), 122 | ) 123 | : SingleChildScrollView( 124 | child: Stack( 125 | children: [ 126 | Container( 127 | // child: Image.asset("assets/images/background.png"), 128 | height: MediaQuery.of(context).size.height, 129 | color: Colors.grey[200], 130 | child: ListView( 131 | children:[ 132 | Container( 133 | height:(MediaQuery.of(context).size.height)/2.6, 134 | decoration: BoxDecoration( 135 | color: Colors.green[300], 136 | borderRadius: new BorderRadius.only( 137 | bottomLeft: const Radius.circular(40), 138 | bottomRight: const Radius.circular(40)) 139 | ), 140 | ) 141 | ] 142 | ) 143 | 144 | ), 145 | Center(child: 146 | Container( 147 | margin: EdgeInsets.only(top:70), 148 | height:150, 149 | child: Column(children: [ 150 | Image.asset("assets/images/headIcon2.png",height: 90,), 151 | Container( 152 | margin: const EdgeInsets.only(top:10), 153 | child: Text("GURU",style: TextStyle(fontSize: 30,color: Colors.blue[900],fontWeight:FontWeight.w500),)) 154 | ],) 155 | ) 156 | ), 157 | Center( 158 | child: Container( 159 | height: 370, 160 | width: 290, 161 | margin: new EdgeInsets.only(top: ht / 3), 162 | decoration: BoxDecoration( 163 | boxShadow: [BoxShadow( 164 | color:Colors.grey, 165 | offset: Offset(0.0,3.0), 166 | blurRadius: 7.0 167 | )], 168 | color: Colors.white, 169 | borderRadius: new BorderRadius.only( 170 | topLeft: const Radius.circular(100), 171 | topRight: const Radius.circular(5), 172 | bottomLeft: const Radius.circular(10), 173 | bottomRight: const Radius.circular(5))), 174 | child: ListView( 175 | children: [ 176 | Center( 177 | child: Container( 178 | margin: const EdgeInsets.only(top: 18), 179 | child: Text( 180 | "LOGIN", 181 | style: TextStyle( 182 | color: Colors.black38, 183 | fontWeight: FontWeight.w500, 184 | fontSize: 18), 185 | ), 186 | ), 187 | ), 188 | Form( 189 | key: _loginFormKey, 190 | child: Container( 191 | margin: const EdgeInsets.only(top: 15), 192 | child: Column( 193 | children: [ 194 | inputText("Email", email), 195 | inputText("Password", password), 196 | ], 197 | )), 198 | ), 199 | Container( 200 | margin: const EdgeInsets.only(top: 65), 201 | child: Row( 202 | mainAxisAlignment: 203 | MainAxisAlignment.spaceAround, 204 | children: [ 205 | MaterialButton( 206 | child: Text("Don't have an account?", 207 | style: TextStyle( 208 | color: Colors.blue, 209 | fontSize: 10)), 210 | onPressed: () { 211 | Navigator.pushNamed( 212 | context, "/register"); 213 | }, 214 | ), 215 | MaterialButton( 216 | color: Colors.green[400], 217 | shape: RoundedRectangleBorder( 218 | borderRadius: new BorderRadius.only( 219 | topLeft: 220 | const Radius.circular(100), 221 | topRight: 222 | const Radius.circular(5), 223 | bottomLeft: 224 | const Radius.circular(10), 225 | bottomRight: 226 | const Radius.circular(5))), 227 | child: Text( 228 | " Login", 229 | style: TextStyle( 230 | color: Colors.grey[200]), 231 | ), 232 | onPressed: () { 233 | if (_loginFormKey.currentState 234 | .validate()) { 235 | setState(() { 236 | _isLoading = true; 237 | }); 238 | signIn(email.text, password.text); 239 | } 240 | }) 241 | ], 242 | )) 243 | ], 244 | ), 245 | ), 246 | ), 247 | ], 248 | ), 249 | )); 250 | } 251 | } -------------------------------------------------------------------------------- /lib/auth/register.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:http/http.dart' as http; 3 | import 'dart:convert'; 4 | import 'package:shared_preferences/shared_preferences.dart'; 5 | import '../screen/home.dart'; 6 | 7 | class Register extends StatefulWidget { 8 | @override 9 | _RegisterState createState() => _RegisterState(); 10 | } 11 | 12 | class _RegisterState extends State { 13 | TextEditingController email = new TextEditingController(); 14 | TextEditingController password = new TextEditingController(); 15 | TextEditingController cPassword = new TextEditingController(); 16 | TextEditingController userName = new TextEditingController(); 17 | 18 | final _registerFormKey = GlobalKey(); 19 | 20 | bool _obscureTextC = true; 21 | bool _obscureText = true; 22 | bool _isLoading = false; 23 | 24 | final _scaffoldKey = GlobalKey(); 25 | 26 | register(String email, String password, String name) async { 27 | SharedPreferences sharedPreferences = await SharedPreferences.getInstance(); 28 | Map data = {"email": email, "password": password, "name": name}; 29 | var response = await http 30 | .post("https://auth1234.herokuapp.com/auth/register", body: data); 31 | var getData = json.decode(response.body); 32 | if (getData["token"] != null) { 33 | sharedPreferences.setString("token", getData['token']); 34 | Navigator.of(context).pushAndRemoveUntil( 35 | MaterialPageRoute(builder: (BuildContext context) => Home()), 36 | (Route route) => false); 37 | } 38 | } 39 | 40 | Widget inputText(String text, var handler, var pIcon) { 41 | return Container( 42 | margin: const EdgeInsets.fromLTRB(10, 5, 10, 0), 43 | child: TextFormField( 44 | obscureText: text == "Password" 45 | ? _obscureText 46 | : text == "Confirm Password" ? _obscureTextC : false, 47 | controller: handler, 48 | validator: (String value) { 49 | if (text == "Email") { 50 | return !value.contains("@") || !value.endsWith(".com") 51 | ? "Please enter valid email address" 52 | : null; 53 | } else if (text == "Username") { 54 | return value.isEmpty ? "Please enter some text" : null; 55 | } else { 56 | return value.length < 6 ? "Password too short" : null; 57 | } 58 | }, 59 | decoration: InputDecoration( 60 | suffixIcon: _obscureText && text == "Password" 61 | ? IconButton( 62 | icon: Icon(Icons.visibility, color: Colors.grey), 63 | onPressed: () { 64 | setState(() { 65 | _obscureText = !_obscureText; 66 | }); 67 | }) 68 | : _obscureTextC && text == "Confirm Password" 69 | ? IconButton( 70 | icon: Icon(Icons.visibility, color: Colors.grey), 71 | onPressed: () { 72 | setState(() { 73 | _obscureTextC = !_obscureTextC; 74 | }); 75 | }, 76 | ) 77 | : !_obscureText && text == "Password" 78 | ? IconButton( 79 | icon: 80 | Icon(Icons.visibility_off, color: Colors.grey), 81 | onPressed: () { 82 | setState(() { 83 | _obscureText = !_obscureText; 84 | }); 85 | }) 86 | : !_obscureTextC && text == "Confirm Password" 87 | ? IconButton( 88 | icon: Icon(Icons.visibility_off, 89 | color: Colors.grey), 90 | onPressed: () { 91 | setState(() { 92 | _obscureTextC = !_obscureTextC; 93 | }); 94 | }, 95 | ) 96 | : null, 97 | prefixIcon: Icon( 98 | pIcon, 99 | color: Colors.green, 100 | ), 101 | labelText: text, 102 | labelStyle: TextStyle(color: Colors.green), 103 | focusedBorder: new UnderlineInputBorder( 104 | borderSide: new BorderSide(color: Colors.green))), 105 | ), 106 | ); 107 | } 108 | 109 | @override 110 | Widget build(BuildContext context) { 111 | var ht = MediaQuery.of(context).size.height; 112 | return Scaffold( 113 | key: _scaffoldKey, 114 | // resizeToAvoidBottomInset: false, 115 | body: _isLoading 116 | ? Center( 117 | child: CircularProgressIndicator(), 118 | ) 119 | : SingleChildScrollView( 120 | child: Stack( 121 | children: [ 122 | Container( 123 | height: MediaQuery.of(context).size.height, 124 | color: Colors.grey[200], 125 | child: ListView( 126 | children:[ 127 | Container( 128 | height:(MediaQuery.of(context).size.height)/2.6, 129 | decoration: BoxDecoration( 130 | color: Colors.green[300], 131 | borderRadius: new BorderRadius.only( 132 | bottomLeft: const Radius.circular(40), 133 | bottomRight: const Radius.circular(40)) 134 | ), 135 | ) 136 | ] 137 | ) 138 | ), 139 | Center(child: 140 | Container( 141 | margin: EdgeInsets.only(top:70), 142 | height:150, 143 | child: Column(children: [ 144 | Image.asset("assets/images/headIcon2.png",height: 90,), 145 | Container( 146 | margin: const EdgeInsets.only(top:10), 147 | child: Text("GURU",style: TextStyle(fontSize: 30,color: Colors.blue[900],fontWeight: FontWeight.w500),)) 148 | ],) 149 | ) 150 | ), 151 | Center( 152 | child: Container( 153 | height: 450, 154 | width: 290, 155 | margin: new EdgeInsets.only(top: ht / 3.3), 156 | decoration: BoxDecoration( 157 | boxShadow: [BoxShadow( 158 | color:Colors.grey, 159 | offset: Offset(0.0,3.0), 160 | blurRadius: 7.0 161 | )], 162 | color: Colors.white, 163 | borderRadius: new BorderRadius.only( 164 | topLeft: const Radius.circular(100), 165 | topRight: const Radius.circular(5), 166 | bottomLeft: const Radius.circular(10), 167 | bottomRight: const Radius.circular(5))), 168 | child: ListView( 169 | children: [ 170 | Center( 171 | child: Container( 172 | margin: const EdgeInsets.only(top: 18), 173 | child: Text( 174 | "REGISTER", 175 | style: TextStyle( 176 | color: Colors.black38, 177 | fontWeight: FontWeight.w500, 178 | fontSize: 18), 179 | ), 180 | ), 181 | ), 182 | Form( 183 | key: _registerFormKey, 184 | child: Container( 185 | margin: const EdgeInsets.only(top: 35), 186 | child: Column( 187 | children: [ 188 | inputText( 189 | "Username", userName, Icons.person), 190 | inputText("Email", email, Icons.email), 191 | inputText("Password", password, Icons.lock), 192 | inputText("Confirm Password", cPassword, 193 | Icons.lock), 194 | ], 195 | )), 196 | ), 197 | Column( 198 | children: [ 199 | Container( 200 | margin: 201 | const EdgeInsets.fromLTRB(160, 20, 0, 0), 202 | child: MaterialButton( 203 | color: Colors.green[400], 204 | shape: RoundedRectangleBorder( 205 | borderRadius: new BorderRadius.only( 206 | topLeft: const Radius.circular(100), 207 | topRight: const Radius.circular(5), 208 | bottomLeft: 209 | const Radius.circular(10), 210 | bottomRight: 211 | const Radius.circular(5))), 212 | child: Text( 213 | "Register", 214 | style: TextStyle(color: Colors.grey[200]), 215 | ), 216 | onPressed: () { 217 | if (password.text.isNotEmpty && 218 | cPassword.text.isNotEmpty && 219 | password.text != cPassword.text) { 220 | _scaffoldKey.currentState 221 | .showSnackBar(new SnackBar( 222 | content: new Text( 223 | "Password didn't matched"), 224 | backgroundColor: Colors.red, 225 | )); 226 | password.text = ""; 227 | cPassword.text = ""; 228 | } else if (_registerFormKey.currentState 229 | .validate()) { 230 | setState(() { 231 | _isLoading = true; 232 | }); 233 | register(email.text, password.text, 234 | userName.text); 235 | } 236 | }), 237 | ) 238 | ], 239 | ) 240 | ], 241 | ), 242 | ), 243 | ) 244 | ], 245 | ), 246 | ), 247 | ); 248 | } 249 | } 250 | -------------------------------------------------------------------------------- /lib/screen/mcq.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import '../utils/getQuestion.dart'; 3 | import 'result.dart'; 4 | import 'home.dart'; 5 | 6 | class Mcq extends StatefulWidget { 7 | final sub; 8 | Mcq(this.sub); 9 | @override 10 | _McqState createState() => _McqState(); 11 | } 12 | 13 | class _McqState extends State { 14 | var subject; 15 | var questionList; 16 | int qCount = 0; 17 | int score = 0; 18 | String answer; 19 | bool check1 = false; 20 | bool check2 = false; 21 | bool check3 = false; 22 | bool check4 = false; 23 | bool answered = false; 24 | bool completed = false; 25 | 26 | checkAnswer() { 27 | if (completed) { 28 | Navigator.of(context).pushAndRemoveUntil( 29 | MaterialPageRoute(builder: (BuildContext context) => Home()), 30 | (Route route) => false); 31 | }else{ 32 | if (qCount < 15) { 33 | if (answer.toLowerCase() == 34 | questionList[qCount].correctAnswer.toLowerCase()) { 35 | setState(() { 36 | score++; 37 | qCount++; 38 | check1 = check2 = check3 = check4 = false; 39 | }); 40 | } else { 41 | setState(() { 42 | qCount++; 43 | check1 = check2 = check3 = check4 = false; 44 | }); 45 | } 46 | } 47 | if (qCount == 15) { 48 | if (answer.toLowerCase() == 49 | questionList[qCount].correctAnswer.toLowerCase()) { 50 | setState(() { 51 | qCount=14; 52 | score++; 53 | completed = true; 54 | }); 55 | } 56 | setState(() { 57 | qCount=14; 58 | completed = true; 59 | }); 60 | }} 61 | } 62 | 63 | toggleCheckBox(int n, String ans) { 64 | setState(() { 65 | switch (n) { 66 | case 1: 67 | if (check1 == false) { 68 | check1 = true; 69 | check2 = false; 70 | check3 = false; 71 | check4 = false; 72 | answer = ans; 73 | } else { 74 | check1 = false; 75 | } 76 | break; 77 | case 2: 78 | if (check2 == false) { 79 | check2 = true; 80 | check1 = false; 81 | check3 = false; 82 | check4 = false; 83 | answer = ans; 84 | } else { 85 | check2 = false; 86 | } 87 | break; 88 | case 3: 89 | if (check3 == false) { 90 | check3 = true; 91 | check2 = false; 92 | check1 = false; 93 | check4 = false; 94 | answer = ans; 95 | } else { 96 | check3 = false; 97 | } 98 | break; 99 | default: 100 | if (check4 == false) { 101 | check4 = true; 102 | check2 = false; 103 | check3 = false; 104 | check1 = false; 105 | answer = ans; 106 | } else { 107 | check4 = false; 108 | } 109 | } 110 | if (check1 || check2 || check3 || check4) { 111 | answered = true; 112 | } else { 113 | answered = false; 114 | } 115 | }); 116 | } 117 | 118 | Widget optionHolder(String option, int n, bool check) { 119 | return Row( 120 | children: [ 121 | Checkbox( 122 | value: check, 123 | onChanged: (value) { 124 | toggleCheckBox(n, option); 125 | }, 126 | activeColor: Colors.green, 127 | ), 128 | Flexible( 129 | child: Text(option), 130 | ) 131 | ], 132 | ); 133 | } 134 | 135 | @override 136 | void initState() { 137 | super.initState(); 138 | subject = widget.sub; 139 | getQuestion(subject).then((result) { 140 | setState(() { 141 | result.shuffle(); 142 | questionList = result; 143 | }); 144 | }); 145 | } 146 | 147 | @override 148 | Widget build(BuildContext context) { 149 | var ht = MediaQuery.of(context).size.height; 150 | return Scaffold( 151 | body: SingleChildScrollView( 152 | child: Stack( 153 | children: [ 154 | Container( 155 | height: MediaQuery.of(context).size.height, 156 | color: Colors.grey[200], 157 | child: ListView(children: [ 158 | Container( 159 | height: (MediaQuery.of(context).size.height) / 2.6, 160 | decoration: BoxDecoration( 161 | color: Colors.green[300], 162 | borderRadius: new BorderRadius.only( 163 | bottomLeft: const Radius.circular(40), 164 | bottomRight: const Radius.circular(40))), 165 | ) 166 | ])), 167 | Center( 168 | child: Container( 169 | margin: EdgeInsets.only(top: 70), 170 | height: 150, 171 | child: Column( 172 | children: [ 173 | Image.asset( 174 | "assets/images/headIcon2.png", 175 | height: 90, 176 | ), 177 | Container( 178 | margin: const EdgeInsets.only(top: 10), 179 | child: Text( 180 | "GURU", 181 | style: TextStyle( 182 | fontSize: 30, color: Colors.blue[900],fontWeight: FontWeight.w500), 183 | )) 184 | ], 185 | ))), 186 | Center( 187 | child: Container( 188 | height: 450, 189 | width: 290, 190 | margin: new EdgeInsets.only(top: ht / 3.3), 191 | decoration: BoxDecoration( 192 | boxShadow: [ 193 | BoxShadow( 194 | color: Colors.grey, 195 | offset: Offset(0.0, 3.0), 196 | blurRadius: 7.0) 197 | ], 198 | color: Colors.white, 199 | borderRadius: new BorderRadius.only( 200 | topLeft: const Radius.circular(100), 201 | topRight: const Radius.circular(5), 202 | bottomLeft: const Radius.circular(10), 203 | bottomRight: const Radius.circular(5))), 204 | child: Column( 205 | children: [ 206 | Center( 207 | child: Container( 208 | margin: const EdgeInsets.only(bottom: 15, top: 35), 209 | child: Text( 210 | (qCount+1 ).toString() + " /15", 211 | style: TextStyle(fontSize: 18), 212 | ))), 213 | Divider( 214 | thickness: 2, 215 | color: Colors.black12, 216 | indent: 50, 217 | endIndent: 25, 218 | ), 219 | Container( 220 | alignment: Alignment.center, 221 | child: Container( 222 | height: 270, 223 | width: 230, 224 | margin: new EdgeInsets.only(top: 35), 225 | decoration: BoxDecoration( 226 | border: Border.all( 227 | width: 1.5, color: Colors.green[400]), 228 | color: Colors.white, 229 | borderRadius: new BorderRadius.only( 230 | topLeft: const Radius.circular(70), 231 | topRight: const Radius.circular(5), 232 | bottomLeft: const Radius.circular(10), 233 | bottomRight: const Radius.circular(5))), 234 | child: questionList == null 235 | ? Center(child: CircularProgressIndicator()) 236 | : completed 237 | ? Result(questionList, score) 238 | : Container( 239 | alignment: Alignment.topCenter, 240 | child: Container( 241 | alignment: Alignment.center, 242 | margin: const EdgeInsets.only(top: 20), 243 | height: 270, 244 | width: 190, 245 | child: ListView( 246 | padding: EdgeInsets.zero, 247 | children: [ 248 | Container( 249 | margin: const EdgeInsets.only( 250 | bottom: 5), 251 | child: Text( 252 | questionList[qCount].que, 253 | style: TextStyle( 254 | color: Colors.black54, 255 | fontSize: 15), 256 | ), 257 | ), 258 | Divider( 259 | thickness: 2, 260 | color: Colors.black12, 261 | indent: 10, 262 | endIndent: 10, 263 | ), 264 | Container( 265 | alignment: Alignment.centerLeft, 266 | child: Column( 267 | crossAxisAlignment: 268 | CrossAxisAlignment.start, 269 | children: [ 270 | optionHolder( 271 | questionList[qCount] 272 | .option1, 273 | 1, 274 | check1), 275 | optionHolder( 276 | questionList[qCount] 277 | .option2, 278 | 2, 279 | check2), 280 | optionHolder( 281 | questionList[qCount] 282 | .option3, 283 | 3, 284 | check3), 285 | optionHolder( 286 | questionList[qCount] 287 | .option4, 288 | 4, 289 | check4), 290 | ], 291 | ), 292 | ) 293 | ], 294 | ), 295 | ), 296 | )), 297 | ), 298 | Row( 299 | children: [ 300 | Spacer(flex: 1), 301 | RichText( 302 | text: TextSpan(children: [ 303 | TextSpan( 304 | text: " Score : ", 305 | style: TextStyle( 306 | color: Colors.green, 307 | fontWeight: FontWeight.w600, 308 | fontSize: 20)), 309 | TextSpan( 310 | text: score.toString(), 311 | style: TextStyle( 312 | color: Colors.blueGrey, fontSize: 20)) 313 | ]), 314 | ), 315 | Spacer(flex: 1), 316 | Container( 317 | margin: const EdgeInsets.only(top: 5), 318 | child: IconButton( 319 | icon: Icon(Icons.arrow_forward, 320 | color: answered ? Colors.green : Colors.grey), 321 | onPressed: () { 322 | if (answered) { 323 | checkAnswer(); 324 | } 325 | }, 326 | ), 327 | ), 328 | ], 329 | ), 330 | ], 331 | ), 332 | ), 333 | ) 334 | ], 335 | ), 336 | )); 337 | } 338 | } 339 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 11 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 12 | 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; 13 | 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 14 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 15 | 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; 16 | 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 17 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 18 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 19 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 20 | /* End PBXBuildFile section */ 21 | 22 | /* Begin PBXCopyFilesBuildPhase section */ 23 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 24 | isa = PBXCopyFilesBuildPhase; 25 | buildActionMask = 2147483647; 26 | dstPath = ""; 27 | dstSubfolderSpec = 10; 28 | files = ( 29 | 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, 30 | 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, 31 | ); 32 | name = "Embed Frameworks"; 33 | runOnlyForDeploymentPostprocessing = 0; 34 | }; 35 | /* End PBXCopyFilesBuildPhase section */ 36 | 37 | /* Begin PBXFileReference section */ 38 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 39 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 40 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 41 | 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; 42 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 43 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 44 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 45 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 46 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 47 | 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; }; 48 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 49 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 50 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 51 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 52 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 53 | /* End PBXFileReference section */ 54 | 55 | /* Begin PBXFrameworksBuildPhase section */ 56 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 57 | isa = PBXFrameworksBuildPhase; 58 | buildActionMask = 2147483647; 59 | files = ( 60 | 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, 61 | 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, 62 | ); 63 | runOnlyForDeploymentPostprocessing = 0; 64 | }; 65 | /* End PBXFrameworksBuildPhase section */ 66 | 67 | /* Begin PBXGroup section */ 68 | 9740EEB11CF90186004384FC /* Flutter */ = { 69 | isa = PBXGroup; 70 | children = ( 71 | 3B80C3931E831B6300D905FE /* App.framework */, 72 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 73 | 9740EEBA1CF902C7004384FC /* Flutter.framework */, 74 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 75 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 76 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 77 | ); 78 | name = Flutter; 79 | sourceTree = ""; 80 | }; 81 | 97C146E51CF9000F007C117D = { 82 | isa = PBXGroup; 83 | children = ( 84 | 9740EEB11CF90186004384FC /* Flutter */, 85 | 97C146F01CF9000F007C117D /* Runner */, 86 | 97C146EF1CF9000F007C117D /* Products */, 87 | ); 88 | sourceTree = ""; 89 | }; 90 | 97C146EF1CF9000F007C117D /* Products */ = { 91 | isa = PBXGroup; 92 | children = ( 93 | 97C146EE1CF9000F007C117D /* Runner.app */, 94 | ); 95 | name = Products; 96 | sourceTree = ""; 97 | }; 98 | 97C146F01CF9000F007C117D /* Runner */ = { 99 | isa = PBXGroup; 100 | children = ( 101 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 102 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 103 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 104 | 97C147021CF9000F007C117D /* Info.plist */, 105 | 97C146F11CF9000F007C117D /* Supporting Files */, 106 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 107 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 108 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 109 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, 110 | ); 111 | path = Runner; 112 | sourceTree = ""; 113 | }; 114 | 97C146F11CF9000F007C117D /* Supporting Files */ = { 115 | isa = PBXGroup; 116 | children = ( 117 | ); 118 | name = "Supporting Files"; 119 | sourceTree = ""; 120 | }; 121 | /* End PBXGroup section */ 122 | 123 | /* Begin PBXNativeTarget section */ 124 | 97C146ED1CF9000F007C117D /* Runner */ = { 125 | isa = PBXNativeTarget; 126 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 127 | buildPhases = ( 128 | 9740EEB61CF901F6004384FC /* Run Script */, 129 | 97C146EA1CF9000F007C117D /* Sources */, 130 | 97C146EB1CF9000F007C117D /* Frameworks */, 131 | 97C146EC1CF9000F007C117D /* Resources */, 132 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 133 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 134 | ); 135 | buildRules = ( 136 | ); 137 | dependencies = ( 138 | ); 139 | name = Runner; 140 | productName = Runner; 141 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 142 | productType = "com.apple.product-type.application"; 143 | }; 144 | /* End PBXNativeTarget section */ 145 | 146 | /* Begin PBXProject section */ 147 | 97C146E61CF9000F007C117D /* Project object */ = { 148 | isa = PBXProject; 149 | attributes = { 150 | LastUpgradeCheck = 1020; 151 | ORGANIZATIONNAME = "The Chromium Authors"; 152 | TargetAttributes = { 153 | 97C146ED1CF9000F007C117D = { 154 | CreatedOnToolsVersion = 7.3.1; 155 | LastSwiftMigration = 1100; 156 | }; 157 | }; 158 | }; 159 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 160 | compatibilityVersion = "Xcode 3.2"; 161 | developmentRegion = en; 162 | hasScannedForEncodings = 0; 163 | knownRegions = ( 164 | en, 165 | Base, 166 | ); 167 | mainGroup = 97C146E51CF9000F007C117D; 168 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 169 | projectDirPath = ""; 170 | projectRoot = ""; 171 | targets = ( 172 | 97C146ED1CF9000F007C117D /* Runner */, 173 | ); 174 | }; 175 | /* End PBXProject section */ 176 | 177 | /* Begin PBXResourcesBuildPhase section */ 178 | 97C146EC1CF9000F007C117D /* Resources */ = { 179 | isa = PBXResourcesBuildPhase; 180 | buildActionMask = 2147483647; 181 | files = ( 182 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 183 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 184 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 185 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 186 | ); 187 | runOnlyForDeploymentPostprocessing = 0; 188 | }; 189 | /* End PBXResourcesBuildPhase section */ 190 | 191 | /* Begin PBXShellScriptBuildPhase section */ 192 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 193 | isa = PBXShellScriptBuildPhase; 194 | buildActionMask = 2147483647; 195 | files = ( 196 | ); 197 | inputPaths = ( 198 | ); 199 | name = "Thin Binary"; 200 | outputPaths = ( 201 | ); 202 | runOnlyForDeploymentPostprocessing = 0; 203 | shellPath = /bin/sh; 204 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; 205 | }; 206 | 9740EEB61CF901F6004384FC /* Run Script */ = { 207 | isa = PBXShellScriptBuildPhase; 208 | buildActionMask = 2147483647; 209 | files = ( 210 | ); 211 | inputPaths = ( 212 | ); 213 | name = "Run Script"; 214 | outputPaths = ( 215 | ); 216 | runOnlyForDeploymentPostprocessing = 0; 217 | shellPath = /bin/sh; 218 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 219 | }; 220 | /* End PBXShellScriptBuildPhase section */ 221 | 222 | /* Begin PBXSourcesBuildPhase section */ 223 | 97C146EA1CF9000F007C117D /* Sources */ = { 224 | isa = PBXSourcesBuildPhase; 225 | buildActionMask = 2147483647; 226 | files = ( 227 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 228 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 229 | ); 230 | runOnlyForDeploymentPostprocessing = 0; 231 | }; 232 | /* End PBXSourcesBuildPhase section */ 233 | 234 | /* Begin PBXVariantGroup section */ 235 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 236 | isa = PBXVariantGroup; 237 | children = ( 238 | 97C146FB1CF9000F007C117D /* Base */, 239 | ); 240 | name = Main.storyboard; 241 | sourceTree = ""; 242 | }; 243 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 244 | isa = PBXVariantGroup; 245 | children = ( 246 | 97C147001CF9000F007C117D /* Base */, 247 | ); 248 | name = LaunchScreen.storyboard; 249 | sourceTree = ""; 250 | }; 251 | /* End PBXVariantGroup section */ 252 | 253 | /* Begin XCBuildConfiguration section */ 254 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 255 | isa = XCBuildConfiguration; 256 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 257 | buildSettings = { 258 | ALWAYS_SEARCH_USER_PATHS = NO; 259 | CLANG_ANALYZER_NONNULL = YES; 260 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 261 | CLANG_CXX_LIBRARY = "libc++"; 262 | CLANG_ENABLE_MODULES = YES; 263 | CLANG_ENABLE_OBJC_ARC = YES; 264 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 265 | CLANG_WARN_BOOL_CONVERSION = YES; 266 | CLANG_WARN_COMMA = YES; 267 | CLANG_WARN_CONSTANT_CONVERSION = YES; 268 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 269 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 270 | CLANG_WARN_EMPTY_BODY = YES; 271 | CLANG_WARN_ENUM_CONVERSION = YES; 272 | CLANG_WARN_INFINITE_RECURSION = YES; 273 | CLANG_WARN_INT_CONVERSION = YES; 274 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 275 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 276 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 277 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 278 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 279 | CLANG_WARN_STRICT_PROTOTYPES = YES; 280 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 281 | CLANG_WARN_UNREACHABLE_CODE = YES; 282 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 283 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 284 | COPY_PHASE_STRIP = NO; 285 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 286 | ENABLE_NS_ASSERTIONS = NO; 287 | ENABLE_STRICT_OBJC_MSGSEND = YES; 288 | GCC_C_LANGUAGE_STANDARD = gnu99; 289 | GCC_NO_COMMON_BLOCKS = YES; 290 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 291 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 292 | GCC_WARN_UNDECLARED_SELECTOR = YES; 293 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 294 | GCC_WARN_UNUSED_FUNCTION = YES; 295 | GCC_WARN_UNUSED_VARIABLE = YES; 296 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 297 | MTL_ENABLE_DEBUG_INFO = NO; 298 | SDKROOT = iphoneos; 299 | SUPPORTED_PLATFORMS = iphoneos; 300 | TARGETED_DEVICE_FAMILY = "1,2"; 301 | VALIDATE_PRODUCT = YES; 302 | }; 303 | name = Profile; 304 | }; 305 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 306 | isa = XCBuildConfiguration; 307 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 308 | buildSettings = { 309 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 310 | CLANG_ENABLE_MODULES = YES; 311 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 312 | ENABLE_BITCODE = NO; 313 | FRAMEWORK_SEARCH_PATHS = ( 314 | "$(inherited)", 315 | "$(PROJECT_DIR)/Flutter", 316 | ); 317 | INFOPLIST_FILE = Runner/Info.plist; 318 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 319 | LIBRARY_SEARCH_PATHS = ( 320 | "$(inherited)", 321 | "$(PROJECT_DIR)/Flutter", 322 | ); 323 | PRODUCT_BUNDLE_IDENTIFIER = com.example.guru; 324 | PRODUCT_NAME = "$(TARGET_NAME)"; 325 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 326 | SWIFT_VERSION = 5.0; 327 | VERSIONING_SYSTEM = "apple-generic"; 328 | }; 329 | name = Profile; 330 | }; 331 | 97C147031CF9000F007C117D /* Debug */ = { 332 | isa = XCBuildConfiguration; 333 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 334 | buildSettings = { 335 | ALWAYS_SEARCH_USER_PATHS = NO; 336 | CLANG_ANALYZER_NONNULL = YES; 337 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 338 | CLANG_CXX_LIBRARY = "libc++"; 339 | CLANG_ENABLE_MODULES = YES; 340 | CLANG_ENABLE_OBJC_ARC = YES; 341 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 342 | CLANG_WARN_BOOL_CONVERSION = YES; 343 | CLANG_WARN_COMMA = YES; 344 | CLANG_WARN_CONSTANT_CONVERSION = YES; 345 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 346 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 347 | CLANG_WARN_EMPTY_BODY = YES; 348 | CLANG_WARN_ENUM_CONVERSION = YES; 349 | CLANG_WARN_INFINITE_RECURSION = YES; 350 | CLANG_WARN_INT_CONVERSION = YES; 351 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 352 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 353 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 354 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 355 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 356 | CLANG_WARN_STRICT_PROTOTYPES = YES; 357 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 358 | CLANG_WARN_UNREACHABLE_CODE = YES; 359 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 360 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 361 | COPY_PHASE_STRIP = NO; 362 | DEBUG_INFORMATION_FORMAT = dwarf; 363 | ENABLE_STRICT_OBJC_MSGSEND = YES; 364 | ENABLE_TESTABILITY = YES; 365 | GCC_C_LANGUAGE_STANDARD = gnu99; 366 | GCC_DYNAMIC_NO_PIC = NO; 367 | GCC_NO_COMMON_BLOCKS = YES; 368 | GCC_OPTIMIZATION_LEVEL = 0; 369 | GCC_PREPROCESSOR_DEFINITIONS = ( 370 | "DEBUG=1", 371 | "$(inherited)", 372 | ); 373 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 374 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 375 | GCC_WARN_UNDECLARED_SELECTOR = YES; 376 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 377 | GCC_WARN_UNUSED_FUNCTION = YES; 378 | GCC_WARN_UNUSED_VARIABLE = YES; 379 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 380 | MTL_ENABLE_DEBUG_INFO = YES; 381 | ONLY_ACTIVE_ARCH = YES; 382 | SDKROOT = iphoneos; 383 | TARGETED_DEVICE_FAMILY = "1,2"; 384 | }; 385 | name = Debug; 386 | }; 387 | 97C147041CF9000F007C117D /* Release */ = { 388 | isa = XCBuildConfiguration; 389 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 390 | buildSettings = { 391 | ALWAYS_SEARCH_USER_PATHS = NO; 392 | CLANG_ANALYZER_NONNULL = YES; 393 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 394 | CLANG_CXX_LIBRARY = "libc++"; 395 | CLANG_ENABLE_MODULES = YES; 396 | CLANG_ENABLE_OBJC_ARC = YES; 397 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 398 | CLANG_WARN_BOOL_CONVERSION = YES; 399 | CLANG_WARN_COMMA = YES; 400 | CLANG_WARN_CONSTANT_CONVERSION = YES; 401 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 402 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 403 | CLANG_WARN_EMPTY_BODY = YES; 404 | CLANG_WARN_ENUM_CONVERSION = YES; 405 | CLANG_WARN_INFINITE_RECURSION = YES; 406 | CLANG_WARN_INT_CONVERSION = YES; 407 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 408 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 409 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 410 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 411 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 412 | CLANG_WARN_STRICT_PROTOTYPES = YES; 413 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 414 | CLANG_WARN_UNREACHABLE_CODE = YES; 415 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 416 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 417 | COPY_PHASE_STRIP = NO; 418 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 419 | ENABLE_NS_ASSERTIONS = NO; 420 | ENABLE_STRICT_OBJC_MSGSEND = YES; 421 | GCC_C_LANGUAGE_STANDARD = gnu99; 422 | GCC_NO_COMMON_BLOCKS = YES; 423 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 424 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 425 | GCC_WARN_UNDECLARED_SELECTOR = YES; 426 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 427 | GCC_WARN_UNUSED_FUNCTION = YES; 428 | GCC_WARN_UNUSED_VARIABLE = YES; 429 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 430 | MTL_ENABLE_DEBUG_INFO = NO; 431 | SDKROOT = iphoneos; 432 | SUPPORTED_PLATFORMS = iphoneos; 433 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 434 | TARGETED_DEVICE_FAMILY = "1,2"; 435 | VALIDATE_PRODUCT = YES; 436 | }; 437 | name = Release; 438 | }; 439 | 97C147061CF9000F007C117D /* Debug */ = { 440 | isa = XCBuildConfiguration; 441 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 442 | buildSettings = { 443 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 444 | CLANG_ENABLE_MODULES = YES; 445 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 446 | ENABLE_BITCODE = NO; 447 | FRAMEWORK_SEARCH_PATHS = ( 448 | "$(inherited)", 449 | "$(PROJECT_DIR)/Flutter", 450 | ); 451 | INFOPLIST_FILE = Runner/Info.plist; 452 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 453 | LIBRARY_SEARCH_PATHS = ( 454 | "$(inherited)", 455 | "$(PROJECT_DIR)/Flutter", 456 | ); 457 | PRODUCT_BUNDLE_IDENTIFIER = com.example.guru; 458 | PRODUCT_NAME = "$(TARGET_NAME)"; 459 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 460 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 461 | SWIFT_VERSION = 5.0; 462 | VERSIONING_SYSTEM = "apple-generic"; 463 | }; 464 | name = Debug; 465 | }; 466 | 97C147071CF9000F007C117D /* Release */ = { 467 | isa = XCBuildConfiguration; 468 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 469 | buildSettings = { 470 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 471 | CLANG_ENABLE_MODULES = YES; 472 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 473 | ENABLE_BITCODE = NO; 474 | FRAMEWORK_SEARCH_PATHS = ( 475 | "$(inherited)", 476 | "$(PROJECT_DIR)/Flutter", 477 | ); 478 | INFOPLIST_FILE = Runner/Info.plist; 479 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 480 | LIBRARY_SEARCH_PATHS = ( 481 | "$(inherited)", 482 | "$(PROJECT_DIR)/Flutter", 483 | ); 484 | PRODUCT_BUNDLE_IDENTIFIER = com.example.guru; 485 | PRODUCT_NAME = "$(TARGET_NAME)"; 486 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 487 | SWIFT_VERSION = 5.0; 488 | VERSIONING_SYSTEM = "apple-generic"; 489 | }; 490 | name = Release; 491 | }; 492 | /* End XCBuildConfiguration section */ 493 | 494 | /* Begin XCConfigurationList section */ 495 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 496 | isa = XCConfigurationList; 497 | buildConfigurations = ( 498 | 97C147031CF9000F007C117D /* Debug */, 499 | 97C147041CF9000F007C117D /* Release */, 500 | 249021D3217E4FDB00AE95B9 /* Profile */, 501 | ); 502 | defaultConfigurationIsVisible = 0; 503 | defaultConfigurationName = Release; 504 | }; 505 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 506 | isa = XCConfigurationList; 507 | buildConfigurations = ( 508 | 97C147061CF9000F007C117D /* Debug */, 509 | 97C147071CF9000F007C117D /* Release */, 510 | 249021D4217E4FDB00AE95B9 /* Profile */, 511 | ); 512 | defaultConfigurationIsVisible = 0; 513 | defaultConfigurationName = Release; 514 | }; 515 | /* End XCConfigurationList section */ 516 | }; 517 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 518 | } 519 | -------------------------------------------------------------------------------- /Server/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "auth", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@sindresorhus/is": { 8 | "version": "0.14.0", 9 | "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", 10 | "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" 11 | }, 12 | "@szmarczak/http-timer": { 13 | "version": "1.1.2", 14 | "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", 15 | "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", 16 | "requires": { 17 | "defer-to-connect": "^1.0.1" 18 | } 19 | }, 20 | "@types/color-name": { 21 | "version": "1.1.1", 22 | "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", 23 | "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" 24 | }, 25 | "abbrev": { 26 | "version": "1.1.1", 27 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 28 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" 29 | }, 30 | "accepts": { 31 | "version": "1.3.7", 32 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 33 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 34 | "requires": { 35 | "mime-types": "~2.1.24", 36 | "negotiator": "0.6.2" 37 | } 38 | }, 39 | "ansi-align": { 40 | "version": "3.0.0", 41 | "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", 42 | "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", 43 | "requires": { 44 | "string-width": "^3.0.0" 45 | }, 46 | "dependencies": { 47 | "ansi-regex": { 48 | "version": "4.1.0", 49 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 50 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" 51 | }, 52 | "is-fullwidth-code-point": { 53 | "version": "2.0.0", 54 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 55 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 56 | }, 57 | "string-width": { 58 | "version": "3.1.0", 59 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 60 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 61 | "requires": { 62 | "emoji-regex": "^7.0.1", 63 | "is-fullwidth-code-point": "^2.0.0", 64 | "strip-ansi": "^5.1.0" 65 | } 66 | }, 67 | "strip-ansi": { 68 | "version": "5.2.0", 69 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 70 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 71 | "requires": { 72 | "ansi-regex": "^4.1.0" 73 | } 74 | } 75 | } 76 | }, 77 | "ansi-styles": { 78 | "version": "4.2.1", 79 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", 80 | "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", 81 | "requires": { 82 | "@types/color-name": "^1.1.1", 83 | "color-convert": "^2.0.1" 84 | } 85 | }, 86 | "anymatch": { 87 | "version": "3.1.1", 88 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", 89 | "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", 90 | "requires": { 91 | "normalize-path": "^3.0.0", 92 | "picomatch": "^2.0.4" 93 | } 94 | }, 95 | "array-flatten": { 96 | "version": "1.1.1", 97 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 98 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 99 | }, 100 | "balanced-match": { 101 | "version": "1.0.0", 102 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 103 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 104 | }, 105 | "bcryptjs": { 106 | "version": "2.4.3", 107 | "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", 108 | "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" 109 | }, 110 | "binary-extensions": { 111 | "version": "2.0.0", 112 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", 113 | "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==" 114 | }, 115 | "bl": { 116 | "version": "2.2.0", 117 | "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.0.tgz", 118 | "integrity": "sha512-wbgvOpqopSr7uq6fJrLH8EsvYMJf9gzfo2jCsL2eTy75qXPukA4pCgHamOQkZtY5vmfVtjB+P3LNlMHW5CEZXA==", 119 | "requires": { 120 | "readable-stream": "^2.3.5", 121 | "safe-buffer": "^5.1.1" 122 | } 123 | }, 124 | "bluebird": { 125 | "version": "3.5.1", 126 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", 127 | "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" 128 | }, 129 | "body-parser": { 130 | "version": "1.19.0", 131 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 132 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 133 | "requires": { 134 | "bytes": "3.1.0", 135 | "content-type": "~1.0.4", 136 | "debug": "2.6.9", 137 | "depd": "~1.1.2", 138 | "http-errors": "1.7.2", 139 | "iconv-lite": "0.4.24", 140 | "on-finished": "~2.3.0", 141 | "qs": "6.7.0", 142 | "raw-body": "2.4.0", 143 | "type-is": "~1.6.17" 144 | }, 145 | "dependencies": { 146 | "debug": { 147 | "version": "2.6.9", 148 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 149 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 150 | "requires": { 151 | "ms": "2.0.0" 152 | } 153 | }, 154 | "ms": { 155 | "version": "2.0.0", 156 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 157 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 158 | } 159 | } 160 | }, 161 | "boxen": { 162 | "version": "4.2.0", 163 | "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", 164 | "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", 165 | "requires": { 166 | "ansi-align": "^3.0.0", 167 | "camelcase": "^5.3.1", 168 | "chalk": "^3.0.0", 169 | "cli-boxes": "^2.2.0", 170 | "string-width": "^4.1.0", 171 | "term-size": "^2.1.0", 172 | "type-fest": "^0.8.1", 173 | "widest-line": "^3.1.0" 174 | }, 175 | "dependencies": { 176 | "ansi-regex": { 177 | "version": "5.0.0", 178 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 179 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" 180 | }, 181 | "emoji-regex": { 182 | "version": "8.0.0", 183 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 184 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 185 | }, 186 | "is-fullwidth-code-point": { 187 | "version": "3.0.0", 188 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 189 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" 190 | }, 191 | "string-width": { 192 | "version": "4.2.0", 193 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", 194 | "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", 195 | "requires": { 196 | "emoji-regex": "^8.0.0", 197 | "is-fullwidth-code-point": "^3.0.0", 198 | "strip-ansi": "^6.0.0" 199 | } 200 | }, 201 | "strip-ansi": { 202 | "version": "6.0.0", 203 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 204 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 205 | "requires": { 206 | "ansi-regex": "^5.0.0" 207 | } 208 | } 209 | } 210 | }, 211 | "brace-expansion": { 212 | "version": "1.1.11", 213 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 214 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 215 | "requires": { 216 | "balanced-match": "^1.0.0", 217 | "concat-map": "0.0.1" 218 | } 219 | }, 220 | "braces": { 221 | "version": "3.0.2", 222 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 223 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 224 | "requires": { 225 | "fill-range": "^7.0.1" 226 | } 227 | }, 228 | "bson": { 229 | "version": "1.1.4", 230 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.4.tgz", 231 | "integrity": "sha512-S/yKGU1syOMzO86+dGpg2qGoDL0zvzcb262G+gqEy6TgP6rt6z6qxSFX/8X6vLC91P7G7C3nLs0+bvDzmvBA3Q==" 232 | }, 233 | "buffer-equal-constant-time": { 234 | "version": "1.0.1", 235 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 236 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" 237 | }, 238 | "bytes": { 239 | "version": "3.1.0", 240 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 241 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 242 | }, 243 | "cacheable-request": { 244 | "version": "6.1.0", 245 | "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", 246 | "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", 247 | "requires": { 248 | "clone-response": "^1.0.2", 249 | "get-stream": "^5.1.0", 250 | "http-cache-semantics": "^4.0.0", 251 | "keyv": "^3.0.0", 252 | "lowercase-keys": "^2.0.0", 253 | "normalize-url": "^4.1.0", 254 | "responselike": "^1.0.2" 255 | }, 256 | "dependencies": { 257 | "get-stream": { 258 | "version": "5.1.0", 259 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", 260 | "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", 261 | "requires": { 262 | "pump": "^3.0.0" 263 | } 264 | }, 265 | "lowercase-keys": { 266 | "version": "2.0.0", 267 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", 268 | "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" 269 | } 270 | } 271 | }, 272 | "camelcase": { 273 | "version": "5.3.1", 274 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 275 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" 276 | }, 277 | "chalk": { 278 | "version": "3.0.0", 279 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", 280 | "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", 281 | "requires": { 282 | "ansi-styles": "^4.1.0", 283 | "supports-color": "^7.1.0" 284 | }, 285 | "dependencies": { 286 | "has-flag": { 287 | "version": "4.0.0", 288 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 289 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" 290 | }, 291 | "supports-color": { 292 | "version": "7.1.0", 293 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", 294 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", 295 | "requires": { 296 | "has-flag": "^4.0.0" 297 | } 298 | } 299 | } 300 | }, 301 | "chokidar": { 302 | "version": "3.3.1", 303 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", 304 | "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", 305 | "requires": { 306 | "anymatch": "~3.1.1", 307 | "braces": "~3.0.2", 308 | "fsevents": "~2.1.2", 309 | "glob-parent": "~5.1.0", 310 | "is-binary-path": "~2.1.0", 311 | "is-glob": "~4.0.1", 312 | "normalize-path": "~3.0.0", 313 | "readdirp": "~3.3.0" 314 | } 315 | }, 316 | "ci-info": { 317 | "version": "2.0.0", 318 | "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", 319 | "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" 320 | }, 321 | "cli-boxes": { 322 | "version": "2.2.0", 323 | "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", 324 | "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==" 325 | }, 326 | "clone-response": { 327 | "version": "1.0.2", 328 | "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", 329 | "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", 330 | "requires": { 331 | "mimic-response": "^1.0.0" 332 | } 333 | }, 334 | "color-convert": { 335 | "version": "2.0.1", 336 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 337 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 338 | "requires": { 339 | "color-name": "~1.1.4" 340 | } 341 | }, 342 | "color-name": { 343 | "version": "1.1.4", 344 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 345 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 346 | }, 347 | "concat-map": { 348 | "version": "0.0.1", 349 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 350 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 351 | }, 352 | "configstore": { 353 | "version": "5.0.1", 354 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", 355 | "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", 356 | "requires": { 357 | "dot-prop": "^5.2.0", 358 | "graceful-fs": "^4.1.2", 359 | "make-dir": "^3.0.0", 360 | "unique-string": "^2.0.0", 361 | "write-file-atomic": "^3.0.0", 362 | "xdg-basedir": "^4.0.0" 363 | } 364 | }, 365 | "content-disposition": { 366 | "version": "0.5.3", 367 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 368 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 369 | "requires": { 370 | "safe-buffer": "5.1.2" 371 | } 372 | }, 373 | "content-type": { 374 | "version": "1.0.4", 375 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 376 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 377 | }, 378 | "cookie": { 379 | "version": "0.4.0", 380 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 381 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 382 | }, 383 | "cookie-signature": { 384 | "version": "1.0.6", 385 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 386 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 387 | }, 388 | "core-util-is": { 389 | "version": "1.0.2", 390 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 391 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 392 | }, 393 | "crypto-random-string": { 394 | "version": "2.0.0", 395 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", 396 | "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" 397 | }, 398 | "debug": { 399 | "version": "3.2.6", 400 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 401 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 402 | "requires": { 403 | "ms": "^2.1.1" 404 | } 405 | }, 406 | "decompress-response": { 407 | "version": "3.3.0", 408 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", 409 | "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", 410 | "requires": { 411 | "mimic-response": "^1.0.0" 412 | } 413 | }, 414 | "deep-extend": { 415 | "version": "0.6.0", 416 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 417 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" 418 | }, 419 | "defer-to-connect": { 420 | "version": "1.1.3", 421 | "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", 422 | "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" 423 | }, 424 | "denque": { 425 | "version": "1.4.1", 426 | "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", 427 | "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==" 428 | }, 429 | "depd": { 430 | "version": "1.1.2", 431 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 432 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 433 | }, 434 | "destroy": { 435 | "version": "1.0.4", 436 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 437 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 438 | }, 439 | "dot-prop": { 440 | "version": "5.2.0", 441 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", 442 | "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", 443 | "requires": { 444 | "is-obj": "^2.0.0" 445 | } 446 | }, 447 | "duplexer3": { 448 | "version": "0.1.4", 449 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", 450 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" 451 | }, 452 | "ecdsa-sig-formatter": { 453 | "version": "1.0.11", 454 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 455 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 456 | "requires": { 457 | "safe-buffer": "^5.0.1" 458 | } 459 | }, 460 | "ee-first": { 461 | "version": "1.1.1", 462 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 463 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 464 | }, 465 | "emoji-regex": { 466 | "version": "7.0.3", 467 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 468 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" 469 | }, 470 | "encodeurl": { 471 | "version": "1.0.2", 472 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 473 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 474 | }, 475 | "end-of-stream": { 476 | "version": "1.4.4", 477 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 478 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 479 | "requires": { 480 | "once": "^1.4.0" 481 | } 482 | }, 483 | "escape-goat": { 484 | "version": "2.1.1", 485 | "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", 486 | "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==" 487 | }, 488 | "escape-html": { 489 | "version": "1.0.3", 490 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 491 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 492 | }, 493 | "etag": { 494 | "version": "1.8.1", 495 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 496 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 497 | }, 498 | "express": { 499 | "version": "4.17.1", 500 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 501 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 502 | "requires": { 503 | "accepts": "~1.3.7", 504 | "array-flatten": "1.1.1", 505 | "body-parser": "1.19.0", 506 | "content-disposition": "0.5.3", 507 | "content-type": "~1.0.4", 508 | "cookie": "0.4.0", 509 | "cookie-signature": "1.0.6", 510 | "debug": "2.6.9", 511 | "depd": "~1.1.2", 512 | "encodeurl": "~1.0.2", 513 | "escape-html": "~1.0.3", 514 | "etag": "~1.8.1", 515 | "finalhandler": "~1.1.2", 516 | "fresh": "0.5.2", 517 | "merge-descriptors": "1.0.1", 518 | "methods": "~1.1.2", 519 | "on-finished": "~2.3.0", 520 | "parseurl": "~1.3.3", 521 | "path-to-regexp": "0.1.7", 522 | "proxy-addr": "~2.0.5", 523 | "qs": "6.7.0", 524 | "range-parser": "~1.2.1", 525 | "safe-buffer": "5.1.2", 526 | "send": "0.17.1", 527 | "serve-static": "1.14.1", 528 | "setprototypeof": "1.1.1", 529 | "statuses": "~1.5.0", 530 | "type-is": "~1.6.18", 531 | "utils-merge": "1.0.1", 532 | "vary": "~1.1.2" 533 | }, 534 | "dependencies": { 535 | "debug": { 536 | "version": "2.6.9", 537 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 538 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 539 | "requires": { 540 | "ms": "2.0.0" 541 | } 542 | }, 543 | "ms": { 544 | "version": "2.0.0", 545 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 546 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 547 | } 548 | } 549 | }, 550 | "fill-range": { 551 | "version": "7.0.1", 552 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 553 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 554 | "requires": { 555 | "to-regex-range": "^5.0.1" 556 | } 557 | }, 558 | "finalhandler": { 559 | "version": "1.1.2", 560 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 561 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 562 | "requires": { 563 | "debug": "2.6.9", 564 | "encodeurl": "~1.0.2", 565 | "escape-html": "~1.0.3", 566 | "on-finished": "~2.3.0", 567 | "parseurl": "~1.3.3", 568 | "statuses": "~1.5.0", 569 | "unpipe": "~1.0.0" 570 | }, 571 | "dependencies": { 572 | "debug": { 573 | "version": "2.6.9", 574 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 575 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 576 | "requires": { 577 | "ms": "2.0.0" 578 | } 579 | }, 580 | "ms": { 581 | "version": "2.0.0", 582 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 583 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 584 | } 585 | } 586 | }, 587 | "forwarded": { 588 | "version": "0.1.2", 589 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 590 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 591 | }, 592 | "fresh": { 593 | "version": "0.5.2", 594 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 595 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 596 | }, 597 | "fsevents": { 598 | "version": "2.1.2", 599 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", 600 | "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", 601 | "optional": true 602 | }, 603 | "get-stream": { 604 | "version": "4.1.0", 605 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", 606 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", 607 | "requires": { 608 | "pump": "^3.0.0" 609 | } 610 | }, 611 | "glob-parent": { 612 | "version": "5.1.1", 613 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", 614 | "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", 615 | "requires": { 616 | "is-glob": "^4.0.1" 617 | } 618 | }, 619 | "global-dirs": { 620 | "version": "2.0.1", 621 | "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", 622 | "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==", 623 | "requires": { 624 | "ini": "^1.3.5" 625 | } 626 | }, 627 | "got": { 628 | "version": "9.6.0", 629 | "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", 630 | "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", 631 | "requires": { 632 | "@sindresorhus/is": "^0.14.0", 633 | "@szmarczak/http-timer": "^1.1.2", 634 | "cacheable-request": "^6.0.0", 635 | "decompress-response": "^3.3.0", 636 | "duplexer3": "^0.1.4", 637 | "get-stream": "^4.1.0", 638 | "lowercase-keys": "^1.0.1", 639 | "mimic-response": "^1.0.1", 640 | "p-cancelable": "^1.0.0", 641 | "to-readable-stream": "^1.0.0", 642 | "url-parse-lax": "^3.0.0" 643 | } 644 | }, 645 | "graceful-fs": { 646 | "version": "4.2.3", 647 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", 648 | "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" 649 | }, 650 | "has-flag": { 651 | "version": "3.0.0", 652 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 653 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 654 | }, 655 | "has-yarn": { 656 | "version": "2.1.0", 657 | "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", 658 | "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" 659 | }, 660 | "http-cache-semantics": { 661 | "version": "4.1.0", 662 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", 663 | "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" 664 | }, 665 | "http-errors": { 666 | "version": "1.7.2", 667 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 668 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 669 | "requires": { 670 | "depd": "~1.1.2", 671 | "inherits": "2.0.3", 672 | "setprototypeof": "1.1.1", 673 | "statuses": ">= 1.5.0 < 2", 674 | "toidentifier": "1.0.0" 675 | }, 676 | "dependencies": { 677 | "inherits": { 678 | "version": "2.0.3", 679 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 680 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 681 | } 682 | } 683 | }, 684 | "iconv-lite": { 685 | "version": "0.4.24", 686 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 687 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 688 | "requires": { 689 | "safer-buffer": ">= 2.1.2 < 3" 690 | } 691 | }, 692 | "ignore-by-default": { 693 | "version": "1.0.1", 694 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 695 | "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=" 696 | }, 697 | "import-lazy": { 698 | "version": "2.1.0", 699 | "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", 700 | "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" 701 | }, 702 | "imurmurhash": { 703 | "version": "0.1.4", 704 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 705 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" 706 | }, 707 | "inherits": { 708 | "version": "2.0.4", 709 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 710 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 711 | }, 712 | "ini": { 713 | "version": "1.3.5", 714 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 715 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" 716 | }, 717 | "ipaddr.js": { 718 | "version": "1.9.1", 719 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 720 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 721 | }, 722 | "is-binary-path": { 723 | "version": "2.1.0", 724 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 725 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 726 | "requires": { 727 | "binary-extensions": "^2.0.0" 728 | } 729 | }, 730 | "is-ci": { 731 | "version": "2.0.0", 732 | "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", 733 | "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", 734 | "requires": { 735 | "ci-info": "^2.0.0" 736 | } 737 | }, 738 | "is-extglob": { 739 | "version": "2.1.1", 740 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 741 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" 742 | }, 743 | "is-glob": { 744 | "version": "4.0.1", 745 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 746 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 747 | "requires": { 748 | "is-extglob": "^2.1.1" 749 | } 750 | }, 751 | "is-installed-globally": { 752 | "version": "0.3.2", 753 | "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", 754 | "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", 755 | "requires": { 756 | "global-dirs": "^2.0.1", 757 | "is-path-inside": "^3.0.1" 758 | } 759 | }, 760 | "is-npm": { 761 | "version": "4.0.0", 762 | "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", 763 | "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==" 764 | }, 765 | "is-number": { 766 | "version": "7.0.0", 767 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 768 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 769 | }, 770 | "is-obj": { 771 | "version": "2.0.0", 772 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", 773 | "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" 774 | }, 775 | "is-path-inside": { 776 | "version": "3.0.2", 777 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", 778 | "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==" 779 | }, 780 | "is-typedarray": { 781 | "version": "1.0.0", 782 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 783 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 784 | }, 785 | "is-yarn-global": { 786 | "version": "0.3.0", 787 | "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", 788 | "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" 789 | }, 790 | "isarray": { 791 | "version": "1.0.0", 792 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 793 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 794 | }, 795 | "json-buffer": { 796 | "version": "3.0.0", 797 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", 798 | "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" 799 | }, 800 | "jsonwebtoken": { 801 | "version": "8.5.1", 802 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", 803 | "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", 804 | "requires": { 805 | "jws": "^3.2.2", 806 | "lodash.includes": "^4.3.0", 807 | "lodash.isboolean": "^3.0.3", 808 | "lodash.isinteger": "^4.0.4", 809 | "lodash.isnumber": "^3.0.3", 810 | "lodash.isplainobject": "^4.0.6", 811 | "lodash.isstring": "^4.0.1", 812 | "lodash.once": "^4.0.0", 813 | "ms": "^2.1.1", 814 | "semver": "^5.6.0" 815 | } 816 | }, 817 | "jwa": { 818 | "version": "1.4.1", 819 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", 820 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", 821 | "requires": { 822 | "buffer-equal-constant-time": "1.0.1", 823 | "ecdsa-sig-formatter": "1.0.11", 824 | "safe-buffer": "^5.0.1" 825 | } 826 | }, 827 | "jws": { 828 | "version": "3.2.2", 829 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", 830 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", 831 | "requires": { 832 | "jwa": "^1.4.1", 833 | "safe-buffer": "^5.0.1" 834 | } 835 | }, 836 | "kareem": { 837 | "version": "2.3.1", 838 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz", 839 | "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw==" 840 | }, 841 | "keyv": { 842 | "version": "3.1.0", 843 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", 844 | "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", 845 | "requires": { 846 | "json-buffer": "3.0.0" 847 | } 848 | }, 849 | "latest-version": { 850 | "version": "5.1.0", 851 | "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", 852 | "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", 853 | "requires": { 854 | "package-json": "^6.3.0" 855 | } 856 | }, 857 | "lodash.includes": { 858 | "version": "4.3.0", 859 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", 860 | "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" 861 | }, 862 | "lodash.isboolean": { 863 | "version": "3.0.3", 864 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 865 | "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" 866 | }, 867 | "lodash.isinteger": { 868 | "version": "4.0.4", 869 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 870 | "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" 871 | }, 872 | "lodash.isnumber": { 873 | "version": "3.0.3", 874 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 875 | "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" 876 | }, 877 | "lodash.isplainobject": { 878 | "version": "4.0.6", 879 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 880 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" 881 | }, 882 | "lodash.isstring": { 883 | "version": "4.0.1", 884 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 885 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" 886 | }, 887 | "lodash.once": { 888 | "version": "4.1.1", 889 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 890 | "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" 891 | }, 892 | "lowercase-keys": { 893 | "version": "1.0.1", 894 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", 895 | "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" 896 | }, 897 | "make-dir": { 898 | "version": "3.0.2", 899 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", 900 | "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", 901 | "requires": { 902 | "semver": "^6.0.0" 903 | }, 904 | "dependencies": { 905 | "semver": { 906 | "version": "6.3.0", 907 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 908 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" 909 | } 910 | } 911 | }, 912 | "media-typer": { 913 | "version": "0.3.0", 914 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 915 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 916 | }, 917 | "memory-pager": { 918 | "version": "1.5.0", 919 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", 920 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", 921 | "optional": true 922 | }, 923 | "merge-descriptors": { 924 | "version": "1.0.1", 925 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 926 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 927 | }, 928 | "methods": { 929 | "version": "1.1.2", 930 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 931 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 932 | }, 933 | "mime": { 934 | "version": "1.6.0", 935 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 936 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 937 | }, 938 | "mime-db": { 939 | "version": "1.43.0", 940 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", 941 | "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" 942 | }, 943 | "mime-types": { 944 | "version": "2.1.26", 945 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", 946 | "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", 947 | "requires": { 948 | "mime-db": "1.43.0" 949 | } 950 | }, 951 | "mimic-response": { 952 | "version": "1.0.1", 953 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", 954 | "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" 955 | }, 956 | "minimatch": { 957 | "version": "3.0.4", 958 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 959 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 960 | "requires": { 961 | "brace-expansion": "^1.1.7" 962 | } 963 | }, 964 | "minimist": { 965 | "version": "1.2.5", 966 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 967 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 968 | }, 969 | "mongodb": { 970 | "version": "3.5.5", 971 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.5.5.tgz", 972 | "integrity": "sha512-GCjDxR3UOltDq00Zcpzql6dQo1sVry60OXJY3TDmFc2SWFY6c8Gn1Ardidc5jDirvJrx2GC3knGOImKphbSL3A==", 973 | "requires": { 974 | "bl": "^2.2.0", 975 | "bson": "^1.1.1", 976 | "denque": "^1.4.1", 977 | "require_optional": "^1.0.1", 978 | "safe-buffer": "^5.1.2", 979 | "saslprep": "^1.0.0" 980 | } 981 | }, 982 | "mongoose": { 983 | "version": "5.9.9", 984 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.9.9.tgz", 985 | "integrity": "sha512-pLkIkM7XQwfbQ+xK1l57Zv0DYPH190/I6Cv5+PbJGfAU0HvX0atMlp+vly8zcjNTEvTkVM80qA5eBYBvZyLYXw==", 986 | "requires": { 987 | "bson": "~1.1.1", 988 | "kareem": "2.3.1", 989 | "mongodb": "3.5.5", 990 | "mongoose-legacy-pluralize": "1.0.2", 991 | "mpath": "0.7.0", 992 | "mquery": "3.2.2", 993 | "ms": "2.1.2", 994 | "regexp-clone": "1.0.0", 995 | "safe-buffer": "5.1.2", 996 | "sift": "7.0.1", 997 | "sliced": "1.0.1" 998 | } 999 | }, 1000 | "mongoose-legacy-pluralize": { 1001 | "version": "1.0.2", 1002 | "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", 1003 | "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" 1004 | }, 1005 | "mpath": { 1006 | "version": "0.7.0", 1007 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.7.0.tgz", 1008 | "integrity": "sha512-Aiq04hILxhz1L+f7sjGyn7IxYzWm1zLNNXcfhDtx04kZ2Gk7uvFdgZ8ts1cWa/6d0TQmag2yR8zSGZUmp0tFNg==" 1009 | }, 1010 | "mquery": { 1011 | "version": "3.2.2", 1012 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.2.tgz", 1013 | "integrity": "sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q==", 1014 | "requires": { 1015 | "bluebird": "3.5.1", 1016 | "debug": "3.1.0", 1017 | "regexp-clone": "^1.0.0", 1018 | "safe-buffer": "5.1.2", 1019 | "sliced": "1.0.1" 1020 | }, 1021 | "dependencies": { 1022 | "debug": { 1023 | "version": "3.1.0", 1024 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 1025 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 1026 | "requires": { 1027 | "ms": "2.0.0" 1028 | } 1029 | }, 1030 | "ms": { 1031 | "version": "2.0.0", 1032 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1033 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1034 | } 1035 | } 1036 | }, 1037 | "ms": { 1038 | "version": "2.1.2", 1039 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1040 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1041 | }, 1042 | "negotiator": { 1043 | "version": "0.6.2", 1044 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 1045 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 1046 | }, 1047 | "nodemon": { 1048 | "version": "2.0.3", 1049 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.3.tgz", 1050 | "integrity": "sha512-lLQLPS90Lqwc99IHe0U94rDgvjo+G9I4uEIxRG3evSLROcqQ9hwc0AxlSHKS4T1JW/IMj/7N5mthiN58NL/5kw==", 1051 | "requires": { 1052 | "chokidar": "^3.2.2", 1053 | "debug": "^3.2.6", 1054 | "ignore-by-default": "^1.0.1", 1055 | "minimatch": "^3.0.4", 1056 | "pstree.remy": "^1.1.7", 1057 | "semver": "^5.7.1", 1058 | "supports-color": "^5.5.0", 1059 | "touch": "^3.1.0", 1060 | "undefsafe": "^2.0.2", 1061 | "update-notifier": "^4.0.0" 1062 | } 1063 | }, 1064 | "normalize-path": { 1065 | "version": "3.0.0", 1066 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1067 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" 1068 | }, 1069 | "normalize-url": { 1070 | "version": "4.5.0", 1071 | "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", 1072 | "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" 1073 | }, 1074 | "on-finished": { 1075 | "version": "2.3.0", 1076 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1077 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 1078 | "requires": { 1079 | "ee-first": "1.1.1" 1080 | } 1081 | }, 1082 | "once": { 1083 | "version": "1.4.0", 1084 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1085 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1086 | "requires": { 1087 | "wrappy": "1" 1088 | } 1089 | }, 1090 | "p-cancelable": { 1091 | "version": "1.1.0", 1092 | "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", 1093 | "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" 1094 | }, 1095 | "package-json": { 1096 | "version": "6.5.0", 1097 | "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", 1098 | "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", 1099 | "requires": { 1100 | "got": "^9.6.0", 1101 | "registry-auth-token": "^4.0.0", 1102 | "registry-url": "^5.0.0", 1103 | "semver": "^6.2.0" 1104 | }, 1105 | "dependencies": { 1106 | "semver": { 1107 | "version": "6.3.0", 1108 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1109 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" 1110 | } 1111 | } 1112 | }, 1113 | "parseurl": { 1114 | "version": "1.3.3", 1115 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1116 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1117 | }, 1118 | "path-to-regexp": { 1119 | "version": "0.1.7", 1120 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1121 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 1122 | }, 1123 | "picomatch": { 1124 | "version": "2.2.2", 1125 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", 1126 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" 1127 | }, 1128 | "prepend-http": { 1129 | "version": "2.0.0", 1130 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", 1131 | "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" 1132 | }, 1133 | "process-nextick-args": { 1134 | "version": "2.0.1", 1135 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1136 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 1137 | }, 1138 | "proxy-addr": { 1139 | "version": "2.0.6", 1140 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", 1141 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", 1142 | "requires": { 1143 | "forwarded": "~0.1.2", 1144 | "ipaddr.js": "1.9.1" 1145 | } 1146 | }, 1147 | "pstree.remy": { 1148 | "version": "1.1.7", 1149 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.7.tgz", 1150 | "integrity": "sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A==" 1151 | }, 1152 | "pump": { 1153 | "version": "3.0.0", 1154 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 1155 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 1156 | "requires": { 1157 | "end-of-stream": "^1.1.0", 1158 | "once": "^1.3.1" 1159 | } 1160 | }, 1161 | "pupa": { 1162 | "version": "2.0.1", 1163 | "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz", 1164 | "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==", 1165 | "requires": { 1166 | "escape-goat": "^2.0.0" 1167 | } 1168 | }, 1169 | "qs": { 1170 | "version": "6.7.0", 1171 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 1172 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 1173 | }, 1174 | "range-parser": { 1175 | "version": "1.2.1", 1176 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1177 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 1178 | }, 1179 | "raw-body": { 1180 | "version": "2.4.0", 1181 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 1182 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 1183 | "requires": { 1184 | "bytes": "3.1.0", 1185 | "http-errors": "1.7.2", 1186 | "iconv-lite": "0.4.24", 1187 | "unpipe": "1.0.0" 1188 | } 1189 | }, 1190 | "rc": { 1191 | "version": "1.2.8", 1192 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 1193 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 1194 | "requires": { 1195 | "deep-extend": "^0.6.0", 1196 | "ini": "~1.3.0", 1197 | "minimist": "^1.2.0", 1198 | "strip-json-comments": "~2.0.1" 1199 | } 1200 | }, 1201 | "readable-stream": { 1202 | "version": "2.3.7", 1203 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1204 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1205 | "requires": { 1206 | "core-util-is": "~1.0.0", 1207 | "inherits": "~2.0.3", 1208 | "isarray": "~1.0.0", 1209 | "process-nextick-args": "~2.0.0", 1210 | "safe-buffer": "~5.1.1", 1211 | "string_decoder": "~1.1.1", 1212 | "util-deprecate": "~1.0.1" 1213 | } 1214 | }, 1215 | "readdirp": { 1216 | "version": "3.3.0", 1217 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", 1218 | "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", 1219 | "requires": { 1220 | "picomatch": "^2.0.7" 1221 | } 1222 | }, 1223 | "regexp-clone": { 1224 | "version": "1.0.0", 1225 | "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", 1226 | "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" 1227 | }, 1228 | "registry-auth-token": { 1229 | "version": "4.1.1", 1230 | "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.1.1.tgz", 1231 | "integrity": "sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA==", 1232 | "requires": { 1233 | "rc": "^1.2.8" 1234 | } 1235 | }, 1236 | "registry-url": { 1237 | "version": "5.1.0", 1238 | "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", 1239 | "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", 1240 | "requires": { 1241 | "rc": "^1.2.8" 1242 | } 1243 | }, 1244 | "require_optional": { 1245 | "version": "1.0.1", 1246 | "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", 1247 | "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", 1248 | "requires": { 1249 | "resolve-from": "^2.0.0", 1250 | "semver": "^5.1.0" 1251 | } 1252 | }, 1253 | "resolve-from": { 1254 | "version": "2.0.0", 1255 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", 1256 | "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" 1257 | }, 1258 | "responselike": { 1259 | "version": "1.0.2", 1260 | "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", 1261 | "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", 1262 | "requires": { 1263 | "lowercase-keys": "^1.0.0" 1264 | } 1265 | }, 1266 | "safe-buffer": { 1267 | "version": "5.1.2", 1268 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1269 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1270 | }, 1271 | "safer-buffer": { 1272 | "version": "2.1.2", 1273 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1274 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1275 | }, 1276 | "saslprep": { 1277 | "version": "1.0.3", 1278 | "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", 1279 | "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", 1280 | "optional": true, 1281 | "requires": { 1282 | "sparse-bitfield": "^3.0.3" 1283 | } 1284 | }, 1285 | "semver": { 1286 | "version": "5.7.1", 1287 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1288 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 1289 | }, 1290 | "semver-diff": { 1291 | "version": "3.1.1", 1292 | "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", 1293 | "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", 1294 | "requires": { 1295 | "semver": "^6.3.0" 1296 | }, 1297 | "dependencies": { 1298 | "semver": { 1299 | "version": "6.3.0", 1300 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1301 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" 1302 | } 1303 | } 1304 | }, 1305 | "send": { 1306 | "version": "0.17.1", 1307 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 1308 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 1309 | "requires": { 1310 | "debug": "2.6.9", 1311 | "depd": "~1.1.2", 1312 | "destroy": "~1.0.4", 1313 | "encodeurl": "~1.0.2", 1314 | "escape-html": "~1.0.3", 1315 | "etag": "~1.8.1", 1316 | "fresh": "0.5.2", 1317 | "http-errors": "~1.7.2", 1318 | "mime": "1.6.0", 1319 | "ms": "2.1.1", 1320 | "on-finished": "~2.3.0", 1321 | "range-parser": "~1.2.1", 1322 | "statuses": "~1.5.0" 1323 | }, 1324 | "dependencies": { 1325 | "debug": { 1326 | "version": "2.6.9", 1327 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1328 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1329 | "requires": { 1330 | "ms": "2.0.0" 1331 | }, 1332 | "dependencies": { 1333 | "ms": { 1334 | "version": "2.0.0", 1335 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1336 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1337 | } 1338 | } 1339 | }, 1340 | "ms": { 1341 | "version": "2.1.1", 1342 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 1343 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 1344 | } 1345 | } 1346 | }, 1347 | "serve-static": { 1348 | "version": "1.14.1", 1349 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 1350 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 1351 | "requires": { 1352 | "encodeurl": "~1.0.2", 1353 | "escape-html": "~1.0.3", 1354 | "parseurl": "~1.3.3", 1355 | "send": "0.17.1" 1356 | } 1357 | }, 1358 | "setprototypeof": { 1359 | "version": "1.1.1", 1360 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 1361 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 1362 | }, 1363 | "sift": { 1364 | "version": "7.0.1", 1365 | "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz", 1366 | "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==" 1367 | }, 1368 | "signal-exit": { 1369 | "version": "3.0.3", 1370 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 1371 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" 1372 | }, 1373 | "sliced": { 1374 | "version": "1.0.1", 1375 | "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", 1376 | "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" 1377 | }, 1378 | "sparse-bitfield": { 1379 | "version": "3.0.3", 1380 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", 1381 | "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", 1382 | "optional": true, 1383 | "requires": { 1384 | "memory-pager": "^1.0.2" 1385 | } 1386 | }, 1387 | "statuses": { 1388 | "version": "1.5.0", 1389 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1390 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 1391 | }, 1392 | "string_decoder": { 1393 | "version": "1.1.1", 1394 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1395 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1396 | "requires": { 1397 | "safe-buffer": "~5.1.0" 1398 | } 1399 | }, 1400 | "strip-json-comments": { 1401 | "version": "2.0.1", 1402 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1403 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" 1404 | }, 1405 | "supports-color": { 1406 | "version": "5.5.0", 1407 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1408 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1409 | "requires": { 1410 | "has-flag": "^3.0.0" 1411 | } 1412 | }, 1413 | "term-size": { 1414 | "version": "2.2.0", 1415 | "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz", 1416 | "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==" 1417 | }, 1418 | "to-readable-stream": { 1419 | "version": "1.0.0", 1420 | "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", 1421 | "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" 1422 | }, 1423 | "to-regex-range": { 1424 | "version": "5.0.1", 1425 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1426 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1427 | "requires": { 1428 | "is-number": "^7.0.0" 1429 | } 1430 | }, 1431 | "toidentifier": { 1432 | "version": "1.0.0", 1433 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 1434 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 1435 | }, 1436 | "touch": { 1437 | "version": "3.1.0", 1438 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", 1439 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", 1440 | "requires": { 1441 | "nopt": "~1.0.10" 1442 | }, 1443 | "dependencies": { 1444 | "nopt": { 1445 | "version": "1.0.10", 1446 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 1447 | "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", 1448 | "requires": { 1449 | "abbrev": "1" 1450 | } 1451 | } 1452 | } 1453 | }, 1454 | "type-fest": { 1455 | "version": "0.8.1", 1456 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", 1457 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" 1458 | }, 1459 | "type-is": { 1460 | "version": "1.6.18", 1461 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1462 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1463 | "requires": { 1464 | "media-typer": "0.3.0", 1465 | "mime-types": "~2.1.24" 1466 | } 1467 | }, 1468 | "typedarray-to-buffer": { 1469 | "version": "3.1.5", 1470 | "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", 1471 | "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", 1472 | "requires": { 1473 | "is-typedarray": "^1.0.0" 1474 | } 1475 | }, 1476 | "undefsafe": { 1477 | "version": "2.0.3", 1478 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", 1479 | "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", 1480 | "requires": { 1481 | "debug": "^2.2.0" 1482 | }, 1483 | "dependencies": { 1484 | "debug": { 1485 | "version": "2.6.9", 1486 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1487 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1488 | "requires": { 1489 | "ms": "2.0.0" 1490 | } 1491 | }, 1492 | "ms": { 1493 | "version": "2.0.0", 1494 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1495 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1496 | } 1497 | } 1498 | }, 1499 | "unique-string": { 1500 | "version": "2.0.0", 1501 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", 1502 | "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", 1503 | "requires": { 1504 | "crypto-random-string": "^2.0.0" 1505 | } 1506 | }, 1507 | "unpipe": { 1508 | "version": "1.0.0", 1509 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1510 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1511 | }, 1512 | "update-notifier": { 1513 | "version": "4.1.0", 1514 | "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.0.tgz", 1515 | "integrity": "sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew==", 1516 | "requires": { 1517 | "boxen": "^4.2.0", 1518 | "chalk": "^3.0.0", 1519 | "configstore": "^5.0.1", 1520 | "has-yarn": "^2.1.0", 1521 | "import-lazy": "^2.1.0", 1522 | "is-ci": "^2.0.0", 1523 | "is-installed-globally": "^0.3.1", 1524 | "is-npm": "^4.0.0", 1525 | "is-yarn-global": "^0.3.0", 1526 | "latest-version": "^5.0.0", 1527 | "pupa": "^2.0.1", 1528 | "semver-diff": "^3.1.1", 1529 | "xdg-basedir": "^4.0.0" 1530 | } 1531 | }, 1532 | "url-parse-lax": { 1533 | "version": "3.0.0", 1534 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", 1535 | "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", 1536 | "requires": { 1537 | "prepend-http": "^2.0.0" 1538 | } 1539 | }, 1540 | "util-deprecate": { 1541 | "version": "1.0.2", 1542 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1543 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1544 | }, 1545 | "utils-merge": { 1546 | "version": "1.0.1", 1547 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1548 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 1549 | }, 1550 | "vary": { 1551 | "version": "1.1.2", 1552 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1553 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 1554 | }, 1555 | "widest-line": { 1556 | "version": "3.1.0", 1557 | "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", 1558 | "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", 1559 | "requires": { 1560 | "string-width": "^4.0.0" 1561 | }, 1562 | "dependencies": { 1563 | "ansi-regex": { 1564 | "version": "5.0.0", 1565 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 1566 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" 1567 | }, 1568 | "emoji-regex": { 1569 | "version": "8.0.0", 1570 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1571 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 1572 | }, 1573 | "is-fullwidth-code-point": { 1574 | "version": "3.0.0", 1575 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1576 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" 1577 | }, 1578 | "string-width": { 1579 | "version": "4.2.0", 1580 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", 1581 | "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", 1582 | "requires": { 1583 | "emoji-regex": "^8.0.0", 1584 | "is-fullwidth-code-point": "^3.0.0", 1585 | "strip-ansi": "^6.0.0" 1586 | } 1587 | }, 1588 | "strip-ansi": { 1589 | "version": "6.0.0", 1590 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 1591 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 1592 | "requires": { 1593 | "ansi-regex": "^5.0.0" 1594 | } 1595 | } 1596 | } 1597 | }, 1598 | "wrappy": { 1599 | "version": "1.0.2", 1600 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1601 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1602 | }, 1603 | "write-file-atomic": { 1604 | "version": "3.0.3", 1605 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", 1606 | "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", 1607 | "requires": { 1608 | "imurmurhash": "^0.1.4", 1609 | "is-typedarray": "^1.0.0", 1610 | "signal-exit": "^3.0.2", 1611 | "typedarray-to-buffer": "^3.1.5" 1612 | } 1613 | }, 1614 | "xdg-basedir": { 1615 | "version": "4.0.0", 1616 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", 1617 | "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" 1618 | } 1619 | } 1620 | } 1621 | --------------------------------------------------------------------------------