├── .gitignore ├── slides.pdf ├── CookingMasters ├── images │ ├── icons │ │ ├── icon.png │ │ └── icon-maskable.png │ ├── original │ │ ├── asado.png │ │ ├── asado.jpeg │ │ ├── ddl-brownies.png │ │ ├── laptop-recipe.png │ │ ├── mobile-recipe.png │ │ ├── tablet-recipe.png │ │ ├── vegetarian-pho.png │ │ ├── southwest-nachos.png │ │ ├── calamari-and-shrimp-pasta.png │ │ ├── fish-tacos-with-pickled-onion.png │ │ ├── pork-tenderloin-with-kale-and-swee-potato.png │ │ ├── permissions-image-laptop.svg │ │ └── permissions-image-mobile-tablet.svg │ ├── icon-permissions.svg │ ├── permissions.svg │ └── logo.svg ├── app.webmanifest ├── scripts │ ├── Router.js │ ├── Cooking.js │ └── app.js ├── index.html ├── styles.css └── data │ └── recipes.json ├── README.md └── samples ├── public ├── gpt.js ├── playground │ ├── app.js │ ├── index.html │ └── styles.css └── chat │ ├── app.js │ ├── index.html │ └── styles.css ├── package.json ├── server.js └── package-lock.json /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | -------------------------------------------------------------------------------- /slides.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firtman/chatgpt-webdev/HEAD/slides.pdf -------------------------------------------------------------------------------- /CookingMasters/images/icons/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firtman/chatgpt-webdev/HEAD/CookingMasters/images/icons/icon.png -------------------------------------------------------------------------------- /CookingMasters/images/original/asado.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firtman/chatgpt-webdev/HEAD/CookingMasters/images/original/asado.png -------------------------------------------------------------------------------- /CookingMasters/images/original/asado.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firtman/chatgpt-webdev/HEAD/CookingMasters/images/original/asado.jpeg -------------------------------------------------------------------------------- /CookingMasters/images/icons/icon-maskable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firtman/chatgpt-webdev/HEAD/CookingMasters/images/icons/icon-maskable.png -------------------------------------------------------------------------------- /CookingMasters/images/original/ddl-brownies.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firtman/chatgpt-webdev/HEAD/CookingMasters/images/original/ddl-brownies.png -------------------------------------------------------------------------------- /CookingMasters/images/original/laptop-recipe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firtman/chatgpt-webdev/HEAD/CookingMasters/images/original/laptop-recipe.png -------------------------------------------------------------------------------- /CookingMasters/images/original/mobile-recipe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firtman/chatgpt-webdev/HEAD/CookingMasters/images/original/mobile-recipe.png -------------------------------------------------------------------------------- /CookingMasters/images/original/tablet-recipe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firtman/chatgpt-webdev/HEAD/CookingMasters/images/original/tablet-recipe.png -------------------------------------------------------------------------------- /CookingMasters/images/original/vegetarian-pho.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firtman/chatgpt-webdev/HEAD/CookingMasters/images/original/vegetarian-pho.png -------------------------------------------------------------------------------- /CookingMasters/images/original/southwest-nachos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firtman/chatgpt-webdev/HEAD/CookingMasters/images/original/southwest-nachos.png -------------------------------------------------------------------------------- /CookingMasters/images/original/calamari-and-shrimp-pasta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firtman/chatgpt-webdev/HEAD/CookingMasters/images/original/calamari-and-shrimp-pasta.png -------------------------------------------------------------------------------- /CookingMasters/images/original/fish-tacos-with-pickled-onion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firtman/chatgpt-webdev/HEAD/CookingMasters/images/original/fish-tacos-with-pickled-onion.png -------------------------------------------------------------------------------- /CookingMasters/images/original/pork-tenderloin-with-kale-and-swee-potato.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firtman/chatgpt-webdev/HEAD/CookingMasters/images/original/pork-tenderloin-with-kale-and-swee-potato.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Frontend Masters](https://static.frontendmasters.com/assets/brand/logos/full.png)][fem] 2 | 3 | This is a companion repo for the [First Look at ChatGPT for Web Developers][course] course on [Frontend Masters][fem]. 4 | 5 | [fem]: https://frontendmasters.com 6 | [course]: https://frontendmasters.com/courses/chatgpt-api/ 7 | -------------------------------------------------------------------------------- /samples/public/gpt.js: -------------------------------------------------------------------------------- 1 | export async function callAPI(endpoint, data) { 2 | const response = await fetch(endpoint, { 3 | method: 'POST', 4 | headers: { 5 | 'Content-Type': 'application/json', 6 | }, 7 | body: JSON.stringify(data) 8 | }) 9 | return await response.json(); 10 | } 11 | -------------------------------------------------------------------------------- /samples/public/playground/app.js: -------------------------------------------------------------------------------- 1 | 2 | async function send() { 3 | const prompt = document.querySelector("#prompt").value; 4 | 5 | const response = await fetch("/api/general", { 6 | method: 'POST', 7 | headers: { 8 | 'Content-Type': 'application/json', 9 | }, 10 | body: JSON.stringify({prompt}) 11 | }) 12 | const output = await response.json(); 13 | document.querySelector("output").textContent = output; 14 | 15 | 16 | } -------------------------------------------------------------------------------- /samples/public/chat/app.js: -------------------------------------------------------------------------------- 1 | const OPENAI_KEY = "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"; 2 | const price = 0.0002/1000; 3 | 4 | const messages = []; 5 | let totalTokens = 0; 6 | 7 | async function sendChat() { 8 | const prompt = document.querySelector("#prompt").value; 9 | document.querySelector("#prompt").value = ""; 10 | 11 | // TODO make query and parse results 12 | 13 | document.querySelector("#prompt").value = ""; 14 | document.querySelector("input").focus(); 15 | } -------------------------------------------------------------------------------- /samples/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Chat GPT API and Samples", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "server.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "nodemon server.js" 9 | }, 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "cors": "^2.8.5", 14 | "express": "^4.18.2", 15 | "openai": "^3.2.1" 16 | }, 17 | "devDependencies": { 18 | "nodemon": "^2.0.22" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /samples/public/playground/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | ChatGPT for Web Developers 8 | 9 | 10 | 11 | 12 |
13 |

ChatGPT for Web Developers

14 |
15 | 16 | 17 |
18 | 19 | 20 | 21 |
22 | 23 | -------------------------------------------------------------------------------- /samples/server.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | const OPENAI_KEY = "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"; 4 | 5 | const path = require('path'); 6 | const express = require('express'); 7 | const cors = require('cors'); 8 | const app = express(); 9 | 10 | app.use(express.json()); // parse JSON requests 11 | app.use(cors()); 12 | app.use(express.static(path.join(__dirname, 'public'))); 13 | 14 | 15 | app.post('/api/chat', async (req, res) => { 16 | 17 | }); 18 | 19 | app.post('/api/general', async (req, res) => { 20 | 21 | }); 22 | 23 | app.post('/api/image', async (req, res) => { 24 | 25 | }) 26 | 27 | app.post('/api/recipe', async (req, res) => { 28 | 29 | }); 30 | 31 | app.listen(3000, () => { 32 | console.log('Server started on port 3000'); 33 | }); 34 | -------------------------------------------------------------------------------- /samples/public/chat/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | ChatGPT for Web Developers 8 | 9 | 10 | 11 | 12 |
13 |

ChatGPT for Web Developers

14 | 17 | 18 | 19 | 20 |
21 | 22 | 23 |
24 |
25 | 26 | -------------------------------------------------------------------------------- /samples/public/playground/styles.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | font-family: Arial, Helvetica, sans-serif; 4 | } 5 | 6 | main { 7 | display: flex; 8 | flex-direction: column; 9 | padding: 10px; 10 | } 11 | 12 | 13 | ul { 14 | list-style: none; 15 | padding: 0; 16 | } 17 | 18 | #chatbox { 19 | background-color: black; 20 | color: white; 21 | position: fixed; 22 | bottom: 0; 23 | padding: 10px; 24 | } 25 | 26 | 27 | 28 | textarea { 29 | padding: 8px; 30 | width: 90%; 31 | height: 300px; 32 | min-width: 300px;; 33 | background-color: #444; 34 | color: white; 35 | font-size: 18px; 36 | display: block; 37 | } 38 | 39 | button { 40 | border: 0; 41 | background-color: orangered; 42 | color: white; 43 | font-size: large; 44 | padding: 10px 30px; 45 | margin: 10px 0; 46 | } 47 | 48 | output { 49 | background-color: beige; 50 | font-size: large; 51 | padding: 5px; 52 | font-family: monospace; 53 | } -------------------------------------------------------------------------------- /CookingMasters/images/icon-permissions.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /CookingMasters/app.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Coffee Masters", 3 | "short_name": "CoffeeMasters", 4 | "theme_color": "#43281C", 5 | "display": "standalone", 6 | "background_color": "#EFEFEF", 7 | "start_url": "/", 8 | "scope": "/", 9 | "description": "The app for order at Coffee Masters, the best coffee shop in the Frontend world, by Frontend Masters.", 10 | "icons": [ 11 | { 12 | "src": "images/icons/icon.png", 13 | "sizes": "1024x1024", 14 | "type": "image/png" 15 | }, 16 | { 17 | "src": "images/icons/icon-maskable.png", 18 | "sizes": "512x512", 19 | "type": "image/png", 20 | "purpose": "maskable" 21 | } 22 | ], 23 | "screenshots": [ 24 | { 25 | "src": "images/screen1.jpg", 26 | "type": "image/jpeg" 27 | }, 28 | { 29 | "src": "images/screen2.jpg", 30 | "type": "image/jpeg" 31 | } 32 | ] 33 | } -------------------------------------------------------------------------------- /CookingMasters/images/permissions.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /CookingMasters/images/original/permissions-image-laptop.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /samples/public/chat/styles.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | font-family: Arial, Helvetica, sans-serif; 4 | } 5 | 6 | main { 7 | display: flex; 8 | flex-direction: column; 9 | padding: 10px; 10 | } 11 | 12 | ul { 13 | list-style: none; 14 | padding: 0; 15 | } 16 | 17 | #chatbox { 18 | background-color: black; 19 | color: white; 20 | position: fixed; 21 | bottom: 0; 22 | padding: 10px; 23 | } 24 | 25 | ul { 26 | flex-grow: 10; 27 | padding-bottom: 50px; 28 | } 29 | 30 | ul li::before { 31 | content: '🤖' 32 | } 33 | 34 | ul li:has(b)::before { 35 | content: '🧑' 36 | } 37 | 38 | input { 39 | padding: 8px; 40 | width: 50%; 41 | min-width: 300px;; 42 | background-color: #444; 43 | color: white; 44 | } 45 | 46 | button { 47 | border: 0; 48 | background-color: orangered; 49 | color: white; 50 | } 51 | 52 | output { 53 | background-color: beige; 54 | font-size: small; 55 | position: absolute; 56 | top: 0; 57 | right: 0; 58 | padding: 5px; 59 | } -------------------------------------------------------------------------------- /CookingMasters/images/original/permissions-image-mobile-tablet.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /CookingMasters/scripts/Router.js: -------------------------------------------------------------------------------- 1 | import { renderRecipeDetails } from "./app.js"; 2 | 3 | const Router = { 4 | init: () => { 5 | // It listen for history changes 6 | window.addEventListener('popstate', event => { 7 | Router.go(event.state.route, false); 8 | }); 9 | // Process initial URL 10 | Router.go(location.pathname); 11 | }, 12 | go: (route, addToHistory=true) => { 13 | if (addToHistory) { 14 | history.pushState({ route }, '', route); 15 | } 16 | document.querySelectorAll("section.page") 17 | .forEach(s => s.style.display = "none"); 18 | switch (route) { 19 | case "/": 20 | document.querySelector("section#home").style.display = "block"; 21 | break; 22 | default: 23 | if (route.startsWith("/recipe")) { 24 | document.querySelector("section#recipe").style.display = "block"; 25 | const id = route.substring(route.lastIndexOf("/")+1); 26 | renderRecipeDetails(id); 27 | } 28 | break; 29 | } 30 | window.scrollX = 0; 31 | } 32 | } 33 | 34 | export default Router; -------------------------------------------------------------------------------- /CookingMasters/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Cooking Masters 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 |

Recipe of the Week

39 |
40 | 41 |
42 |
43 |

Most Cooked

44 |
45 | 46 |
47 |
48 | 49 | 50 |
51 |

All Recipes

52 |
    53 | 54 |
55 |
56 |
57 | 58 | 59 |
60 |
61 |
62 |

63 | 64 | 65 |
66 | 67 |
68 | 69 | 87 | 88 |
89 |

Description

90 |

91 | 92 |

Ingredients

93 |
94 |
95 |
96 |
97 | 98 | 105 | 106 | 107 | -------------------------------------------------------------------------------- /CookingMasters/scripts/Cooking.js: -------------------------------------------------------------------------------- 1 | import { alertTimerFinished } from "./app.js"; 2 | 3 | // WebKit prefix still mandatory for iPad and Safari on macOS 4 | export const Cooking = { 5 | init: (element) => { 6 | Cooking.root = element; 7 | Cooking.timers = []; 8 | // ADDED 9 | const handler = e => { 10 | if (!document.fullscreenElement && !document.webkitFullscreenElement) { 11 | Cooking.root.hidden = true; 12 | } 13 | } 14 | document.addEventListener("fullscreenchange", handler); 15 | document.addEventListener("webkitfullscreenchange", handler); 16 | 17 | Cooking 18 | }, 19 | start: (recipe) => { 20 | Cooking.root.hidden = false; 21 | Cooking.recipe = recipe; 22 | 23 | document.querySelector("#cooking h2").textContent = `${recipe.name}: Steps`; 24 | Cooking.step(0); 25 | 26 | // ADDED 27 | if (Cooking.root.requestFullscreen) { 28 | Cooking.root.requestFullscreen(); 29 | } else { 30 | if (Cooking.root.webkitRequestFullscreen) { 31 | Cooking.root.webkitRequestFullscreen(); 32 | } 33 | } 34 | }, 35 | end: () => { 36 | document.exitFullscreen(); 37 | }, 38 | next: () => { 39 | Cooking.step(Cooking.currentStep + 1); 40 | }, 41 | previous: () => { 42 | Cooking.step(Cooking.currentStep - 1); 43 | }, 44 | addTimer: (name, minutes) => { 45 | // Change 1 with minutes for real world 46 | const li = document.createElement("li"); 47 | li.innerHTML = ` 48 |
49 |
${name}
50 |

${String(minutes).padStart(2, '0')}:00

51 |
52 | `; 53 | 54 | document.querySelector("#cooking ul").appendChild(li); 55 | const timer = { 56 | name, 57 | duration: minutes*60, 58 | current: minutes*60, 59 | element: li, 60 | } 61 | const timerFunction = ()=> { 62 | Cooking.updateTimer(timer) 63 | }; 64 | 65 | timer.interval = setInterval(timerFunction.bind(timer), 1000); 66 | li.onclick = () => { 67 | li.remove(); 68 | clearInterval(timer.interval); 69 | } 70 | Cooking.timers.push(timer); 71 | }, 72 | updateTimer: (timer) => { 73 | timer.current--; 74 | timer.element.querySelector("p").textContent = `${String(Math.floor(timer.current / 60)).padStart(2, '0')}:${String(timer.current % 60).padStart(2, '0')}` 75 | if (timer.current<20) { 76 | timer.element.style.color = "red"; 77 | } 78 | if (timer.current==0) { 79 | alertTimerFinished(timer); 80 | timer.element.querySelector("article").style.color = "white"; 81 | timer.element.querySelector("article").style.backgroundColor = "red"; 82 | clearInterval(timer.interval); 83 | } 84 | }, 85 | step: (index) => { 86 | Cooking.currentStep = index; 87 | if (index>Cooking.recipe.steps.length-1) { 88 | Cooking.end(); 89 | } 90 | const step = Cooking.recipe.steps[index]; 91 | document.querySelector("#cooking h3").textContent = `${index+1} of ${Cooking.recipe.steps.length} | ${step.name}`; 92 | document.querySelector("#cooking .step").innerHTML = step.description ; 93 | 94 | if (step.timer) { 95 | const timerButton = document.createElement("button"); 96 | timerButton.textContent = `Add timer for ${step.timer} minutes`; 97 | timerButton.onclick = () => { 98 | Cooking.addTimer(step.name, step.timer); 99 | } 100 | document.querySelector("#cooking .step").appendChild(timerButton); 101 | 102 | } 103 | 104 | document.querySelector("#btn-previous").disabled = index==0; 105 | document.querySelector("#btn-next").textContent = index==Cooking.recipe.steps.length-1 ? "You finished!" : "Next Step"; 106 | 107 | } 108 | } -------------------------------------------------------------------------------- /CookingMasters/scripts/app.js: -------------------------------------------------------------------------------- 1 | import Router from './Router.js'; 2 | import { Cooking } from './Cooking.js'; 3 | 4 | window.app = {} 5 | app.router = Router; 6 | app.cooking = Cooking; 7 | app.recipes = []; 8 | 9 | window.addEventListener("DOMContentLoaded", () => { 10 | app.router.init(); 11 | app.cooking.init(document.querySelector("#cooking")); 12 | loadRecipes(); 13 | }); 14 | 15 | app.recipeAI = async () => { 16 | const ingredients = document.getElementById("ingredients"); 17 | const value = ingredients.value; 18 | ingredients.disabled = true; 19 | ingredients.value = "🤖 Our AI Chef is working..."; 20 | const response = await fetch("http://localhost:3000/api/recipe", { 21 | method: 'POST', 22 | headers: { 23 | 'Content-Type': 'application/json', 24 | }, 25 | body: JSON.stringify({"ingredients": value }) 26 | }) 27 | const jsonResponse = await response.json(); 28 | const recipe = JSON.parse(jsonResponse.content); 29 | console.log(recipe); 30 | if (recipe!=false) { 31 | app.recipes.push(recipe); 32 | const responseImg = await fetch("http://localhost:3000/api/image", { 33 | method: 'POST', 34 | headers: { 35 | 'Content-Type': 'application/json', 36 | }, 37 | body: JSON.stringify({"prompt": `A high-quality photograph of the meal ${recipe.name}: ${recipe.description}` }) 38 | }) 39 | const jsonImage = await responseImg.json(); 40 | recipe.image = jsonImage.url; 41 | const div = document.createElement("div"); 42 | document.getElementById("ai-recipe").appendChild(div); 43 | renderRecipe(div, recipe, "large"); 44 | } else { 45 | alert("Ingredients aren't valid") 46 | } 47 | ingredients.value = ""; 48 | ingredients.disabled = false; 49 | } 50 | 51 | export async function alertTimerFinished(timer) { 52 | console.log(`Timer finished: ${timer.name}`); 53 | 54 | } 55 | async function loadRecipes() { 56 | const response = await fetch("/data/recipes.json"); 57 | app.recipes = await response.json(); 58 | renderRecipes(); 59 | } 60 | 61 | function renderRecipes() { 62 | renderRecipe(document.querySelector("#recipe-week"), app.recipes[0], "large"); 63 | renderRecipe(document.querySelector("#recipe-most"), app.recipes[1], "large"); 64 | const theRest = app.recipes.slice(2); 65 | document.querySelector("#all ul").innerHTML = ""; 66 | theRest.forEach(r => { 67 | const li = document.createElement("li"); 68 | document.querySelector("#all ul").appendChild(li); 69 | renderRecipe(li, r, "small"); 70 | }) 71 | } 72 | 73 | function renderRecipe(element, recipe, className) { 74 | element.innerHTML = ` 75 | 76 | 77 |

${recipe.name}

78 |

${recipe.type} | ${Object.keys(recipe.ingredients).length} ingredients | ${recipe.duration} min

79 |
80 | ` 81 | } 82 | 83 | export async function renderRecipeDetails(id) { 84 | if (app.recipes.length==0) { 85 | await loadRecipes(); 86 | } 87 | const recipe = app.recipes.filter(r=>r.slug==id)[0]; 88 | document.querySelector("#recipe h2").textContent = recipe.name; 89 | document.querySelector("#recipe img").src = recipe.image; 90 | document.querySelector("#recipe .metadata").textContent = 91 | `${Object.keys(recipe.ingredients).length} ingredients | 92 | ${recipe.duration} minutes | ${recipe.type}`; 93 | document.querySelector("#recipe .description").textContent = recipe.description; 94 | 95 | const list = document.querySelector("#recipe dl"); 96 | list.innerHTML = ""; 97 | for (let ingredient in recipe.ingredients) { 98 | list.innerHTML += ` 99 |
${ingredient}
${recipe.ingredients[ingredient]}
100 | ` 101 | } 102 | document.querySelector("#recipe button").onclick = () => { 103 | app.cooking.start(recipe); 104 | } 105 | 106 | } -------------------------------------------------------------------------------- /CookingMasters/styles.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-surface: #F1F1F3; 3 | --primaryColor: #C06918; 4 | --secondaryColor: #333D29; 5 | --color3: #8D8D8D; 6 | --color4: #B08968; 7 | --color5: #DDB892; 8 | --color6: #EDE0D4; 9 | --highlight: #FBF2C6; 10 | } 11 | 12 | 13 | 14 | body { 15 | background-color: var(--background-surface); 16 | font-family: Helvetica, Arial, sans-serif; 17 | } 18 | 19 | textarea { 20 | width: 80%; 21 | height: 80px; 22 | font-size: 19px; 23 | } 24 | 25 | main a { 26 | text-decoration: none; 27 | color: black; 28 | display: block; 29 | } 30 | main a:hover { 31 | scale: 1.05; 32 | transition: scale 100ms; 33 | } 34 | 35 | main { 36 | max-width: 850px; 37 | margin: auto; 38 | } 39 | 40 | .form { 41 | margin-bottom: 20px; 42 | } 43 | 44 | body>header { 45 | max-width: 850px; 46 | margin: auto; 47 | display: flex; 48 | align-items: center; 49 | justify-content: center; 50 | } 51 | 52 | body>header * { 53 | flex-grow: 1; 54 | } 55 | 56 | 57 | 58 | footer { 59 | border-top: 1px solid var(--primaryColor); 60 | } 61 | 62 | footer div { 63 | max-width: 850px; 64 | margin: auto; 65 | margin-top: 18px; 66 | width: 100%; 67 | } 68 | 69 | footer a { 70 | color: var(--primaryColor); 71 | } 72 | 73 | footer p { 74 | font-size: 13px; 75 | color: var(--color3) 76 | } 77 | 78 | img#logo { 79 | width: 200px; 80 | } 81 | 82 | #btn-permissions { 83 | text-align: right; 84 | } 85 | 86 | #btn-permissions img { 87 | width: 40px; 88 | } 89 | 90 | ul { 91 | list-style: none; 92 | padding: 0; 93 | } 94 | 95 | h2 { 96 | font-size: 15px; 97 | } 98 | 99 | h3 { 100 | font-size: 13px; 101 | padding-bottom: 10px; 102 | border-bottom: 1px solid orange; 103 | margin-top: 24px; 104 | 105 | } 106 | 107 | .two-columns { 108 | display: flex; 109 | } 110 | 111 | .two-columns div:first-child { 112 | margin-right: 10px; 113 | } 114 | .two-columns div { 115 | flex-grow: 1; 116 | } 117 | 118 | h3, .recipe { 119 | width: 400px; 120 | } 121 | 122 | .recipe { 123 | background: white; 124 | border-radius: 15px; 125 | padding-bottom: 8px; 126 | box-shadow: 0px 6px 6px -10px rgba(0, 0, 0, 0.45), 6px 0 6px -10px rgba(0, 0, 0, 0.45);} 127 | 128 | .recipe h4 { 129 | margin: 0 0 0 12px; 130 | } 131 | 132 | .recipe p { 133 | margin: 4px 12px; 134 | font-size: 11px; 135 | color: var(--color3); 136 | } 137 | 138 | .recipe img { 139 | width: 100%; 140 | border-radius: 15px; 141 | } 142 | 143 | .recipe.small { 144 | width: 195px; 145 | } 146 | .recipe.small img { 147 | height: 96px; 148 | } 149 | 150 | section#all h3 { 151 | margin-top: 16px; 152 | width: 100%; 153 | } 154 | 155 | section#all ul { 156 | display: flex; 157 | flex-wrap: wrap; 158 | row-gap: 10px; 159 | column-gap: 10px; 160 | align-content: space-between; 161 | } 162 | 163 | 164 | button { 165 | background-color: var(--primaryColor); 166 | color: white; 167 | width: 300px; 168 | padding: 8px; 169 | font-size: 17px; 170 | border: 0; 171 | border-radius: 5px; 172 | } 173 | 174 | #recipe, #permissions { 175 | background-color: white; 176 | border-top-left-radius: 15px; 177 | border-top-right-radius: 15px; 178 | box-shadow: 0px -6px 6px -10px rgba(0, 0, 0, 0.45), 6px 0 16px -10px rgba(0, 0, 0, 0.45); 179 | padding-bottom: 10px; 180 | margin-bottom: 20px; 181 | } 182 | 183 | .page h2 { 184 | font-size: 40px; 185 | margin: 0; 186 | margin-top: 16px; 187 | } 188 | 189 | article h3 { 190 | border: 0; 191 | font-size: 1.15em; 192 | margin-bottom: 0; 193 | padding-bottom: 0; 194 | } 195 | 196 | .page dl, .page p { 197 | font-size: 0.9em; 198 | } 199 | 200 | .page header section { 201 | margin-right: 16px; 202 | padding-left: 16px; 203 | flex: 2 204 | } 205 | 206 | #recipe img { 207 | width: 300px; 208 | } 209 | 210 | dl { 211 | width: 300px; 212 | display: flex; 213 | flex-wrap: wrap; 214 | } 215 | 216 | dd, dt { 217 | display: block; 218 | flex-grow: 1; 219 | } 220 | dt { 221 | width: 200px; 222 | } 223 | dd { 224 | width: 90px; 225 | margin: 0; 226 | text-align: right; 227 | margin-bottom: 8px; 228 | color: var(--color3) 229 | } 230 | 231 | 232 | .page header img { 233 | flex-grow: 1; 234 | flex: 1; 235 | border-top-right-radius: 15px; 236 | } 237 | 238 | .page header { 239 | display: flex; 240 | } 241 | 242 | .page>section { 243 | margin: 16px; 244 | } 245 | 246 | #permissions { 247 | color: var(--secondaryColor) 248 | } 249 | 250 | #permissions dd, #permissions dt { 251 | width: 40%; 252 | } 253 | 254 | #permissions { 255 | text-align: center; 256 | } 257 | 258 | #permissions h2 { 259 | font-size: 24px; 260 | } 261 | 262 | #permissions button { 263 | width: auto; 264 | } 265 | 266 | #permissions img { 267 | width: 150px; 268 | margin-top: 24px; 269 | } 270 | 271 | #permissions h3 { 272 | width: auto; 273 | margin: 0; 274 | border: 0; 275 | text-align: right; 276 | font-weight: bold; 277 | padding: 0; 278 | } 279 | #permissions table { 280 | max-width: 400px; 281 | margin: auto; 282 | font-size: 15px; 283 | margin-top: 24px; 284 | column-gap: 10px; 285 | } 286 | 287 | #permissions td { 288 | height: 30px; 289 | vertical-align: center; 290 | padding: 12px; 291 | } 292 | 293 | #permissions button { 294 | font-size: 13px; 295 | } 296 | 297 | #permissions span { 298 | text-align: left; 299 | } 300 | 301 | #permissions button { 302 | width: 80px; 303 | } 304 | 305 | 306 | #cooking { 307 | background-color: var(--background-surface); 308 | padding: 36px; 309 | display: flex; 310 | flex-direction: column; 311 | flex-wrap: nowrap; 312 | justify-content: space-between; 313 | align-items: stretch; 314 | align-content: stretch; 315 | row-gap: 12px; 316 | } 317 | 318 | #cooking[hidden] { 319 | display: none; 320 | } 321 | 322 | #cooking h2 { 323 | color: var(--primaryColor); 324 | text-align: center; 325 | font-size: 22px; 326 | margin: 0; 327 | } 328 | 329 | #cooking h3 { 330 | text-align: center; 331 | font-size: 25px; 332 | width: auto; 333 | border: 0; 334 | margin: 0; 335 | } 336 | 337 | #cooking .step { 338 | background-color: white; 339 | padding: 18px; 340 | border-radius: 15px; 341 | font-size: 50px; 342 | flex-grow: 1; 343 | border: 2px solid var(--primaryColor) 344 | } 345 | 346 | #cooking .toolbar { 347 | width: 100%; 348 | display: flex; 349 | column-gap: 18px; 350 | align-items: stretch; 351 | margin: 0; 352 | } 353 | 354 | #cooking .timers { 355 | height: 100px; 356 | margin: 0; 357 | } 358 | 359 | #cooking button { 360 | width: 100%; 361 | } 362 | 363 | #cooking .status { 364 | background-color: white; 365 | margin: auto; 366 | border-radius: 15px; 367 | padding: 18px; 368 | margin: 18px 0; 369 | text-align: center; 370 | } 371 | 372 | #cooking .status span { 373 | font-size: 20px; 374 | padding: 0 20px; 375 | } 376 | 377 | #cooking .status span.on { 378 | opacity: 1; 379 | font-size: 25px; 380 | } 381 | 382 | #cooking .status span.off { 383 | opacity: 0.3 384 | } 385 | 386 | #cooking .timers ul { 387 | display: flex; 388 | text-align: center; 389 | margin: 0; 390 | column-gap: 16px; 391 | } 392 | 393 | #cooking .timer { 394 | background-color: white; 395 | border-radius: 15px; 396 | padding: 18px; 397 | text-align: center; 398 | width: 150px; 399 | } 400 | 401 | #cooking .timer h5 { 402 | margin: 0; 403 | } 404 | 405 | #cooking .timer p { 406 | font-size: 32px; 407 | margin: 0; 408 | } -------------------------------------------------------------------------------- /CookingMasters/images/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /CookingMasters/data/recipes.json: -------------------------------------------------------------------------------- 1 | [{ 2 | "slug": "fish-tacos", 3 | "name": "Fish Tacos with Pickled Onion", 4 | "type": "Main Meal", 5 | "duration": 60, 6 | "image": "images/original/fish-tacos-with-pickled-onion.png", 7 | "description": "Delicious fish tacos made with crispy breaded fish, fresh cilantro, and tangy pickled onions wrapped in a soft flour tortilla.", 8 | "ingredients": { 9 | "Red onion": "1", 10 | "Water": "1 cup", 11 | "Vinegar": "1 cup", 12 | "Sugar": "1 tablespoon", 13 | "Salt": "1 teaspoon", 14 | "White fish fillets": "1 pound", 15 | "Flour": "1 cup", 16 | "Egg": "1", 17 | "Breadcrumbs": "1 cup", 18 | "Vegetable oil": "for frying", 19 | "Flour tortillas": "8", 20 | "Cilantro": "1 bunch", 21 | "Lime": "1" 22 | }, 23 | "steps": [ 24 | { 25 | "name": "Pickle Onions", 26 | "description": "Thinly slice the red onion and set aside." 27 | }, 28 | { 29 | "name": "Prepare Pickling Liquid", 30 | "description": "In a small saucepan, combine the water, vinegar, sugar, and salt. Bring to a simmer, then remove from heat.", 31 | "timer": 5 32 | }, 33 | { 34 | "name": "Pickle Onions", 35 | "description": "Add the sliced onions to the pickling liquid and let sit for at least 30 minutes.", 36 | "timer": 30 37 | }, 38 | { 39 | "name": "Prepare Fish", 40 | "description": "Cut the fish fillets into 2-inch wide strips." 41 | }, 42 | { 43 | "name": "Bread Fish", 44 | "description": "Set up a breading station with three shallow dishes: one with flour, one with a beaten egg, and one with breadcrumbs. Coat each fish strip in flour, dip in egg, and then coat with breadcrumbs." 45 | }, 46 | { 47 | "name": "Fry Fish", 48 | "description": "Heat vegetable oil in a deep skillet over medium-high heat. Fry the breaded fish strips until golden brown and cooked through, about 3-4 minutes per side. Drain on paper towels." 49 | }, 50 | { 51 | "name": "Assemble Tacos", 52 | "description": "Place a piece of fried fish on a flour tortilla, top with pickled onions, chopped cilantro, and a squeeze of lime. Fold and serve." 53 | } 54 | ] 55 | }, 56 | { 57 | "name": "Vegetarian Pho", 58 | "slug": "vegetarian-pho", 59 | "image": "images/original/vegetarian-pho.png", 60 | "type": "Main Meal", 61 | "duration": 90, 62 | "description": "A flavorful and comforting vegetarian pho made with a rich, aromatic broth and loaded with veggies, rice noodles, and fresh herbs.", 63 | "ingredients": { 64 | "Vegetable oil": "1 tablespoon", 65 | "Onion": "1, halved", 66 | "Ginger": "4-inch piece, unpeeled", 67 | "Vegetable broth": "8 cups", 68 | "Star anise": "3", 69 | "Cinnamon stick": "1", 70 | "Cardamom pods": "3", 71 | "Cloves": "5", 72 | "Coriander seeds": "1 tablespoon", 73 | "Soy sauce": "3 tablespoons", 74 | "Brown sugar": "1 tablespoon", 75 | "Rice noodles": "8 ounces", 76 | "Assorted vegetables": "3 cups, e.g., mushrooms, bok choy, broccoli, carrots", 77 | "Lime": "1", 78 | "Bean sprouts": "1 cup", 79 | "Fresh basil": "1 cup", 80 | "Fresh mint": "1 cup", 81 | "Fresh cilantro": "1 cup", 82 | "Green onions": "2, thinly sliced", 83 | "Jalapeno": "1, thinly sliced", 84 | "Sriracha": "to taste", 85 | "Hoisin sauce": "to taste" 86 | }, 87 | "steps": [ 88 | { 89 | "name": "Char Onion and Ginger", 90 | "description": "Heat vegetable oil in a large pot over medium-high heat. Add onion halves and ginger, cut side down, and cook until charred, about 5 minutes." 91 | }, 92 | { 93 | "name": "Prepare Broth", 94 | "description": "Add vegetable broth, star anise, cinnamon stick, cardamom pods, cloves, and coriander seeds to the pot. Bring to a boil, then reduce heat and simmer for 30 minutes." 95 | }, 96 | { 97 | "name": "Strain Broth", 98 | "description": "Strain the broth into a large bowl, discarding the solids. Stir in soy sauce and brown sugar, then return the broth to the pot and keep warm over low heat." 99 | }, 100 | { 101 | "name": "Prepare Noodles", 102 | "description": "Cook rice noodles according to package instructions, then drain and set aside." 103 | }, 104 | { 105 | "name": "Prepare Vegetables", 106 | "description": "Steam or sauté your choice of vegetables until just tender." 107 | }, 108 | { 109 | "name": "Assemble Pho", 110 | "description": "Divide the cooked noodles among 4 serving bowls. Ladle the hot broth over the noodles, then top with cooked vegetables, a squeeze of lime, bean sprouts, fresh herbs, green onions, and jalapeno slices." 111 | }, 112 | { 113 | "name": "Serve", 114 | "description": "Serve with sriracha and hoisin sauce on the side for guests to season their pho to taste." 115 | } 116 | ] 117 | }, 118 | { 119 | "name": "Argentinian Asado", 120 | "type": "Main Meal", 121 | "image": "images/original/asado.png", 122 | "slug": "asado", 123 | "duration": 240, 124 | "description": "A traditional Argentinian asado featuring various cuts of meat grilled to perfection over a wood or charcoal fire, served with chimichurri sauce.", 125 | "ingredients": { 126 | "Beef short ribs": "4 pounds", 127 | "Pork ribs": "4 pounds", 128 | "Sausages": "2 pounds, e.g., chorizo, morcilla", 129 | "Sweetbreads": "1 pound", 130 | "Chicken": "1, cut into pieces", 131 | "Sea salt": "to taste", 132 | "Wood or charcoal": "for grilling", 133 | "Chimichurri sauce": "to the taste" 134 | }, 135 | "steps": [ 136 | { 137 | "name": "Prepare Chimichurri Sauce", 138 | "description": "In a small bowl, combine the chopped parsley, oregano, minced garlic, red pepper flakes, red wine vinegar, olive oil, salt, and black pepper. Mix well and set aside." 139 | }, 140 | { 141 | "name": "Season Meat", 142 | "description": "Generously season the beef short ribs, pork ribs, sausages, sweetbreads, and chicken pieces with sea salt." 143 | }, 144 | { 145 | "name": "Prepare Grill", 146 | "description": "Build a wood or charcoal fire in a grill or fire pit, allowing it to burn down until the coals are glowing red and covered with white ash. Set up a two-zone fire, with one side for direct grilling and the other for indirect cooking." 147 | }, 148 | { 149 | "name": "Grill Meat", 150 | "description": "Place the beef short ribs, pork ribs, and sweetbreads over the indirect heat side of the grill. Cook for 1.5-2 hours, turning occasionally, until tender and cooked through.", 151 | "timer": 90 152 | }, 153 | { 154 | "name": "Grill Chicken", 155 | "description": "Add the sausages and chicken pieces to the direct heat side of the grill during the last 30-45 minutes of cooking, turning occasionally, until cooked through", 156 | "timer": 30 157 | }, 158 | { 159 | "name": "Serve", 160 | "description": "Arrange the grilled meats on a large platter and serve with the chimichurri sauce on the side." 161 | } 162 | ] 163 | }, 164 | { 165 | "name": "Southwest Nachos", 166 | "type": "Appetizer", 167 | "slug": "southwest-nachos", 168 | "image": "images/original/southwest-nachos.png", 169 | "duration": 30, 170 | "description": "A delicious and colorful appetizer of nachos loaded with Southwest-inspired flavors, including black beans, corn, tomatoes, and avocado.", 171 | "ingredients": { 172 | "Tortilla chips": "1 large bag", 173 | "Black beans": "1 can (15 ounces), drained and rinsed", 174 | "Frozen corn": "1 cup, thawed", 175 | "Cherry tomatoes": "1 cup, halved", 176 | "Jalapenos": "1-2, sliced", 177 | "Red onion": "1/4 cup, diced", 178 | "Cheddar cheese": "2 cups, shredded", 179 | "Monterey Jack cheese": "2 cups, shredded", 180 | "Avocado": "1, diced", 181 | "Fresh cilantro": "1/4 cup, chopped", 182 | "Sour cream": "for serving", 183 | "Salsa": "for serving" 184 | }, 185 | "steps": [ 186 | { 187 | "name": "Preheat Oven", 188 | "description": "Preheat your oven to 350°F (175°C)." 189 | }, 190 | { 191 | "name": "Assemble Nachos", 192 | "description": "On a large, oven-safe platter or baking sheet, spread out an even layer of tortilla chips. Top with black beans, corn, cherry tomatoes, jalapenos, red onion, and a generous amount of shredded cheddar and Monterey Jack cheese." 193 | }, 194 | { 195 | "name": "Bake", 196 | "description": "Bake the nachos in the preheated oven for 10-15 minutes, or until the cheese is melted and bubbly." 197 | }, 198 | { 199 | "name": "Garnish", 200 | "description": "Remove the nachos from the oven, and top with diced avocado and chopped fresh cilantro." 201 | }, 202 | { 203 | "name": "Serve", 204 | "description": "Serve the Southwest Nachos hot, alongside sour cream and salsa for dipping." 205 | } 206 | ] 207 | }, 208 | { 209 | "name": "Calamari and Shrimp Pasta", 210 | "type": "Main Meal", 211 | "slug": "calamari-shrimp-pasta", 212 | "image": "images/original/calamari-and-shrimp-pasta.png", 213 | "duration": 45, 214 | "description": "A delicious and easy-to-make pasta dish featuring tender calamari and shrimp tossed in a flavorful garlic and tomato sauce.", 215 | "ingredients": { 216 | "Olive oil": "2 tablespoons", 217 | "Garlic": "4 cloves, minced", 218 | "Crushed red pepper flakes": "1/4 teaspoon", 219 | "Canned crushed tomatoes": "1 can (28 ounces)", 220 | "White wine": "1/2 cup", 221 | "Salt": "to taste", 222 | "Black pepper": "to taste", 223 | "Calamari": "1 pound, cleaned and sliced into rings", 224 | "Shrimp": "1 pound, peeled and deveined", 225 | "Linguine": "1 pound", 226 | "Fresh parsley": "1/4 cup, chopped", 227 | "Lemon": "1, zested and juiced" 228 | }, 229 | "steps": [ 230 | { 231 | "name": "Prepare Sauce", 232 | "description": "In a large skillet, heat the olive oil over medium heat. Add the minced garlic and red pepper flakes, and cook until fragrant, about 1 minute. Stir in the crushed tomatoes, white wine, salt, and black pepper. Bring to a simmer, then reduce heat and cook for 20 minutes.", 233 | "timer": 20 234 | }, 235 | { 236 | "name": "Cook Pasta", 237 | "description": "Meanwhile, bring a large pot of salted water to a boil. Cook the linguine according to package instructions until al dente, then drain." 238 | }, 239 | { 240 | "name": "Add Seafood", 241 | "description": "Stir the calamari and shrimp into the tomato sauce, and cook for 3-4 minutes, or until the shrimp are pink and cooked through and the calamari is tender.", 242 | "timer": 3 243 | }, 244 | { 245 | "name": "Toss and Serve", 246 | "description": "Add the cooked linguine to the skillet with the sauce and seafood, and toss to combine. Stir in the chopped parsley, lemon zest, and lemon juice. Serve immediately." 247 | } 248 | ] 249 | }, 250 | { 251 | "name": "Dulce de Leche Brownies", 252 | "type": "Dessert", 253 | "slug": "ddl-brownies", 254 | "image": "images/original/ddl-brownies.png", 255 | "duration": 60, 256 | "description": "Rich, fudgy brownies swirled with velvety dulce de leche, creating a decadent and irresistible dessert.", 257 | "ingredients": { 258 | "Unsalted butter": "1 cup (2 sticks)", 259 | "Semisweet chocolate chips": "1 1/2 cups", 260 | "Granulated sugar": "1 1/2 cups", 261 | "Eggs": "4", 262 | "Vanilla extract": "1 teaspoon", 263 | "All-purpose flour": "1 cup", 264 | "Cocoa powder": "1/3 cup", 265 | "Salt": "1/2 teaspoon", 266 | "Dulce de leche": "1 cup" 267 | }, 268 | "steps": [ 269 | { 270 | "name": "Preheat Oven", 271 | "description": "Preheat your oven to 350°F (175°C). Grease a 9x13-inch baking pan and line with parchment paper, leaving an overhang on two sides." 272 | }, 273 | { 274 | "name": "Melt Butter and Chocolate", 275 | "description": "In a large microwave-safe bowl, combine the butter and semisweet chocolate chips. Microwave in 30-second intervals, stirring after each, until completely melted and smooth." 276 | }, 277 | { 278 | "name": "Mix Wet Ingredients", 279 | "description": "Add the granulated sugar to the melted chocolate mixture, stirring until combined. Stir in the eggs, one at a time, followed by the vanilla extract." 280 | }, 281 | { 282 | "name": "Mix Dry Ingredients", 283 | "description": "In a separate bowl, whisk together the all-purpose flour, cocoa powder, and salt. Gradually add the dry ingredients to the wet ingredients, stirring until just combined." 284 | }, 285 | { 286 | "name": "Assemble Brownies", 287 | "description": "Spread half of the brownie batter in the prepared pan. Drop spoonfuls of half the dulce de leche on top, then swirl with a knife. Add the remaining brownie batter, followed by the remaining dulce de leche, swirling again with a knife." 288 | }, 289 | { 290 | "name": "Bake", 291 | "description": "Bake the brownies in the preheated oven for 35-40 minutes, or until a toothpick inserted into the center comes out with moist crumbs attached. Do not overbake.", 292 | "timer": 35 293 | }, 294 | { 295 | "name": "Cool and Serve", 296 | "description": "Allow the brownies to cool completely in the pan on a wire rack. Use the parchment paper overhang to lift the brownies from the pan, then cut into squares and serve." 297 | } 298 | ] 299 | } 300 | ] -------------------------------------------------------------------------------- /samples/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "samples", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "samples", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "cors": "^2.8.5", 13 | "express": "^4.18.2", 14 | "openai": "^3.2.1" 15 | }, 16 | "devDependencies": { 17 | "nodemon": "^2.0.22" 18 | } 19 | }, 20 | "node_modules/abbrev": { 21 | "version": "1.1.1", 22 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 23 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 24 | "dev": true 25 | }, 26 | "node_modules/accepts": { 27 | "version": "1.3.8", 28 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 29 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 30 | "dependencies": { 31 | "mime-types": "~2.1.34", 32 | "negotiator": "0.6.3" 33 | }, 34 | "engines": { 35 | "node": ">= 0.6" 36 | } 37 | }, 38 | "node_modules/anymatch": { 39 | "version": "3.1.3", 40 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 41 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 42 | "dev": true, 43 | "dependencies": { 44 | "normalize-path": "^3.0.0", 45 | "picomatch": "^2.0.4" 46 | }, 47 | "engines": { 48 | "node": ">= 8" 49 | } 50 | }, 51 | "node_modules/array-flatten": { 52 | "version": "1.1.1", 53 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 54 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 55 | }, 56 | "node_modules/asynckit": { 57 | "version": "0.4.0", 58 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 59 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 60 | }, 61 | "node_modules/axios": { 62 | "version": "0.26.1", 63 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", 64 | "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", 65 | "dependencies": { 66 | "follow-redirects": "^1.14.8" 67 | } 68 | }, 69 | "node_modules/balanced-match": { 70 | "version": "1.0.2", 71 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 72 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 73 | "dev": true 74 | }, 75 | "node_modules/binary-extensions": { 76 | "version": "2.2.0", 77 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 78 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 79 | "dev": true, 80 | "engines": { 81 | "node": ">=8" 82 | } 83 | }, 84 | "node_modules/body-parser": { 85 | "version": "1.20.1", 86 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", 87 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", 88 | "dependencies": { 89 | "bytes": "3.1.2", 90 | "content-type": "~1.0.4", 91 | "debug": "2.6.9", 92 | "depd": "2.0.0", 93 | "destroy": "1.2.0", 94 | "http-errors": "2.0.0", 95 | "iconv-lite": "0.4.24", 96 | "on-finished": "2.4.1", 97 | "qs": "6.11.0", 98 | "raw-body": "2.5.1", 99 | "type-is": "~1.6.18", 100 | "unpipe": "1.0.0" 101 | }, 102 | "engines": { 103 | "node": ">= 0.8", 104 | "npm": "1.2.8000 || >= 1.4.16" 105 | } 106 | }, 107 | "node_modules/brace-expansion": { 108 | "version": "1.1.11", 109 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 110 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 111 | "dev": true, 112 | "dependencies": { 113 | "balanced-match": "^1.0.0", 114 | "concat-map": "0.0.1" 115 | } 116 | }, 117 | "node_modules/braces": { 118 | "version": "3.0.2", 119 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 120 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 121 | "dev": true, 122 | "dependencies": { 123 | "fill-range": "^7.0.1" 124 | }, 125 | "engines": { 126 | "node": ">=8" 127 | } 128 | }, 129 | "node_modules/bytes": { 130 | "version": "3.1.2", 131 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 132 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 133 | "engines": { 134 | "node": ">= 0.8" 135 | } 136 | }, 137 | "node_modules/call-bind": { 138 | "version": "1.0.2", 139 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 140 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 141 | "dependencies": { 142 | "function-bind": "^1.1.1", 143 | "get-intrinsic": "^1.0.2" 144 | }, 145 | "funding": { 146 | "url": "https://github.com/sponsors/ljharb" 147 | } 148 | }, 149 | "node_modules/chokidar": { 150 | "version": "3.5.3", 151 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 152 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 153 | "dev": true, 154 | "funding": [ 155 | { 156 | "type": "individual", 157 | "url": "https://paulmillr.com/funding/" 158 | } 159 | ], 160 | "dependencies": { 161 | "anymatch": "~3.1.2", 162 | "braces": "~3.0.2", 163 | "glob-parent": "~5.1.2", 164 | "is-binary-path": "~2.1.0", 165 | "is-glob": "~4.0.1", 166 | "normalize-path": "~3.0.0", 167 | "readdirp": "~3.6.0" 168 | }, 169 | "engines": { 170 | "node": ">= 8.10.0" 171 | }, 172 | "optionalDependencies": { 173 | "fsevents": "~2.3.2" 174 | } 175 | }, 176 | "node_modules/combined-stream": { 177 | "version": "1.0.8", 178 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 179 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 180 | "dependencies": { 181 | "delayed-stream": "~1.0.0" 182 | }, 183 | "engines": { 184 | "node": ">= 0.8" 185 | } 186 | }, 187 | "node_modules/concat-map": { 188 | "version": "0.0.1", 189 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 190 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 191 | "dev": true 192 | }, 193 | "node_modules/content-disposition": { 194 | "version": "0.5.4", 195 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 196 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 197 | "dependencies": { 198 | "safe-buffer": "5.2.1" 199 | }, 200 | "engines": { 201 | "node": ">= 0.6" 202 | } 203 | }, 204 | "node_modules/content-type": { 205 | "version": "1.0.5", 206 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 207 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 208 | "engines": { 209 | "node": ">= 0.6" 210 | } 211 | }, 212 | "node_modules/cookie": { 213 | "version": "0.5.0", 214 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 215 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 216 | "engines": { 217 | "node": ">= 0.6" 218 | } 219 | }, 220 | "node_modules/cookie-signature": { 221 | "version": "1.0.6", 222 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 223 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 224 | }, 225 | "node_modules/cors": { 226 | "version": "2.8.5", 227 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 228 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 229 | "dependencies": { 230 | "object-assign": "^4", 231 | "vary": "^1" 232 | }, 233 | "engines": { 234 | "node": ">= 0.10" 235 | } 236 | }, 237 | "node_modules/debug": { 238 | "version": "2.6.9", 239 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 240 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 241 | "dependencies": { 242 | "ms": "2.0.0" 243 | } 244 | }, 245 | "node_modules/delayed-stream": { 246 | "version": "1.0.0", 247 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 248 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 249 | "engines": { 250 | "node": ">=0.4.0" 251 | } 252 | }, 253 | "node_modules/depd": { 254 | "version": "2.0.0", 255 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 256 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 257 | "engines": { 258 | "node": ">= 0.8" 259 | } 260 | }, 261 | "node_modules/destroy": { 262 | "version": "1.2.0", 263 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 264 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 265 | "engines": { 266 | "node": ">= 0.8", 267 | "npm": "1.2.8000 || >= 1.4.16" 268 | } 269 | }, 270 | "node_modules/ee-first": { 271 | "version": "1.1.1", 272 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 273 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 274 | }, 275 | "node_modules/encodeurl": { 276 | "version": "1.0.2", 277 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 278 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 279 | "engines": { 280 | "node": ">= 0.8" 281 | } 282 | }, 283 | "node_modules/escape-html": { 284 | "version": "1.0.3", 285 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 286 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 287 | }, 288 | "node_modules/etag": { 289 | "version": "1.8.1", 290 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 291 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 292 | "engines": { 293 | "node": ">= 0.6" 294 | } 295 | }, 296 | "node_modules/express": { 297 | "version": "4.18.2", 298 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", 299 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", 300 | "dependencies": { 301 | "accepts": "~1.3.8", 302 | "array-flatten": "1.1.1", 303 | "body-parser": "1.20.1", 304 | "content-disposition": "0.5.4", 305 | "content-type": "~1.0.4", 306 | "cookie": "0.5.0", 307 | "cookie-signature": "1.0.6", 308 | "debug": "2.6.9", 309 | "depd": "2.0.0", 310 | "encodeurl": "~1.0.2", 311 | "escape-html": "~1.0.3", 312 | "etag": "~1.8.1", 313 | "finalhandler": "1.2.0", 314 | "fresh": "0.5.2", 315 | "http-errors": "2.0.0", 316 | "merge-descriptors": "1.0.1", 317 | "methods": "~1.1.2", 318 | "on-finished": "2.4.1", 319 | "parseurl": "~1.3.3", 320 | "path-to-regexp": "0.1.7", 321 | "proxy-addr": "~2.0.7", 322 | "qs": "6.11.0", 323 | "range-parser": "~1.2.1", 324 | "safe-buffer": "5.2.1", 325 | "send": "0.18.0", 326 | "serve-static": "1.15.0", 327 | "setprototypeof": "1.2.0", 328 | "statuses": "2.0.1", 329 | "type-is": "~1.6.18", 330 | "utils-merge": "1.0.1", 331 | "vary": "~1.1.2" 332 | }, 333 | "engines": { 334 | "node": ">= 0.10.0" 335 | } 336 | }, 337 | "node_modules/fill-range": { 338 | "version": "7.0.1", 339 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 340 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 341 | "dev": true, 342 | "dependencies": { 343 | "to-regex-range": "^5.0.1" 344 | }, 345 | "engines": { 346 | "node": ">=8" 347 | } 348 | }, 349 | "node_modules/finalhandler": { 350 | "version": "1.2.0", 351 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 352 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 353 | "dependencies": { 354 | "debug": "2.6.9", 355 | "encodeurl": "~1.0.2", 356 | "escape-html": "~1.0.3", 357 | "on-finished": "2.4.1", 358 | "parseurl": "~1.3.3", 359 | "statuses": "2.0.1", 360 | "unpipe": "~1.0.0" 361 | }, 362 | "engines": { 363 | "node": ">= 0.8" 364 | } 365 | }, 366 | "node_modules/follow-redirects": { 367 | "version": "1.15.2", 368 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", 369 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", 370 | "funding": [ 371 | { 372 | "type": "individual", 373 | "url": "https://github.com/sponsors/RubenVerborgh" 374 | } 375 | ], 376 | "engines": { 377 | "node": ">=4.0" 378 | }, 379 | "peerDependenciesMeta": { 380 | "debug": { 381 | "optional": true 382 | } 383 | } 384 | }, 385 | "node_modules/form-data": { 386 | "version": "4.0.0", 387 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 388 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 389 | "dependencies": { 390 | "asynckit": "^0.4.0", 391 | "combined-stream": "^1.0.8", 392 | "mime-types": "^2.1.12" 393 | }, 394 | "engines": { 395 | "node": ">= 6" 396 | } 397 | }, 398 | "node_modules/forwarded": { 399 | "version": "0.2.0", 400 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 401 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 402 | "engines": { 403 | "node": ">= 0.6" 404 | } 405 | }, 406 | "node_modules/fresh": { 407 | "version": "0.5.2", 408 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 409 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 410 | "engines": { 411 | "node": ">= 0.6" 412 | } 413 | }, 414 | "node_modules/fsevents": { 415 | "version": "2.3.2", 416 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 417 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 418 | "dev": true, 419 | "hasInstallScript": true, 420 | "optional": true, 421 | "os": [ 422 | "darwin" 423 | ], 424 | "engines": { 425 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 426 | } 427 | }, 428 | "node_modules/function-bind": { 429 | "version": "1.1.1", 430 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 431 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 432 | }, 433 | "node_modules/get-intrinsic": { 434 | "version": "1.2.0", 435 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", 436 | "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", 437 | "dependencies": { 438 | "function-bind": "^1.1.1", 439 | "has": "^1.0.3", 440 | "has-symbols": "^1.0.3" 441 | }, 442 | "funding": { 443 | "url": "https://github.com/sponsors/ljharb" 444 | } 445 | }, 446 | "node_modules/glob-parent": { 447 | "version": "5.1.2", 448 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 449 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 450 | "dev": true, 451 | "dependencies": { 452 | "is-glob": "^4.0.1" 453 | }, 454 | "engines": { 455 | "node": ">= 6" 456 | } 457 | }, 458 | "node_modules/has": { 459 | "version": "1.0.3", 460 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 461 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 462 | "dependencies": { 463 | "function-bind": "^1.1.1" 464 | }, 465 | "engines": { 466 | "node": ">= 0.4.0" 467 | } 468 | }, 469 | "node_modules/has-flag": { 470 | "version": "3.0.0", 471 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 472 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 473 | "dev": true, 474 | "engines": { 475 | "node": ">=4" 476 | } 477 | }, 478 | "node_modules/has-symbols": { 479 | "version": "1.0.3", 480 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 481 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 482 | "engines": { 483 | "node": ">= 0.4" 484 | }, 485 | "funding": { 486 | "url": "https://github.com/sponsors/ljharb" 487 | } 488 | }, 489 | "node_modules/http-errors": { 490 | "version": "2.0.0", 491 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 492 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 493 | "dependencies": { 494 | "depd": "2.0.0", 495 | "inherits": "2.0.4", 496 | "setprototypeof": "1.2.0", 497 | "statuses": "2.0.1", 498 | "toidentifier": "1.0.1" 499 | }, 500 | "engines": { 501 | "node": ">= 0.8" 502 | } 503 | }, 504 | "node_modules/iconv-lite": { 505 | "version": "0.4.24", 506 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 507 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 508 | "dependencies": { 509 | "safer-buffer": ">= 2.1.2 < 3" 510 | }, 511 | "engines": { 512 | "node": ">=0.10.0" 513 | } 514 | }, 515 | "node_modules/ignore-by-default": { 516 | "version": "1.0.1", 517 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 518 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", 519 | "dev": true 520 | }, 521 | "node_modules/inherits": { 522 | "version": "2.0.4", 523 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 524 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 525 | }, 526 | "node_modules/ipaddr.js": { 527 | "version": "1.9.1", 528 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 529 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 530 | "engines": { 531 | "node": ">= 0.10" 532 | } 533 | }, 534 | "node_modules/is-binary-path": { 535 | "version": "2.1.0", 536 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 537 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 538 | "dev": true, 539 | "dependencies": { 540 | "binary-extensions": "^2.0.0" 541 | }, 542 | "engines": { 543 | "node": ">=8" 544 | } 545 | }, 546 | "node_modules/is-extglob": { 547 | "version": "2.1.1", 548 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 549 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 550 | "dev": true, 551 | "engines": { 552 | "node": ">=0.10.0" 553 | } 554 | }, 555 | "node_modules/is-glob": { 556 | "version": "4.0.3", 557 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 558 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 559 | "dev": true, 560 | "dependencies": { 561 | "is-extglob": "^2.1.1" 562 | }, 563 | "engines": { 564 | "node": ">=0.10.0" 565 | } 566 | }, 567 | "node_modules/is-number": { 568 | "version": "7.0.0", 569 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 570 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 571 | "dev": true, 572 | "engines": { 573 | "node": ">=0.12.0" 574 | } 575 | }, 576 | "node_modules/media-typer": { 577 | "version": "0.3.0", 578 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 579 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 580 | "engines": { 581 | "node": ">= 0.6" 582 | } 583 | }, 584 | "node_modules/merge-descriptors": { 585 | "version": "1.0.1", 586 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 587 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 588 | }, 589 | "node_modules/methods": { 590 | "version": "1.1.2", 591 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 592 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 593 | "engines": { 594 | "node": ">= 0.6" 595 | } 596 | }, 597 | "node_modules/mime": { 598 | "version": "1.6.0", 599 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 600 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 601 | "bin": { 602 | "mime": "cli.js" 603 | }, 604 | "engines": { 605 | "node": ">=4" 606 | } 607 | }, 608 | "node_modules/mime-db": { 609 | "version": "1.52.0", 610 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 611 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 612 | "engines": { 613 | "node": ">= 0.6" 614 | } 615 | }, 616 | "node_modules/mime-types": { 617 | "version": "2.1.35", 618 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 619 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 620 | "dependencies": { 621 | "mime-db": "1.52.0" 622 | }, 623 | "engines": { 624 | "node": ">= 0.6" 625 | } 626 | }, 627 | "node_modules/minimatch": { 628 | "version": "3.1.2", 629 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 630 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 631 | "dev": true, 632 | "dependencies": { 633 | "brace-expansion": "^1.1.7" 634 | }, 635 | "engines": { 636 | "node": "*" 637 | } 638 | }, 639 | "node_modules/ms": { 640 | "version": "2.0.0", 641 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 642 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 643 | }, 644 | "node_modules/negotiator": { 645 | "version": "0.6.3", 646 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 647 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 648 | "engines": { 649 | "node": ">= 0.6" 650 | } 651 | }, 652 | "node_modules/nodemon": { 653 | "version": "2.0.22", 654 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", 655 | "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", 656 | "dev": true, 657 | "dependencies": { 658 | "chokidar": "^3.5.2", 659 | "debug": "^3.2.7", 660 | "ignore-by-default": "^1.0.1", 661 | "minimatch": "^3.1.2", 662 | "pstree.remy": "^1.1.8", 663 | "semver": "^5.7.1", 664 | "simple-update-notifier": "^1.0.7", 665 | "supports-color": "^5.5.0", 666 | "touch": "^3.1.0", 667 | "undefsafe": "^2.0.5" 668 | }, 669 | "bin": { 670 | "nodemon": "bin/nodemon.js" 671 | }, 672 | "engines": { 673 | "node": ">=8.10.0" 674 | }, 675 | "funding": { 676 | "type": "opencollective", 677 | "url": "https://opencollective.com/nodemon" 678 | } 679 | }, 680 | "node_modules/nodemon/node_modules/debug": { 681 | "version": "3.2.7", 682 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 683 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 684 | "dev": true, 685 | "dependencies": { 686 | "ms": "^2.1.1" 687 | } 688 | }, 689 | "node_modules/nodemon/node_modules/ms": { 690 | "version": "2.1.3", 691 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 692 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 693 | "dev": true 694 | }, 695 | "node_modules/nopt": { 696 | "version": "1.0.10", 697 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 698 | "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", 699 | "dev": true, 700 | "dependencies": { 701 | "abbrev": "1" 702 | }, 703 | "bin": { 704 | "nopt": "bin/nopt.js" 705 | }, 706 | "engines": { 707 | "node": "*" 708 | } 709 | }, 710 | "node_modules/normalize-path": { 711 | "version": "3.0.0", 712 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 713 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 714 | "dev": true, 715 | "engines": { 716 | "node": ">=0.10.0" 717 | } 718 | }, 719 | "node_modules/object-assign": { 720 | "version": "4.1.1", 721 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 722 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 723 | "engines": { 724 | "node": ">=0.10.0" 725 | } 726 | }, 727 | "node_modules/object-inspect": { 728 | "version": "1.12.3", 729 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", 730 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", 731 | "funding": { 732 | "url": "https://github.com/sponsors/ljharb" 733 | } 734 | }, 735 | "node_modules/on-finished": { 736 | "version": "2.4.1", 737 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 738 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 739 | "dependencies": { 740 | "ee-first": "1.1.1" 741 | }, 742 | "engines": { 743 | "node": ">= 0.8" 744 | } 745 | }, 746 | "node_modules/openai": { 747 | "version": "3.2.1", 748 | "resolved": "https://registry.npmjs.org/openai/-/openai-3.2.1.tgz", 749 | "integrity": "sha512-762C9BNlJPbjjlWZi4WYK9iM2tAVAv0uUp1UmI34vb0CN5T2mjB/qM6RYBmNKMh/dN9fC+bxqPwWJZUTWW052A==", 750 | "dependencies": { 751 | "axios": "^0.26.0", 752 | "form-data": "^4.0.0" 753 | } 754 | }, 755 | "node_modules/parseurl": { 756 | "version": "1.3.3", 757 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 758 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 759 | "engines": { 760 | "node": ">= 0.8" 761 | } 762 | }, 763 | "node_modules/path-to-regexp": { 764 | "version": "0.1.7", 765 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 766 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 767 | }, 768 | "node_modules/picomatch": { 769 | "version": "2.3.1", 770 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 771 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 772 | "dev": true, 773 | "engines": { 774 | "node": ">=8.6" 775 | }, 776 | "funding": { 777 | "url": "https://github.com/sponsors/jonschlinkert" 778 | } 779 | }, 780 | "node_modules/proxy-addr": { 781 | "version": "2.0.7", 782 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 783 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 784 | "dependencies": { 785 | "forwarded": "0.2.0", 786 | "ipaddr.js": "1.9.1" 787 | }, 788 | "engines": { 789 | "node": ">= 0.10" 790 | } 791 | }, 792 | "node_modules/pstree.remy": { 793 | "version": "1.1.8", 794 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", 795 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", 796 | "dev": true 797 | }, 798 | "node_modules/qs": { 799 | "version": "6.11.0", 800 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 801 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 802 | "dependencies": { 803 | "side-channel": "^1.0.4" 804 | }, 805 | "engines": { 806 | "node": ">=0.6" 807 | }, 808 | "funding": { 809 | "url": "https://github.com/sponsors/ljharb" 810 | } 811 | }, 812 | "node_modules/range-parser": { 813 | "version": "1.2.1", 814 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 815 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 816 | "engines": { 817 | "node": ">= 0.6" 818 | } 819 | }, 820 | "node_modules/raw-body": { 821 | "version": "2.5.1", 822 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 823 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 824 | "dependencies": { 825 | "bytes": "3.1.2", 826 | "http-errors": "2.0.0", 827 | "iconv-lite": "0.4.24", 828 | "unpipe": "1.0.0" 829 | }, 830 | "engines": { 831 | "node": ">= 0.8" 832 | } 833 | }, 834 | "node_modules/readdirp": { 835 | "version": "3.6.0", 836 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 837 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 838 | "dev": true, 839 | "dependencies": { 840 | "picomatch": "^2.2.1" 841 | }, 842 | "engines": { 843 | "node": ">=8.10.0" 844 | } 845 | }, 846 | "node_modules/safe-buffer": { 847 | "version": "5.2.1", 848 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 849 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 850 | "funding": [ 851 | { 852 | "type": "github", 853 | "url": "https://github.com/sponsors/feross" 854 | }, 855 | { 856 | "type": "patreon", 857 | "url": "https://www.patreon.com/feross" 858 | }, 859 | { 860 | "type": "consulting", 861 | "url": "https://feross.org/support" 862 | } 863 | ] 864 | }, 865 | "node_modules/safer-buffer": { 866 | "version": "2.1.2", 867 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 868 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 869 | }, 870 | "node_modules/semver": { 871 | "version": "5.7.1", 872 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 873 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 874 | "dev": true, 875 | "bin": { 876 | "semver": "bin/semver" 877 | } 878 | }, 879 | "node_modules/send": { 880 | "version": "0.18.0", 881 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 882 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 883 | "dependencies": { 884 | "debug": "2.6.9", 885 | "depd": "2.0.0", 886 | "destroy": "1.2.0", 887 | "encodeurl": "~1.0.2", 888 | "escape-html": "~1.0.3", 889 | "etag": "~1.8.1", 890 | "fresh": "0.5.2", 891 | "http-errors": "2.0.0", 892 | "mime": "1.6.0", 893 | "ms": "2.1.3", 894 | "on-finished": "2.4.1", 895 | "range-parser": "~1.2.1", 896 | "statuses": "2.0.1" 897 | }, 898 | "engines": { 899 | "node": ">= 0.8.0" 900 | } 901 | }, 902 | "node_modules/send/node_modules/ms": { 903 | "version": "2.1.3", 904 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 905 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 906 | }, 907 | "node_modules/serve-static": { 908 | "version": "1.15.0", 909 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 910 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 911 | "dependencies": { 912 | "encodeurl": "~1.0.2", 913 | "escape-html": "~1.0.3", 914 | "parseurl": "~1.3.3", 915 | "send": "0.18.0" 916 | }, 917 | "engines": { 918 | "node": ">= 0.8.0" 919 | } 920 | }, 921 | "node_modules/setprototypeof": { 922 | "version": "1.2.0", 923 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 924 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 925 | }, 926 | "node_modules/side-channel": { 927 | "version": "1.0.4", 928 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 929 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 930 | "dependencies": { 931 | "call-bind": "^1.0.0", 932 | "get-intrinsic": "^1.0.2", 933 | "object-inspect": "^1.9.0" 934 | }, 935 | "funding": { 936 | "url": "https://github.com/sponsors/ljharb" 937 | } 938 | }, 939 | "node_modules/simple-update-notifier": { 940 | "version": "1.1.0", 941 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", 942 | "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", 943 | "dev": true, 944 | "dependencies": { 945 | "semver": "~7.0.0" 946 | }, 947 | "engines": { 948 | "node": ">=8.10.0" 949 | } 950 | }, 951 | "node_modules/simple-update-notifier/node_modules/semver": { 952 | "version": "7.0.0", 953 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", 954 | "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", 955 | "dev": true, 956 | "bin": { 957 | "semver": "bin/semver.js" 958 | } 959 | }, 960 | "node_modules/statuses": { 961 | "version": "2.0.1", 962 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 963 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 964 | "engines": { 965 | "node": ">= 0.8" 966 | } 967 | }, 968 | "node_modules/supports-color": { 969 | "version": "5.5.0", 970 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 971 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 972 | "dev": true, 973 | "dependencies": { 974 | "has-flag": "^3.0.0" 975 | }, 976 | "engines": { 977 | "node": ">=4" 978 | } 979 | }, 980 | "node_modules/to-regex-range": { 981 | "version": "5.0.1", 982 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 983 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 984 | "dev": true, 985 | "dependencies": { 986 | "is-number": "^7.0.0" 987 | }, 988 | "engines": { 989 | "node": ">=8.0" 990 | } 991 | }, 992 | "node_modules/toidentifier": { 993 | "version": "1.0.1", 994 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 995 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 996 | "engines": { 997 | "node": ">=0.6" 998 | } 999 | }, 1000 | "node_modules/touch": { 1001 | "version": "3.1.0", 1002 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", 1003 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", 1004 | "dev": true, 1005 | "dependencies": { 1006 | "nopt": "~1.0.10" 1007 | }, 1008 | "bin": { 1009 | "nodetouch": "bin/nodetouch.js" 1010 | } 1011 | }, 1012 | "node_modules/type-is": { 1013 | "version": "1.6.18", 1014 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1015 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1016 | "dependencies": { 1017 | "media-typer": "0.3.0", 1018 | "mime-types": "~2.1.24" 1019 | }, 1020 | "engines": { 1021 | "node": ">= 0.6" 1022 | } 1023 | }, 1024 | "node_modules/undefsafe": { 1025 | "version": "2.0.5", 1026 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", 1027 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", 1028 | "dev": true 1029 | }, 1030 | "node_modules/unpipe": { 1031 | "version": "1.0.0", 1032 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1033 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 1034 | "engines": { 1035 | "node": ">= 0.8" 1036 | } 1037 | }, 1038 | "node_modules/utils-merge": { 1039 | "version": "1.0.1", 1040 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1041 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 1042 | "engines": { 1043 | "node": ">= 0.4.0" 1044 | } 1045 | }, 1046 | "node_modules/vary": { 1047 | "version": "1.1.2", 1048 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1049 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 1050 | "engines": { 1051 | "node": ">= 0.8" 1052 | } 1053 | } 1054 | }, 1055 | "dependencies": { 1056 | "abbrev": { 1057 | "version": "1.1.1", 1058 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 1059 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 1060 | "dev": true 1061 | }, 1062 | "accepts": { 1063 | "version": "1.3.8", 1064 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 1065 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 1066 | "requires": { 1067 | "mime-types": "~2.1.34", 1068 | "negotiator": "0.6.3" 1069 | } 1070 | }, 1071 | "anymatch": { 1072 | "version": "3.1.3", 1073 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 1074 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 1075 | "dev": true, 1076 | "requires": { 1077 | "normalize-path": "^3.0.0", 1078 | "picomatch": "^2.0.4" 1079 | } 1080 | }, 1081 | "array-flatten": { 1082 | "version": "1.1.1", 1083 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 1084 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 1085 | }, 1086 | "asynckit": { 1087 | "version": "0.4.0", 1088 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 1089 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 1090 | }, 1091 | "axios": { 1092 | "version": "0.26.1", 1093 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", 1094 | "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", 1095 | "requires": { 1096 | "follow-redirects": "^1.14.8" 1097 | } 1098 | }, 1099 | "balanced-match": { 1100 | "version": "1.0.2", 1101 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1102 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1103 | "dev": true 1104 | }, 1105 | "binary-extensions": { 1106 | "version": "2.2.0", 1107 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 1108 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 1109 | "dev": true 1110 | }, 1111 | "body-parser": { 1112 | "version": "1.20.1", 1113 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", 1114 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", 1115 | "requires": { 1116 | "bytes": "3.1.2", 1117 | "content-type": "~1.0.4", 1118 | "debug": "2.6.9", 1119 | "depd": "2.0.0", 1120 | "destroy": "1.2.0", 1121 | "http-errors": "2.0.0", 1122 | "iconv-lite": "0.4.24", 1123 | "on-finished": "2.4.1", 1124 | "qs": "6.11.0", 1125 | "raw-body": "2.5.1", 1126 | "type-is": "~1.6.18", 1127 | "unpipe": "1.0.0" 1128 | } 1129 | }, 1130 | "brace-expansion": { 1131 | "version": "1.1.11", 1132 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1133 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1134 | "dev": true, 1135 | "requires": { 1136 | "balanced-match": "^1.0.0", 1137 | "concat-map": "0.0.1" 1138 | } 1139 | }, 1140 | "braces": { 1141 | "version": "3.0.2", 1142 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 1143 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 1144 | "dev": true, 1145 | "requires": { 1146 | "fill-range": "^7.0.1" 1147 | } 1148 | }, 1149 | "bytes": { 1150 | "version": "3.1.2", 1151 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 1152 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" 1153 | }, 1154 | "call-bind": { 1155 | "version": "1.0.2", 1156 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 1157 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 1158 | "requires": { 1159 | "function-bind": "^1.1.1", 1160 | "get-intrinsic": "^1.0.2" 1161 | } 1162 | }, 1163 | "chokidar": { 1164 | "version": "3.5.3", 1165 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 1166 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 1167 | "dev": true, 1168 | "requires": { 1169 | "anymatch": "~3.1.2", 1170 | "braces": "~3.0.2", 1171 | "fsevents": "~2.3.2", 1172 | "glob-parent": "~5.1.2", 1173 | "is-binary-path": "~2.1.0", 1174 | "is-glob": "~4.0.1", 1175 | "normalize-path": "~3.0.0", 1176 | "readdirp": "~3.6.0" 1177 | } 1178 | }, 1179 | "combined-stream": { 1180 | "version": "1.0.8", 1181 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 1182 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 1183 | "requires": { 1184 | "delayed-stream": "~1.0.0" 1185 | } 1186 | }, 1187 | "concat-map": { 1188 | "version": "0.0.1", 1189 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1190 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1191 | "dev": true 1192 | }, 1193 | "content-disposition": { 1194 | "version": "0.5.4", 1195 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 1196 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 1197 | "requires": { 1198 | "safe-buffer": "5.2.1" 1199 | } 1200 | }, 1201 | "content-type": { 1202 | "version": "1.0.5", 1203 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 1204 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" 1205 | }, 1206 | "cookie": { 1207 | "version": "0.5.0", 1208 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 1209 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" 1210 | }, 1211 | "cookie-signature": { 1212 | "version": "1.0.6", 1213 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 1214 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 1215 | }, 1216 | "cors": { 1217 | "version": "2.8.5", 1218 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 1219 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 1220 | "requires": { 1221 | "object-assign": "^4", 1222 | "vary": "^1" 1223 | } 1224 | }, 1225 | "debug": { 1226 | "version": "2.6.9", 1227 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1228 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1229 | "requires": { 1230 | "ms": "2.0.0" 1231 | } 1232 | }, 1233 | "delayed-stream": { 1234 | "version": "1.0.0", 1235 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 1236 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" 1237 | }, 1238 | "depd": { 1239 | "version": "2.0.0", 1240 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 1241 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 1242 | }, 1243 | "destroy": { 1244 | "version": "1.2.0", 1245 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 1246 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" 1247 | }, 1248 | "ee-first": { 1249 | "version": "1.1.1", 1250 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 1251 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 1252 | }, 1253 | "encodeurl": { 1254 | "version": "1.0.2", 1255 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 1256 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" 1257 | }, 1258 | "escape-html": { 1259 | "version": "1.0.3", 1260 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 1261 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 1262 | }, 1263 | "etag": { 1264 | "version": "1.8.1", 1265 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 1266 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" 1267 | }, 1268 | "express": { 1269 | "version": "4.18.2", 1270 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", 1271 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", 1272 | "requires": { 1273 | "accepts": "~1.3.8", 1274 | "array-flatten": "1.1.1", 1275 | "body-parser": "1.20.1", 1276 | "content-disposition": "0.5.4", 1277 | "content-type": "~1.0.4", 1278 | "cookie": "0.5.0", 1279 | "cookie-signature": "1.0.6", 1280 | "debug": "2.6.9", 1281 | "depd": "2.0.0", 1282 | "encodeurl": "~1.0.2", 1283 | "escape-html": "~1.0.3", 1284 | "etag": "~1.8.1", 1285 | "finalhandler": "1.2.0", 1286 | "fresh": "0.5.2", 1287 | "http-errors": "2.0.0", 1288 | "merge-descriptors": "1.0.1", 1289 | "methods": "~1.1.2", 1290 | "on-finished": "2.4.1", 1291 | "parseurl": "~1.3.3", 1292 | "path-to-regexp": "0.1.7", 1293 | "proxy-addr": "~2.0.7", 1294 | "qs": "6.11.0", 1295 | "range-parser": "~1.2.1", 1296 | "safe-buffer": "5.2.1", 1297 | "send": "0.18.0", 1298 | "serve-static": "1.15.0", 1299 | "setprototypeof": "1.2.0", 1300 | "statuses": "2.0.1", 1301 | "type-is": "~1.6.18", 1302 | "utils-merge": "1.0.1", 1303 | "vary": "~1.1.2" 1304 | } 1305 | }, 1306 | "fill-range": { 1307 | "version": "7.0.1", 1308 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1309 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1310 | "dev": true, 1311 | "requires": { 1312 | "to-regex-range": "^5.0.1" 1313 | } 1314 | }, 1315 | "finalhandler": { 1316 | "version": "1.2.0", 1317 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 1318 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 1319 | "requires": { 1320 | "debug": "2.6.9", 1321 | "encodeurl": "~1.0.2", 1322 | "escape-html": "~1.0.3", 1323 | "on-finished": "2.4.1", 1324 | "parseurl": "~1.3.3", 1325 | "statuses": "2.0.1", 1326 | "unpipe": "~1.0.0" 1327 | } 1328 | }, 1329 | "follow-redirects": { 1330 | "version": "1.15.2", 1331 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", 1332 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" 1333 | }, 1334 | "form-data": { 1335 | "version": "4.0.0", 1336 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 1337 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 1338 | "requires": { 1339 | "asynckit": "^0.4.0", 1340 | "combined-stream": "^1.0.8", 1341 | "mime-types": "^2.1.12" 1342 | } 1343 | }, 1344 | "forwarded": { 1345 | "version": "0.2.0", 1346 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 1347 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 1348 | }, 1349 | "fresh": { 1350 | "version": "0.5.2", 1351 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1352 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" 1353 | }, 1354 | "fsevents": { 1355 | "version": "2.3.2", 1356 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1357 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1358 | "dev": true, 1359 | "optional": true 1360 | }, 1361 | "function-bind": { 1362 | "version": "1.1.1", 1363 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1364 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 1365 | }, 1366 | "get-intrinsic": { 1367 | "version": "1.2.0", 1368 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", 1369 | "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", 1370 | "requires": { 1371 | "function-bind": "^1.1.1", 1372 | "has": "^1.0.3", 1373 | "has-symbols": "^1.0.3" 1374 | } 1375 | }, 1376 | "glob-parent": { 1377 | "version": "5.1.2", 1378 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1379 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1380 | "dev": true, 1381 | "requires": { 1382 | "is-glob": "^4.0.1" 1383 | } 1384 | }, 1385 | "has": { 1386 | "version": "1.0.3", 1387 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1388 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1389 | "requires": { 1390 | "function-bind": "^1.1.1" 1391 | } 1392 | }, 1393 | "has-flag": { 1394 | "version": "3.0.0", 1395 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1396 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 1397 | "dev": true 1398 | }, 1399 | "has-symbols": { 1400 | "version": "1.0.3", 1401 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 1402 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" 1403 | }, 1404 | "http-errors": { 1405 | "version": "2.0.0", 1406 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 1407 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 1408 | "requires": { 1409 | "depd": "2.0.0", 1410 | "inherits": "2.0.4", 1411 | "setprototypeof": "1.2.0", 1412 | "statuses": "2.0.1", 1413 | "toidentifier": "1.0.1" 1414 | } 1415 | }, 1416 | "iconv-lite": { 1417 | "version": "0.4.24", 1418 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1419 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1420 | "requires": { 1421 | "safer-buffer": ">= 2.1.2 < 3" 1422 | } 1423 | }, 1424 | "ignore-by-default": { 1425 | "version": "1.0.1", 1426 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 1427 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", 1428 | "dev": true 1429 | }, 1430 | "inherits": { 1431 | "version": "2.0.4", 1432 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1433 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1434 | }, 1435 | "ipaddr.js": { 1436 | "version": "1.9.1", 1437 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1438 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 1439 | }, 1440 | "is-binary-path": { 1441 | "version": "2.1.0", 1442 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1443 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1444 | "dev": true, 1445 | "requires": { 1446 | "binary-extensions": "^2.0.0" 1447 | } 1448 | }, 1449 | "is-extglob": { 1450 | "version": "2.1.1", 1451 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1452 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1453 | "dev": true 1454 | }, 1455 | "is-glob": { 1456 | "version": "4.0.3", 1457 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1458 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1459 | "dev": true, 1460 | "requires": { 1461 | "is-extglob": "^2.1.1" 1462 | } 1463 | }, 1464 | "is-number": { 1465 | "version": "7.0.0", 1466 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1467 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1468 | "dev": true 1469 | }, 1470 | "media-typer": { 1471 | "version": "0.3.0", 1472 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1473 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" 1474 | }, 1475 | "merge-descriptors": { 1476 | "version": "1.0.1", 1477 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1478 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 1479 | }, 1480 | "methods": { 1481 | "version": "1.1.2", 1482 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1483 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" 1484 | }, 1485 | "mime": { 1486 | "version": "1.6.0", 1487 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1488 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 1489 | }, 1490 | "mime-db": { 1491 | "version": "1.52.0", 1492 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1493 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 1494 | }, 1495 | "mime-types": { 1496 | "version": "2.1.35", 1497 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1498 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1499 | "requires": { 1500 | "mime-db": "1.52.0" 1501 | } 1502 | }, 1503 | "minimatch": { 1504 | "version": "3.1.2", 1505 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1506 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1507 | "dev": true, 1508 | "requires": { 1509 | "brace-expansion": "^1.1.7" 1510 | } 1511 | }, 1512 | "ms": { 1513 | "version": "2.0.0", 1514 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1515 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 1516 | }, 1517 | "negotiator": { 1518 | "version": "0.6.3", 1519 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1520 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" 1521 | }, 1522 | "nodemon": { 1523 | "version": "2.0.22", 1524 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", 1525 | "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", 1526 | "dev": true, 1527 | "requires": { 1528 | "chokidar": "^3.5.2", 1529 | "debug": "^3.2.7", 1530 | "ignore-by-default": "^1.0.1", 1531 | "minimatch": "^3.1.2", 1532 | "pstree.remy": "^1.1.8", 1533 | "semver": "^5.7.1", 1534 | "simple-update-notifier": "^1.0.7", 1535 | "supports-color": "^5.5.0", 1536 | "touch": "^3.1.0", 1537 | "undefsafe": "^2.0.5" 1538 | }, 1539 | "dependencies": { 1540 | "debug": { 1541 | "version": "3.2.7", 1542 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 1543 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 1544 | "dev": true, 1545 | "requires": { 1546 | "ms": "^2.1.1" 1547 | } 1548 | }, 1549 | "ms": { 1550 | "version": "2.1.3", 1551 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1552 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1553 | "dev": true 1554 | } 1555 | } 1556 | }, 1557 | "nopt": { 1558 | "version": "1.0.10", 1559 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 1560 | "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", 1561 | "dev": true, 1562 | "requires": { 1563 | "abbrev": "1" 1564 | } 1565 | }, 1566 | "normalize-path": { 1567 | "version": "3.0.0", 1568 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1569 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1570 | "dev": true 1571 | }, 1572 | "object-assign": { 1573 | "version": "4.1.1", 1574 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1575 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" 1576 | }, 1577 | "object-inspect": { 1578 | "version": "1.12.3", 1579 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", 1580 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" 1581 | }, 1582 | "on-finished": { 1583 | "version": "2.4.1", 1584 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1585 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1586 | "requires": { 1587 | "ee-first": "1.1.1" 1588 | } 1589 | }, 1590 | "openai": { 1591 | "version": "3.2.1", 1592 | "resolved": "https://registry.npmjs.org/openai/-/openai-3.2.1.tgz", 1593 | "integrity": "sha512-762C9BNlJPbjjlWZi4WYK9iM2tAVAv0uUp1UmI34vb0CN5T2mjB/qM6RYBmNKMh/dN9fC+bxqPwWJZUTWW052A==", 1594 | "requires": { 1595 | "axios": "^0.26.0", 1596 | "form-data": "^4.0.0" 1597 | } 1598 | }, 1599 | "parseurl": { 1600 | "version": "1.3.3", 1601 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1602 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1603 | }, 1604 | "path-to-regexp": { 1605 | "version": "0.1.7", 1606 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1607 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 1608 | }, 1609 | "picomatch": { 1610 | "version": "2.3.1", 1611 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1612 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1613 | "dev": true 1614 | }, 1615 | "proxy-addr": { 1616 | "version": "2.0.7", 1617 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1618 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1619 | "requires": { 1620 | "forwarded": "0.2.0", 1621 | "ipaddr.js": "1.9.1" 1622 | } 1623 | }, 1624 | "pstree.remy": { 1625 | "version": "1.1.8", 1626 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", 1627 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", 1628 | "dev": true 1629 | }, 1630 | "qs": { 1631 | "version": "6.11.0", 1632 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 1633 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 1634 | "requires": { 1635 | "side-channel": "^1.0.4" 1636 | } 1637 | }, 1638 | "range-parser": { 1639 | "version": "1.2.1", 1640 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1641 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 1642 | }, 1643 | "raw-body": { 1644 | "version": "2.5.1", 1645 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 1646 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 1647 | "requires": { 1648 | "bytes": "3.1.2", 1649 | "http-errors": "2.0.0", 1650 | "iconv-lite": "0.4.24", 1651 | "unpipe": "1.0.0" 1652 | } 1653 | }, 1654 | "readdirp": { 1655 | "version": "3.6.0", 1656 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1657 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1658 | "dev": true, 1659 | "requires": { 1660 | "picomatch": "^2.2.1" 1661 | } 1662 | }, 1663 | "safe-buffer": { 1664 | "version": "5.2.1", 1665 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1666 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1667 | }, 1668 | "safer-buffer": { 1669 | "version": "2.1.2", 1670 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1671 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1672 | }, 1673 | "semver": { 1674 | "version": "5.7.1", 1675 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1676 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 1677 | "dev": true 1678 | }, 1679 | "send": { 1680 | "version": "0.18.0", 1681 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 1682 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 1683 | "requires": { 1684 | "debug": "2.6.9", 1685 | "depd": "2.0.0", 1686 | "destroy": "1.2.0", 1687 | "encodeurl": "~1.0.2", 1688 | "escape-html": "~1.0.3", 1689 | "etag": "~1.8.1", 1690 | "fresh": "0.5.2", 1691 | "http-errors": "2.0.0", 1692 | "mime": "1.6.0", 1693 | "ms": "2.1.3", 1694 | "on-finished": "2.4.1", 1695 | "range-parser": "~1.2.1", 1696 | "statuses": "2.0.1" 1697 | }, 1698 | "dependencies": { 1699 | "ms": { 1700 | "version": "2.1.3", 1701 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1702 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1703 | } 1704 | } 1705 | }, 1706 | "serve-static": { 1707 | "version": "1.15.0", 1708 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 1709 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 1710 | "requires": { 1711 | "encodeurl": "~1.0.2", 1712 | "escape-html": "~1.0.3", 1713 | "parseurl": "~1.3.3", 1714 | "send": "0.18.0" 1715 | } 1716 | }, 1717 | "setprototypeof": { 1718 | "version": "1.2.0", 1719 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1720 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1721 | }, 1722 | "side-channel": { 1723 | "version": "1.0.4", 1724 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 1725 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1726 | "requires": { 1727 | "call-bind": "^1.0.0", 1728 | "get-intrinsic": "^1.0.2", 1729 | "object-inspect": "^1.9.0" 1730 | } 1731 | }, 1732 | "simple-update-notifier": { 1733 | "version": "1.1.0", 1734 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", 1735 | "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", 1736 | "dev": true, 1737 | "requires": { 1738 | "semver": "~7.0.0" 1739 | }, 1740 | "dependencies": { 1741 | "semver": { 1742 | "version": "7.0.0", 1743 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", 1744 | "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", 1745 | "dev": true 1746 | } 1747 | } 1748 | }, 1749 | "statuses": { 1750 | "version": "2.0.1", 1751 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1752 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" 1753 | }, 1754 | "supports-color": { 1755 | "version": "5.5.0", 1756 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1757 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1758 | "dev": true, 1759 | "requires": { 1760 | "has-flag": "^3.0.0" 1761 | } 1762 | }, 1763 | "to-regex-range": { 1764 | "version": "5.0.1", 1765 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1766 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1767 | "dev": true, 1768 | "requires": { 1769 | "is-number": "^7.0.0" 1770 | } 1771 | }, 1772 | "toidentifier": { 1773 | "version": "1.0.1", 1774 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1775 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 1776 | }, 1777 | "touch": { 1778 | "version": "3.1.0", 1779 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", 1780 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", 1781 | "dev": true, 1782 | "requires": { 1783 | "nopt": "~1.0.10" 1784 | } 1785 | }, 1786 | "type-is": { 1787 | "version": "1.6.18", 1788 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1789 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1790 | "requires": { 1791 | "media-typer": "0.3.0", 1792 | "mime-types": "~2.1.24" 1793 | } 1794 | }, 1795 | "undefsafe": { 1796 | "version": "2.0.5", 1797 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", 1798 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", 1799 | "dev": true 1800 | }, 1801 | "unpipe": { 1802 | "version": "1.0.0", 1803 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1804 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" 1805 | }, 1806 | "utils-merge": { 1807 | "version": "1.0.1", 1808 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1809 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" 1810 | }, 1811 | "vary": { 1812 | "version": "1.1.2", 1813 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1814 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" 1815 | } 1816 | } 1817 | } 1818 | --------------------------------------------------------------------------------