diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..23a0792 --- /dev/null +++ b/.gitignore @@ -0,0 +1,96 @@ +# Logs +logs +.log +npm-debug.log +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9].[0-9].[0-9].[0-9].json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in t \ No newline at end of file diff --git a/backend/api/ChallengesAPI.js b/backend/api/ChallengesAPI.js new file mode 100644 index 0000000..3d6c05b --- /dev/null +++ b/backend/api/ChallengesAPI.js @@ -0,0 +1,81 @@ +const Challenges = require("../models/Challenges"); +const User = require("../models/Users"); + +const fetchChallenges = async () => { + const challenges = await Challenges.find({}) + .sort({ timestamp: -1 }) + .populate("creatorId") + .exec(); + return challenges; +}; + +const createChallenges = async (challengeData, userId) => { + try { + const challenge = new Challenges(challengeData); + await Promise.all([await challenge.save(), User.updateOne( + { _id: userId }, + { + $push: { participatedChallenges: challenge._id }, + $addToSet: { challenges: challenge._id }, + $inc: { points: 5 } + } + )]) + return challenge; + } catch (err) { + console.log(err); + throw new Error(err); + } +}; + +const fetchOneChallenge = async (challengeId) => { + try { + const challenge = await Challenges.findOne({ _id: challengeId }) + .populate("creatorId") + .populate("participators") + .exec(); + return challenge; + } catch (err) { + throw new Error(err); + } +}; + +const participateInChallenge = async(challengeId, userId)=>{ + try { + const challenge = await Challenges.findOne({ _id: challengeId }); + if (challenge.participators.includes(userId)) { + throw new Error(`You have already participated`); + } + const participatePromise = Challenges.updateOne( + { _id: challengeId }, + { $addToSet: { participators: userId } } + ); + const challengeCreator = await User.findById(challenge.creatorId); + challengeCreator.points += 2; + const foundUserPromise = User.updateOne({ _id: userId }, { $addToSet: { participatedChallenges: challengeId } }); + const [user, resultOfParticipation] = await Promise.all([foundUserPromise, participatePromise, challengeCreator.save()]); + return resultOfParticipation; + } catch (error) { + throw new Error(error.message); + } +} + +const deleteChallenge = async (challengeId, user) => { + try { + await Challenges.findByIdAndDelete(challengeId); + user.challenges.pull(challengeId) + user.points -= 5; + await user.save(); + }catch{ + console.log(err); + } +} + + +module.exports = { fetchChallenges, createChallenges, fetchOneChallenge, participateInChallenge, deleteChallenge }; + + +// const userPromise = User.findById(userId); +// const challengesPromise = Challenge.find({ participants: userId }).sort({ +// createdAt: -1 +// }); +// const [user, challenges] = await Promise.all([userPromise, challengesPromise]); \ No newline at end of file diff --git a/backend/api/commentAPI.js b/backend/api/commentAPI.js new file mode 100644 index 0000000..aab4c5b --- /dev/null +++ b/backend/api/commentAPI.js @@ -0,0 +1,45 @@ +const Comment = require("../models/Comments"); +const Posts = require("../models/Posts"); +const User = require("../models/Users"); + +const addComment = async (commentDetails, postId) => { + try { + const newComment = new Comment(commentDetails); + await newComment.save(); + + const post = await Posts.findById(postId); + const postCreator = await User.findById(post.creator); + postCreator.points += 2; + await post.stats.comments.push(newComment._id); + Promise.all([postCreator.save(), post.save()]) + .then(() => { + return; + }) + .catch((error) => { + throw new Error(error); + }); + } catch (err) { + throw new Error(err); + } +}; + +const deleteComment = async (commentId, postId) => { + const post = await Posts.findById(postId); + post.stats.comments.pull(commentId); + const postCreator = await User.findById(post.creator); + postCreator.points -= 2; + Promise.all([ + postCreator.save(), + post.save(), + Comment.findByIdAndDelete(commentId), + ]) + .then(() => { + return; + }) + .catch((error) => { + throw new Error(error); + }); + }; + + +module.exports = {addComment, deleteComment}; diff --git a/backend/api/deleteImage.js b/backend/api/deleteImage.js new file mode 100644 index 0000000..7787a3e --- /dev/null +++ b/backend/api/deleteImage.js @@ -0,0 +1,17 @@ +const cloudinary = require('cloudinary').v2; + +// Configuration +cloudinary.config({ + cloud_name: process.env.CLOUD_NAME, + api_key: process.env.API_KEY, + api_secret: process.env.API_SECRET + }); + + +// Delete image from cloudinary +const deleteImage = async (imageId) => { + await cloudinary.uploader.destroy(imageId); + return true; +} + +module.exports = deleteImage; \ No newline at end of file diff --git a/backend/api/devAPI.js b/backend/api/devAPI.js new file mode 100644 index 0000000..0109bc0 --- /dev/null +++ b/backend/api/devAPI.js @@ -0,0 +1,55 @@ +const userModel = require("../models/Users"); +const postModel = require("../models/Posts"); + +async function increaseLike(postId, currentLike, currentDisLike, userId) { + const postFound = await postModel.findById(postId).then((post)=>{ + if(post){ + let indexInDownvotes = post.stats.downvoted_by.indexOf(userId); + if(indexInDownvotes > -1){ + post.stats.downvoted_by.splice(indexInDownvotes, 1); + } + post.stats.upvoted_by.push(userId); + post.stats.upvotes = currentLike + 1; + post.stats.downvotes = currentDisLike; + post.save(); + userModel.findById(post.creator).then((user)=>{ + user.points += 1; + user.save(); + }) + return post; + } + + }); + if (postFound) { + return postFound.posts; + } else { + console.log("posts not found"); + } +} +async function decreaseLike(postId, currentLike, currentDisLike, userId) { + const postFound = await postModel.findById(postId).then((post)=>{ + if(post){ + let indexInUpvotes = post.stats.upvoted_by.indexOf(userId); + if(indexInUpvotes > -1){ + post.stats.upvoted_by.splice(indexInUpvotes, 1); + } + post.stats.downvoted_by.push(userId); + post.stats.upvotes = currentLike; + post.stats.downvotes = currentDisLike + 1; + post.save(); + userModel.findById(post.creator).then((user)=>{ + user.points -= 1; + user.save(); + }) + return post; + } + + }); + if (postFound) { + return postFound.posts; + } else { + console.log("posts not found"); + } +} + +module.exports = { increaseLike, decreaseLike }; diff --git a/backend/api/getSignature.js b/backend/api/getSignature.js new file mode 100644 index 0000000..5dcfa16 --- /dev/null +++ b/backend/api/getSignature.js @@ -0,0 +1,16 @@ +const cloudinary = require('cloudinary').v2; + +// Configuration +cloudinary.config({ + cloud_name: process.env.CLOUD_NAME, + api_key: process.env.API_KEY, + api_secret: process.env.API_SECRET + }); + +const getSignature = async (req, res) => { + const timestamp = Math.round(new Date().getTime() / 1000); + const signature = cloudinary.utils.api_sign_request( { timestamp: timestamp }, process.env.API_SECRET); + res.json({signature: signature, timestamp: timestamp}); +} + +module.exports = getSignature; \ No newline at end of file diff --git a/backend/api/pollsApi.js b/backend/api/pollsApi.js new file mode 100644 index 0000000..b3c2789 --- /dev/null +++ b/backend/api/pollsApi.js @@ -0,0 +1,52 @@ +const Polls = require("../models/Polls"); +const User = require("../models/Users"); + +const voteCount = async (pollId, optionId, userId) => { + try { + const poll = await Polls.findById(pollId); + let option = poll.options.find((option) => option._id == optionId); + for (optionCheck of poll.options) { + if (optionCheck.voted_by.includes(userId)) { + return; + } + } + const pollCreator = await User.findById(poll.creatorId); + pollCreator.points += 1; + option.voted_by.push(userId); + await Promise.all([pollCreator.save(), poll.save()]); + } catch (err) { + console.log(err); + } +}; + +const deletePoll = async (pollId, user) => { + try { + user.polls.pull(pollId); + user.points -= 5; + await Promise.all([user.save(), Polls.findByIdAndDelete(pollId)]); + } catch { + console.log(err); + } +}; + +const fetchPolls = async () => { + const polls = await Polls.find({}).sort({timestamp: -1}).populate("creatorId").exec(); + const totalVotes = polls.map(poll => { + return poll.options.reduce((acc, option) => { + return acc + option.voted_by.length; + }, 0); + }); + return [polls, totalVotes]; + } + + + async function getPolls(user) { + const userFound = await User.findById(user._id).populate("polls").exec(); + if (userFound) { + return userFound.polls; + } else { + console.log("poll not found"); + } + } + +module.exports = { voteCount, deletePoll, fetchPolls, getPolls }; diff --git a/backend/api/postAPI.js b/backend/api/postAPI.js new file mode 100644 index 0000000..e5011c0 --- /dev/null +++ b/backend/api/postAPI.js @@ -0,0 +1,96 @@ +const Post = require("../models/Posts"); +const userModel = require("../models/Users"); +const deleteImage = require("./deleteImage"); +const userAPI = require("./userAPI"); + +const fetchPosts = async () => { + // userModel.createIndexes({ firstname: "text", lastname: "text", username: "text" }).then(()=>{ + // console.log("Indexes created"); + // }).catch((err)=>{ + // console.log("Error creating indexes"); + // }); + //this needs to be called after droping db + const posts = await Post.find({}) + .sort({ createdAt: -1 }) + .populate("creator") + .exec(); + return posts; +}; + +async function findPosts(user) { + const userFound = await userModel.findById(user._id).populate("posts").exec(); + if (userFound) { + return userFound.posts.reverse(); + } else { + console.log("posts not found"); + } +} + +const deletePost = async (postId, user) => { + const post = await Post.findById(postId); + if (post.creator.toString() === user._id.toString()) { + await Post.findByIdAndDelete(postId); + const imageId = await Post.findById(postId).select("imageId"); + if (imageId !== null) { + await deleteImage(imageId); + } + const foundUser = await userModel.findById(user._id.toString()); + foundUser.points -= 3; + foundUser.posts.pull(postId); + await foundUser.save(); + + return; + } else { + const foundUser = await userModel.findById(user._id.toString()); + foundUser.posts.pull(postId); + await foundUser.save(); + return; + } +}; + +const addPost = async (user, content, imageUrl, imageId) => { + if (!content && !imageUrl) { + throw new Error("Please upload an image or write a post"); + } + const newPost = new Post({ + content: content, + creator: user._id, + imagePath: imageUrl, + imageId: imageId, + }); + newPost.save((err, post) => { + if (err) { + throw new Error("something went wrong during saving"); + } else { + try { + userAPI.findUser(user).then((user) => { + user.posts.push(post._id); + user.points += 3; + user.save((err, user) => { + if (err) { + throw new Error("something went wrong during saving"); + } else { + return; + } + }); + }); + } catch (err) { + throw new Error(err); + } + } + }); +}; + +const sharePost = async (postId, currentShare, user) => { + const post = await Post.findById(postId); + if (user.posts.includes(postId)) { + return; + } + const postCreator = await userModel.findById(post.creator); + postCreator.points += 2; + user.posts.push(postId); + post.stats.shares = currentShare + 1; + await Promise.all([postCreator.save(), post.save(), user.save()]); +}; + +module.exports = { fetchPosts, findPosts, deletePost, addPost, sharePost }; diff --git a/backend/api/profileAPI.js b/backend/api/profileAPI.js new file mode 100644 index 0000000..cf228da --- /dev/null +++ b/backend/api/profileAPI.js @@ -0,0 +1,76 @@ +const User = require("../models/Users"); + +const searchProfile = async (searchTerm) => { + const users = await User.find( + { + $or: [ + { $text: { $search: searchTerm } }, + { firstname: { $regex: searchTerm, $options: "i" } }, + { lastname: { $regex: searchTerm, $options: "i" } }, + { username: { $regex: searchTerm, $options: "i" } }, + ], + }, + { + score: { $meta: "textScore" }, + firstname: 1, + lastname: 1, + username: 1, + profilePic_url: 1, + _id: 1, + } + ).sort({ score: { $meta: "textScore" } }); + return users; + }; + + + const followAndUnfollow = async (followingId, followerId) =>{ + const followerPromise = User.findById(followerId) + const followingPromise = User.findById(followingId) + const [follower, following] = await Promise.all([followerPromise, followingPromise]) + + if(following.followers.includes(followerId)){ + following.points -= 10; + following.followers.pull(followerId) + } else{ + following.points += 10; + following.followers.push(followerId) + } + + follower.following.includes(followingId) ? follower.following.pull(followingId) : follower.following.push(followingId) + await Promise.all([following.save(), follower.save()]) +} + + +const getActivities = async function (user) { + try { + const userFound = await User.findById(user._id).populate("polls").populate("challenges").populate({ + path: "participatedChallenges", + populate: { + path: "creatorId", + model: "User" + } + }).exec(); + if (userFound) { + const combined = [...userFound.polls, ...userFound.challenges, ...userFound.participatedChallenges]; + const sorted = combined.sort((a, b) => b.timestamp - a.timestamp); + let uniqueArray = sorted + .filter((value, index, array) => array.findIndex(obj => String(obj._id) === String(value._id)) === index); + const totalVotes = uniqueArray.map(poll => { + if (!poll.options) { + return null; + } + return poll.options.reduce((acc, option) => { + return acc + option.voted_by.length; + }, 0); + }); + return [uniqueArray, totalVotes]; + } else { + throw new Error("User not found"); + } + } catch (error) { + throw new Error(error); + } + +} + +module.exports = {searchProfile, followAndUnfollow, getActivities}; \ No newline at end of file diff --git a/backend/api/userAPI.js b/backend/api/userAPI.js new file mode 100644 index 0000000..6b61291 --- /dev/null +++ b/backend/api/userAPI.js @@ -0,0 +1,41 @@ +const userModel = require("../models/Users"); +const postModel = require("../models/Posts"); +const passport = require("passport"); + +const findUser = async function (user) { + const userFound = await userModel.findById(user._id).populate("posts").exec(); + if (userFound) { + return userFound; + } else { + console.log("user not found"); + } + } + + const updateUser = async (id, postedData) => { + try { + const result = await userModel.findOneAndUpdate({ _id: id }, postedData); + return result; + } catch (err) { + if (err.name === "MongoServerError" && err.code === 11000) { + const field = Object.keys(err.keyPattern)[0]; // Get the field that caused the error + const value = err.keyValue[field]; // Get the value that caused the error + const message = `The ${field} "${value}" is already taken. Please choose a different ${field}.`; + throw new Error(message); + } else{ + throw new Error("something went wrong please try again later"); + } + } +} + + + +module.exports = {findUser, updateUser}; + + + + + + + + + diff --git a/backend/config/dbConnection.js b/backend/config/dbConnection.js new file mode 100644 index 0000000..312e908 --- /dev/null +++ b/backend/config/dbConnection.js @@ -0,0 +1,17 @@ +require("dotenv").config(); +const mongoose = require('mongoose'); + +const connectDB = async (DATABASE_URI) => { + mongoose.set("strictQuery", false); + mongoose.connect( + DATABASE_URI, {useNewUrlParser: true} + ); + const db = mongoose.connection; + db.on("error", console.error.bind(console, "connection error:")); + db.once("open", function () { + console.log("DB connection established"); + }); + +} + +module.exports = connectDB; \ No newline at end of file diff --git a/backend/config/loginConfig.js b/backend/config/loginConfig.js new file mode 100644 index 0000000..8093495 --- /dev/null +++ b/backend/config/loginConfig.js @@ -0,0 +1,31 @@ +const passportSetup = require("../config/passportConfig"); +const passport = require("passport"); +const User = require("../models/Users"); + +const initializeLogin = async (userData, req, res) => { +try{ + const user = new User({ + username: userData.username, + password: userData.password, + }); + + req.login(user, (err) => { + if (err) { + req.flash("error", err.message); + res.redirect("/login"); + } else { + passport.authenticate("local",{ + successRedirect: "/", + successFlash: "Welcome to Knot!", + failureRedirect: "/login", + failureFlash: "Invalid username or password", + })(req, res); + } + }); +} catch(err){ + console.log(err); + req.flash("error", err.message); +}; +}; + +module.exports = initializeLogin; diff --git a/backend/config/logoutConfig.js b/backend/config/logoutConfig.js new file mode 100644 index 0000000..ce220ee --- /dev/null +++ b/backend/config/logoutConfig.js @@ -0,0 +1,15 @@ +const passportSetup = require("./passportConfig"); +const passport = require("passport"); + +const initializeLogout = async (req, res) => { + req.logout((err) => { + if (err) { + console.log(err); + res.redirect("/unknownerror"); + } else { + res.redirect("/login"); + } + }); +}; + +module.exports = initializeLogout; diff --git a/backend/config/passportConfig.js b/backend/config/passportConfig.js new file mode 100644 index 0000000..29a41cc --- /dev/null +++ b/backend/config/passportConfig.js @@ -0,0 +1,62 @@ +const passport = require("passport"); +const GoogleStrategy = require("passport-google-oauth20"); +const User = require("../models/Users"); + +passport.use(User.createStrategy()); + +passport.serializeUser((user, done) => { + done(null, user.id); +}); + +passport.deserializeUser((id, done) => { + User.findById(id).then((user) => { + done(null, user); + }); +}); + +const generateRandomUsername = async (user) => { + const uniqueUserName = await User.findOne({ username: user }) + if (!uniqueUserName) { + return user + } + const prefix = user + const suffix = Math.floor(Math.random() * 10000); + const username = `${prefix}${suffix}`; + const foundUser = await User.findOne({ username }); + if (foundUser) { + return generateRandomUsername(); + } + return username; +} + +passport.use( + new GoogleStrategy( + { + clientID: process.env.CLIENT_ID, + clientSecret: process.env.CLIENT_SECRET, + callbackURL: process.env.CALLBACK_URL, + }, + async (accessToken, refreshToken, profile, done) => { + const randomProfileTheme = ["lorelei", "personas", "fun-emoji", "avataaars", "adventurer", "big-ears"] + const userData = { + googleId: profile.id, + username: await generateRandomUsername(profile._json.email.split("@")[0]), + firstname: profile.name.givenName, + lastname: profile.name.familyName, + email: profile._json.email, + bio: "", + profilePicId: "", + profilePic_url: `https://api.dicebear.com/5.x/${randomProfileTheme[Math.floor(Math.random()*randomProfileTheme.length)]}/svg?seed=${profile.id}&backgroundColor=ffffff,b6e3f4&backgroundType=gradientLinear`, + }; + User.findOne({ googleId: profile.id }, function (err, user) { + if (user) { + return done(err, user); + } else { + User.create(userData, function (err, user) { + return done(err, user); + }); + } + }); + } + ) +); diff --git a/backend/config/passportLocalConfig.js b/backend/config/passportLocalConfig.js new file mode 100644 index 0000000..e954ffc --- /dev/null +++ b/backend/config/passportLocalConfig.js @@ -0,0 +1,26 @@ +const passportSetup = require("../config/passportConfig"); +const passport = require("passport"); +const User = require("../models/Users"); + +const initializeSignup = async (userData, password, req, res) => { + try{ + User.register(userData, password, (err, user) => { + if (err) { + req.flash("error", err.message); + res.redirect("/signup"); + } else { + passport.authenticate("local", { + successRedirect: "/", + successFlash: "Welcome to Knot!", + failureRedirect: "/signup", + failureFlash: true, + })(req, res) + } + }); + } catch(err){ + req.flash("error", err.message); + console.log(err); + } +}; + +module.exports = initializeSignup; \ No newline at end of file diff --git a/backend/controllers/challengesController.js b/backend/controllers/challengesController.js new file mode 100644 index 0000000..18ee3db --- /dev/null +++ b/backend/controllers/challengesController.js @@ -0,0 +1,130 @@ + +const challengesAPI = require("../api/ChallengesAPI"); + +const challengesRender = async (req, res) => { + const pageInfo = { + title: "Knot - Challenges", + pagename: "challenges", + profilePic: req.user.profilePic_url, + userId: (String(req.user._id)), + }; + try { + const challenges = await challengesAPI.fetchChallenges(); + res.render('challenges', { challenges, pageInfo: pageInfo, }); + } catch (err) { + console.log(err); + res.send([]); + } +}; + +const createChallengeRender = async (req, res) => { + const pageInfo = { + user: req.user, + title: "Knot - New Challenge", + pagename: "add challenge", + profilePic: req.user.profilePic_url, + }; + res.render("addChallenge", { pageInfo: pageInfo }); +}; + +const createChallengeController = async (req, res) => { + const challengeData ={ + creatorId: req.user._id, + participators: [req.user._id] + } + if (req.body.content !== "") { + challengeData.content = req.body.content; + }else{ + req.flash("error", "chalu banta hai shale... seriously ?"); + res.redirect("/challenges/add"); + return + } + ; + if (req.body.desc !== "") { + challengeData.description = req.body.desc; + }else{ + req.flash("error", "chalu banta hai shale... seriously ?"); + res.redirect("/challenges/add"); + return + }; + if (req.body.duration !== "") { + challengeData.duration = req.body.duration; + }else{ + req.flash("error", "chalu banta hai shale... seriously ?"); + res.redirect("/challenges/add"); + return + }; + + try { + await challengesAPI.createChallenges(challengeData, req.user._id); + res.redirect("/challenges"); + } catch (err) { + console.log(err); + } +}; + +const viewOneChallengeRender = async(req, res)=>{ + const pageInfo = { + user: req.user, + title: "Knot - Challenge", + pagename: "challenge", + profilePic: req.user.profilePic_url, + userId: (String(req.user._id)) + }; + const challengeId = req.params.id; + + + try{ + const challenge = await challengesAPI.fetchOneChallenge(challengeId); + const challengeParticipators = challenge.participators.map((participator)=>{ + return String(participator._id); + }) + let challengeEnded = null; + const remainingTime = new Date(challenge.duration) - new Date(); + + if (!(remainingTime > 0)) { + challengeEnded = true; + } else { + challengeEnded = false; + } + res.render("oneChallenge", {pageInfo: pageInfo, challenge: challenge, challengeEnded: challengeEnded, challengeParticipators: challengeParticipators, messages: req.flash()}); + }catch(err){ + res.redirect("/challenges") + } +} + +const participateInChallengeRender = async(req, res)=>{ + const challengeId = req.params.id; + const userId = req.user._id; + try{ + await challengesAPI.participateInChallenge(challengeId, userId); + req.flash('success', 'You have successfully participated in this challenge'); + res.redirect(`/challenges/${challengeId}`); + }catch(err){ + req.flash('error', err.message); + res.redirect(`/challenges/${challengeId}`); + } +}; + +const deleteChallengeController = async(req, res)=>{ + const challengeId = req.params.challengeId; + const user = req.user; + try { + await challengesAPI.deleteChallenge(challengeId, user); + res.redirect("/profile/activity"); + } catch (err) { + req.flash("error", "failed to delete challenge"); + res.redirect("/profile"); + } +}; + + + +module.exports = { + challengesRender, + createChallengeRender, + createChallengeController, + viewOneChallengeRender, + participateInChallengeRender, + deleteChallengeController +}; diff --git a/backend/controllers/commentController.js b/backend/controllers/commentController.js new file mode 100644 index 0000000..0b266d1 --- /dev/null +++ b/backend/controllers/commentController.js @@ -0,0 +1,42 @@ +const commentAPI = require("../api/commentAPI") + + +const addCommentController= async (req,res) =>{ + const commentDetails = { + content: req.body.comment, + commentor: req.user._id + } + const postId = req.params.postId + + if(commentDetails.content.trim() === ""){ + req.flash("error","cannot add empty comment") + res.redirect(`/post/${postId}`) + return + } + + try{ + await commentAPI.addComment(commentDetails,postId) + res.redirect(`/post/${postId}`) + } catch(err){ + req.flash("error","cannot add comment, something went wrong") + res.redirect(`/post/${postId}`) + } +} + +const deleteCommentController = async (req,res) =>{ + const commentId = req.body.commentId + const postId = req.params.postId + try{ + await commentAPI.deleteComment(commentId,postId) + res.redirect(`/post/${postId}`) + } catch(err){ + req.flash("error","cannot delete comment, something went wrong") + res.redirect(`/post/${postId}`) + } +} + +module.exports = { + addCommentController, + deleteCommentController +} + diff --git a/backend/controllers/followersController.js b/backend/controllers/followersController.js new file mode 100644 index 0000000..bfe498b --- /dev/null +++ b/backend/controllers/followersController.js @@ -0,0 +1,80 @@ +const Users = require("../models/Users"); + +const followersRender = async (req, res) => { + const user = await Users.findById(req.user._id) + .populate("followers") + .populate("following"); + res.render("followers", { + pageTitle: "Knot - Followers", + profilePicLoggedIn: req.user.profilePic_url, + pageName: "followers", + user: user, + isFollowers: true, + isFollowing: false, + isSearching: false, + followers: user.followers, + currentUser: req.user, + messages: req.flash(), + }); +}; + +const followingRender = async (req, res) => { + const user = await Users.findById(req.user._id) + .populate("followers") + .populate("following"); + res.render("followers", { + pageTitle: "Knot - Followers", + profilePicLoggedIn: req.user.profilePic_url, + pageName: "followers", + user: user, + isFollowing: true, + isFollowers: false, + isSearching: false, + following: user.following, + currentUser: req.user, + messages: req.flash(), + }); +}; + +const viewProfileFollowersRender = async (req, res) => { + const user = await Users.findById(req.params.profileId) + .populate("followers") + .populate("following"); + res.render("followers", { + pageTitle: "Knot - Followers", + profilePicLoggedIn: user.profilePic_url, + pageName: "viewfollowers", + user: user, + isFollowers: true, + isFollowing: false, + followers: user.followers, + currentUser: req.user, + messages: req.flash(), + isSearching: false, + }); +}; + +const viewProfileFollowingRender = async (req, res) => { + const user = await Users.findById(req.params.profileId) + .populate("followers") + .populate("following"); + res.render("followers", { + pageTitle: "Knot - Followers", + profilePicLoggedIn: user.profilePic_url, + pageName: "viewfollowers", + user: user, + isFollowing: true, + isFollowers: false, + following: user.following, + currentUser: req.user, + messages: req.flash(), + isSearching: false, + }); +}; + +module.exports = { + followersRender, + followingRender, + viewProfileFollowersRender, + viewProfileFollowingRender, +}; diff --git a/backend/controllers/homeController.js b/backend/controllers/homeController.js new file mode 100644 index 0000000..2f44b37 --- /dev/null +++ b/backend/controllers/homeController.js @@ -0,0 +1,22 @@ +const postAPI = require('../api/postAPI'); + +const feedController = async (req, res) => { + const pageInfo = { + title: "Knot - Home", + pagename: "home", + profilePic: req.user.profilePic_url, + userId: req.user._id, + user: req.user, + }; + + try { + const posts = await postAPI.fetchPosts(); + res.render("home", { posts, pageInfo: pageInfo, messages: req.flash() }); + } catch (err) { + res.render("home", { posts: [], pageInfo: pageInfo, messages: req.flash() }); + } +}; + +module.exports = { + feedController, +}; diff --git a/backend/controllers/pointsController.js b/backend/controllers/pointsController.js new file mode 100644 index 0000000..5a5edd5 --- /dev/null +++ b/backend/controllers/pointsController.js @@ -0,0 +1,12 @@ +const pointsController = (req, res) => { + const pageInfo = { + pageTitle: "Knot - Points", + profilePicLoggedIn: req.user.profilePic_url, + pageName: "points", + user: req.user, + currentUser: req.user, + }; + res.render("points", { pageInfo }); +}; + +module.exports = { pointsController }; diff --git a/backend/controllers/pollController.js b/backend/controllers/pollController.js new file mode 100644 index 0000000..6d121b3 --- /dev/null +++ b/backend/controllers/pollController.js @@ -0,0 +1,136 @@ +const userAPI = require("../api/userAPI"); +const pollsModel = require("../models/Polls"); +const pollsAPI = require("../api/pollsAPI"); + +const pollsRender = async (req, res) => { + const pageInfo = { + title: 'Knot - Polls', + pagename: 'polls', + profilePic: req.user.profilePic_url, + userId: req.user._id, + } + + try { + const [polls, totalVotes] = await pollsAPI.fetchPolls(); + res.render('polls', { polls, pageInfo: pageInfo, totalVotes }); + } catch (err) { + console.log(err); + res.render('polls', { polls: [] }); + } +} + + +const createPollsController = async (req, res) => { + const id = req.user._id; + const title = req.body.title; + const [option1, option2, option3, option4] = req.body.option; + if(title.trim() === "" || option1.trim() === "" || option2.trim() === "" || option3.trim() === "" || option4.trim() === ""){ + req.flash("error", "can't create poll with empty fields"); + res.redirect("/"); + return; + } + const newPoll = new pollsModel({ + creatorId: id, + content: title, + options: [ + { + + optionsName: option1, + voted_by: [] + + }, + { + + optionsName: option2, + voted_by: [] + }, + { + + optionsName: option3, + voted_by: [] + }, + { + + optionsName: option4, + voted_by: [] + } + + ] + + }); + newPoll.save((err, poll) => { + if (err) { + req.flash("error", "can't create poll, try again later"); + res.redirect("/"); + } else { + try { + userAPI.findUser(req.user).then((user) => { + user.polls.push(poll._id); + user.points += 5; + user.save((err, user) => { + if (err) { + req.flash("error", "can't create poll, try again later"); + res.redirect("/profile"); + } else { + res.redirect("/profile/activity"); + } + }); + }); + } catch (err) { + res.send(err.message); + } + } + }); + +} + + +const viewPollsRender = async (req, res) => { + const postData = await pollsAPI.getPolls(req.user); + res.render("viewPolls", { polls: postData[0] }); +}; + +const createPollsRender = async (req, res) => { + const pageInfo = { + user: req.user, + title: "Knot - New Polls", + pagename: "add polls", + profilePic: req.user.profilePic_url, + }; + const user = req.user; + res.render("addPolls", { user: user, pageInfo: pageInfo }); +} + +const voteController = async (req, res) => { + const clickedOptionId = req.body.clickedOptionId; + const pollId = req.body.pollId; + const userId = req.user._id; + try { + await pollsAPI.voteCount(pollId, clickedOptionId, userId); + res.redirect("/polls"); + } catch (err) { + console.log(err); + } + +} + +const deletePollController = async (req, res) => { + const pollId = req.params.pollId; + const user = req.user; + try { + await pollsAPI.deletePoll(pollId, user); + res.redirect("/profile/activity"); + } catch (err) { + req.flash("error", "can't delete poll, try again later"); + res.redirect("/profile"); + } +}; + +module.exports = { + pollsRender, + createPollsController, + viewPollsRender, + createPollsRender, + voteController, + deletePollController +}; \ No newline at end of file diff --git a/backend/controllers/postController.js b/backend/controllers/postController.js new file mode 100644 index 0000000..3e7857c --- /dev/null +++ b/backend/controllers/postController.js @@ -0,0 +1,118 @@ + +const devAPI = require("../api/devAPI"); +const postAPI = require("../api/postAPI"); +const Posts = require("../models/Posts"); + +const createPostRender = async (req, res) => { + const pageInfo = { + user: req.user, + title: "Knot - New Post", + pagename: "", + profilePic: req.user.profilePic_url, + }; + res.render("addpost", { pageInfo: pageInfo, messages: req.flash() }); +}; + +const createPostController = async (req, res) => { + const user = req.user; + const content = req.body.content; + const imageUrl = req.body.imgUrl; + const imageId = req.body.uploadedImgId; + const pageInfo = { + user: req.user, + title: "Knot - New Post", + pagename: "", + profilePic: req.user.profilePic_url, + }; + try { + await postAPI.addPost(user, content, imageUrl, imageId); + res.json({ success: "post added successfully" }); + } catch (err) { + req.flash("error", "please upload an image or write a post (supported formats: jpg, jpeg, png)"); + res.json({ error: err.message }); + } +}; + +const likeCountController = async (req, res) => { + if (!req.body.upvotes) return res.status(401).send("Unauthorized"); + try { + const postId = req.body.postId; + const currentLike = parseInt(req.body.upvotes); + const currentDisLike = parseInt(req.body.downvotes); + const userId = req.user._id; + await devAPI.increaseLike(postId, currentLike, currentDisLike, userId); + } catch (err) { + console.log(err); + } +}; +const dislikeCountController = async (req, res) => { + if (!req.body.downvotes) return res.status(401).send("Unauthorized"); + try { + const postId = req.body.postId; + const currentLike = parseInt(req.body.upvotes); + const currentDisLike = parseInt(req.body.downvotes); + const userId = req.user._id; + await devAPI.decreaseLike(postId, currentLike, currentDisLike, userId); + } catch (err) { + console.log(err); + } +}; + +const sharePostController = async (req, res) => { + if (!req.body.shares) return; + try { + const postId = req.body.postId; + const currentShare = parseInt(req.body.shares); + const user = req.user; + await postAPI.sharePost(postId, currentShare, user); + res.redirect("/profile"); + } catch (err) { + req.flash("error", "cannot share, something went wrong"); + res.redirect("/profile"); + } +}; + +const deletePostController = async (req, res) => { + const postId = req.params.postId; + const user = req.user; + try { + await postAPI.deletePost(postId, user); + res.redirect("/profile"); + } catch (err) { + req.flash("error", "cannot delete, something went wrong"); + res.redirect("/profile"); + } +}; + +// Single Post and Comments Controller + +const getSinglePostRender = async (req, res) => { + try { + const postId = req.params.postId; + const post = await Posts.findById(postId).populate("creator").exec(); + const stats = await post.stats.populate("comments"); + const comments = []; + for (let comment of stats.comments) { + comments.push(await comment.populate("commentor")); + } + const pageInfo = { + userId: req.user._id, + title: "Knot - Post", + pagename: "comment", + profilePic: req.user.profilePic_url, + }; + res.render("post", { pageInfo: pageInfo, post: post, comments: comments, messages: req.flash() }); + } catch (err) { + res.redirect("/"); + } +}; + +module.exports = { + createPostRender, + createPostController, + likeCountController, + dislikeCountController, + sharePostController, + deletePostController, + getSinglePostRender, +}; diff --git a/backend/controllers/profileController.js b/backend/controllers/profileController.js new file mode 100644 index 0000000..b80ffa3 --- /dev/null +++ b/backend/controllers/profileController.js @@ -0,0 +1,343 @@ +const userAPI = require("../api/userAPI"); +const postAPI = require("../api/postAPI"); +const profileAPI = require("../api/profileAPI"); +const deleteImage = require("../api/deleteImage"); + +const viewProfileRender = async (req, res) => { + const userData = await userAPI.findUser(req.user); + let profilePic = req.user.profilePic_url; + let posts = await postAPI.findPosts(req.user); + for (let post of posts) { + await post.populate("creator"); + } + + const creatorDetails = { + creator: req.user.firstname + " " + req.user.lastname, + profilePic_url: req.user.profilePic_url, + }; + + res.render("profile", { + activeUser: userData, + user: userData, + profilePic: profilePic, + profilePicLoggedIn: profilePic, + pageTitle: "Knot - Profile", + posts: posts, + creatorDetails: creatorDetails, + pageName: "profile", + messages: req.flash(), + }); +}; + +const viewActivityRender = async (req, res) => { + try { + const userData = await userAPI.findUser(req.user); + let profilePic = req.user.profilePic_url; + const [activities, totalVotes] = await profileAPI.getActivities(req.user); + const creatorDetails = { + creator: req.user.firstname + " " + req.user.lastname, + profilePic_url: req.user.profilePic_url, + }; + res.render("profileActivity", { + activeUser: userData, + user: userData, + profilePic: profilePic, + profilePicLoggedIn: profilePic, + pageTitle: "Knot - Profile", + creatorDetails: creatorDetails, + pageName: "profile-activities", + activities: activities, + totalVotes: totalVotes, + }); + } catch (err) { + req.flash("error", err.message); + res.redirect("/profile"); + } +}; + +const editProfileRender = async (req, res) => { + const userData = await userAPI.findUser(req.user); + let profilePic = req.user.profilePic_url; + res.render("editProfile", { + activeUser: userData, + user: userData, + profilePic: profilePic, + profilePicLoggedIn: profilePic, + pageTitle: "Knot - Profile", + pageName: "profile-edit", + existingdata: userData, + messages: req.flash(), + }); +}; +const editProfileController = async (req, res) => { + const id = req.user._id; + try { + if (req.body.profilePicId && req.user.profilePicId !== "" && !req.user.profilePicId) { + await deleteImage(req.user.profilePicId); + } + } catch (err) { + req.flash("error", err.message); + res.json({ error: err.message }); + } + if(req.body.profilePic === null){ + req.flash("error", "Please upload a valid profile picture"); + res.json({ error: "Please upload a valid profile picture" }); + return; + } + + const postedData = { + points: req.user.points, + }; + if (req.body.dob !== "") { + postedData.date_of_birth = req.body.dob; + } + if (req.body.firstname !== "") { + postedData.firstname = req.body.firstname.replace(/\s/g, ""); + } + if (req.body.lastname !== "") { + postedData.lastname = req.body.lastname.replace(/\s/g, ""); + } + if (req.body.bio !== "") { + postedData.bio = req.body.bio; + } + if (req.body.username !== "") { + postedData.username = req.body.username.replace(/\s/g, ""); + } + if (req.body.profilePic !== "") { + postedData.profilePic_url = req.body.profilePic; + postedData.profilePicId = req.body.profilePicId; + } + if ( + !(req.user.username == postedData.username) && + postedData.username != undefined + ) { + if (postedData.points < 20) { + req.flash( + "error", + "You don't have enough points to change your username" + ); + res.json({ + error: "You don't have enough points to change your username", + }); + return; + } else { + postedData.points -= 20; + } + } + if (postedData.profilePic_url) { + if (postedData.points < 50) { + try { + if (req.body.profilePicId) { + await deleteImage(req.body.profilePicId); + req.flash( + "error", + "You don't have enough points to change your profile picture" + ); + res.json({ + error: + "You don't have enough points to change your profile picture", + }); + } + } catch (err) { + req.flash("error", err.message); + res.json({ error: err.message }); + } + return; + } else { + postedData.points -= 50; + } + } + try { + await userAPI.updateUser(id, postedData); + req.flash("success", "Profile updated successfully"); + res.json({ success: "Profile updated successfully" }); + } catch (err) { + req.flash("error", err.message); + res.json({ error: err.message }); + } +}; +const singleProfileRender = async (req, res) => { + let user = { + _id: req.params.profileId, + }; + if (user._id === String(req.user._id)) { + res.redirect("/profile"); + return; + } + try { + const userData = await userAPI.findUser(user); + const activeUser = req.user; + let profilePic = userData.profilePic_url; + let posts = await postAPI.findPosts(user); + for (let post of posts) { + await post.populate("creator"); + } + const creatorDetails = { + creator: userData.firstname + " " + userData.lastname, + profilePic_url: userData.profilePic_url, + }; + + res.render("profile", { + activeUser, + user: userData, + profilePic: profilePic, + profilePicLoggedIn: req.user.profilePic_url, + pageTitle: "Knot - Profile", + posts: posts, + creatorDetails: creatorDetails, + pageName: "viewProfile", + messages: req.flash(), + }); + } catch (err) { + res.redirect("/"); + } +}; + +const singleProfileActivityRender = async (req, res) => { + let user = { + _id: req.params.profileId, + }; + if (user._id === String(req.user._id)) { + res.redirect("/profile/activity"); + return; + } + try { + const userDataPromise = userAPI.findUser(user); + const activitiesPromise = profileAPI.getActivities(user); + const [userData, [activities, totalVotes]] = await Promise.all([ + userDataPromise, + activitiesPromise, + ]); + const activeUser = req.user; + let profilePic = userData.profilePic_url; + const creatorDetails = { + creator: userData.firstname + " " + userData.lastname, + profilePic_url: userData.profilePic_url, + }; + res.render("profileActivity", { + activeUser, + user: userData, + profilePic: profilePic, + profilePicLoggedIn: req.user.profilePic_url, + pageTitle: "Knot - Profile", + creatorDetails: creatorDetails, + pageName: "viewProfile-activities", + activities: activities, + totalVotes: totalVotes, + }); + } catch (err) { + req.flash("error", err.message); + res.redirect("/profile"); + } +}; + +const followController = async (req, res) => { + const followerId = req.user._id; + const followingId = req.params.followingId; + try { + await profileAPI.followAndUnfollow(followingId, followerId); + res.redirect("back"); + } catch (err) { + req.flash("error", err.message); + res.redirect("back"); + } +}; + +const searchProfileRender = async (req, res) => { + res.render("followers", { + pageTitle: "Knot - Search Profile", + profilePicLoggedIn: req.user.profilePic_url, + pageName: "searching-profile", + user: req.user, + isFollowing: false, + isFollowers: false, + isSearching: true, + currentUser: req.user, + foundUser: [], + searchValue: "", + messages: req.flash(), + }); +}; + +const searchProfileController = async (req, res) => { + if (!req.query.user || req.query.user === "") { + req.flash("error", "Please enter something to search"); + res.render("followers", { + pageTitle: "Knot - Search Profile", + profilePicLoggedIn: req.user.profilePic_url, + pageName: "searching-profile", + user: req.user, + isFollowers: false, + isFollowing: false, + isSearching: true, + currentUser: req.user, + foundUser: [], + searchValue: '', + messages: req.flash(), + }); + return; + } + try { + const foundUser = await profileAPI.searchProfile(req.query.user); + if (foundUser.length > 0) { + res.render("followers", { + pageTitle: "Knot - Search Profile", + profilePicLoggedIn: req.user.profilePic_url, + pageName: "searching-profile", + user: req.user, + isFollowers: false, + isFollowing: false, + isSearching: true, + currentUser: req.user, + foundUser: foundUser, + searchValue: req.query.user, + messages: req.flash(), + }); + return; + } else { + req.flash("error", `No user found that matches '${req.query.user}'`); + res.render("followers", { + pageTitle: "Knot - Search Profile", + profilePicLoggedIn: req.user.profilePic_url, + pageName: "searching-profile", + user: req.user, + isFollowers: false, + isFollowing: false, + isSearching: true, + currentUser: req.user, + foundUser: [], + searchValue: '', + messages: req.flash(), + }); + return; + } + } catch (error) { + req.flash("somethingWrong", "something went wrong, please try again later"); + res.render("followers", { + pageTitle: "Knot - Search Profile", + profilePicLoggedIn: req.user.profilePic_url, + pageName: "searching-profile", + user: req.user, + isFollowers: false, + isFollowing: false, + isSearching: true, + currentUser: req.user, + foundUser: [], + searchValue: '', + messages: req.flash(), + }); + return; + } +}; + +module.exports = { + viewProfileRender, + viewActivityRender, + editProfileRender, + editProfileController, + singleProfileRender, + singleProfileActivityRender, + followController, + searchProfileController, + searchProfileRender, +}; diff --git a/backend/controllers/userController.js b/backend/controllers/userController.js new file mode 100644 index 0000000..32f3267 --- /dev/null +++ b/backend/controllers/userController.js @@ -0,0 +1,67 @@ +const express = require("express"); +const User = require("../models/Users"); +const passportSetup = require("../config/passportConfig"); +const initializeSignup = require("../config/passportLocalConfig"); +const initializeLogin = require("../config/loginConfig"); +const initializeLogout = require("../config/logoutConfig"); + + + +const signUpRender = (req, res) => { + res.render("signUp", {pageTitle: 'Knot - Sign Up', messages: req.flash()}); +}; + +const signUpController = async (req, res) => { + const randomProfileTheme = ["lorelei", "personas", "fun-emoji", "avataaars", "adventurer", "big-ears"] + const userData = { + firstname: req.body.firstname.replace(/\s/g, ""), + lastname: req.body.lastname.replace(/\s/g, ""), + username: req.body.username.replace(/\s/g, ""), + email: req.body.email, + bio: "", + profilePicId: "", + profilePic_url: `https://api.dicebear.com/5.x/${randomProfileTheme[Math.floor(Math.random()*randomProfileTheme.length)]}/svg?seed=${req.body.username}&backgroundColor=ffffff,b6e3f4&backgroundType=gradientLinear`, + }; + try{ + + await initializeSignup(userData, req.body.password, req, res); + } catch(err){ + req.flash("error", err.message); + console.log(err); + }; +}; + + +const loginRender = (req, res) => { + res.render("login",{pageTitle: 'Knot - Login', messages: req.flash()}); +}; + +const loginController = async (req, res) => { + const userData = { + username: req.body.username, + password: req.body.password + } + try{ + + await initializeLogin(userData, req, res); + } catch(err){ + req.flash("error", err.message); + console.log(err); + }; +}; + +const logoutController = (req, res) => { + initializeLogout(req, res); +}; +const forgotPasswordController = (req, res) => { + req.flash("warning", "We are working on this feature."); + res.redirect("/login"); +}; +module.exports = { + signUpController, + signUpRender, + loginController, + loginRender, + logoutController, + forgotPasswordController +}; diff --git a/backend/index.js b/backend/index.js new file mode 100644 index 0000000..d61cf11 --- /dev/null +++ b/backend/index.js @@ -0,0 +1,78 @@ +require("dotenv").config(); +const express = require("express"); +const path = require("path"); +const flash = require("connect-flash"); +const app = express(); +const session = require("express-session"); +const connectDB = require("./config/dbConnection"); +const homeRouter = require("./routes/home"); +const signUpRouter = require("./routes/signup"); +const authRouter = require("./routes/auth"); +const profileRouter = require("./routes/profile"); +const loginRouter = require("./routes/login"); +const logoutRouter = require("./routes/logout"); +const forgotPasswordRouter = require("./routes/forgotpassword"); +const postRouter = require("./routes/post"); +const followersRouter = require("./routes/followers"); +const pollsRouter = require("./routes/polls"); +const challengesRouter = require("./routes/challenges"); +const devApiRouter = require("./routes/devApi"); +const pointsRouter = require("./routes/points"); +const checkAuthorized = require("./middlewares/checkAuth"); +const passportSetup = require("./config/passportConfig"); +const passport = require("passport"); +app.use(express.static(path.join(__dirname, "..", "frontend", "public"))); +app.use(express.static("public")); +app.use(express.json()); +app.set("view engine", "ejs"); +app.set("views", path.join(__dirname, "views")); + +app.use( + express.urlencoded({ + extended: false, + }) +); +app.use(flash()); +app.use( + session({ + secret: process.env.SESSION_SECRET, + resave: false, + saveUninitialized: true, + cookie: { + maxAge: 1000 * 60 * 60 * 24 * 7, + }, + }) +); + +app.use(passport.initialize()); +app.use(passport.session()); + +app.use("/signup", signUpRouter); +app.use("/auth", authRouter); +app.use("/login", loginRouter); +app.use("/forgotpassword", forgotPasswordRouter); +app.use(checkAuthorized); + +app.use("/", homeRouter) +app.use("/", followersRouter); +app.use("/profile", profileRouter); +app.use("/logout", logoutRouter); +app.use("/post", postRouter); +app.use("/polls", pollsRouter); +app.use("/challenges", challengesRouter) +app.use("/api/v1", devApiRouter); +app.use("/points", pointsRouter); + +//use wildcard to catch all routes +app.get("*", (req, res) => { + res.render("404"); +}); + + +(async () => { + await connectDB(process.env.DB_URI); + const PORT = process.env.PORT || 80; +app.listen(PORT, () => { + console.log("listening on port 80"); +}); +})(); diff --git a/backend/middlewares/checkAuth.js b/backend/middlewares/checkAuth.js new file mode 100644 index 0000000..eefc408 --- /dev/null +++ b/backend/middlewares/checkAuth.js @@ -0,0 +1,10 @@ +const checkAuth = (req, res, next) => { + if(req.isAuthenticated()){ + next(); + }else{ + res.redirect('/login'); + } +} + + +module.exports = checkAuth; \ No newline at end of file diff --git a/backend/middlewares/notAuth.js b/backend/middlewares/notAuth.js new file mode 100644 index 0000000..bb55340 --- /dev/null +++ b/backend/middlewares/notAuth.js @@ -0,0 +1,9 @@ +const checkNotAuth = (req, res, next) => { + if(req.isAuthenticated()){ + return res.redirect('/profile'); + } + next(); +} + + +module.exports = checkNotAuth; \ No newline at end of file diff --git a/backend/models/Challenges.js b/backend/models/Challenges.js new file mode 100644 index 0000000..3c8ef28 --- /dev/null +++ b/backend/models/Challenges.js @@ -0,0 +1,12 @@ +const mongoose = require("mongoose") + +const challengesSchema = mongoose.Schema({ + creatorId: { type: mongoose.Schema.Types.ObjectId,ref: "User", required: true }, + content: { type: String, required: true }, + description: { type: String, required: true }, + timestamp: { type: Date, default: Date.now }, + participators:[{type:mongoose.Schema.Types.ObjectId,ref: "User"}], + duration:{type: Date} +}); + +module.exports = mongoose.model("Challenge", challengesSchema); \ No newline at end of file diff --git a/backend/models/Comments.js b/backend/models/Comments.js new file mode 100644 index 0000000..dfc077f --- /dev/null +++ b/backend/models/Comments.js @@ -0,0 +1,22 @@ +const mongoose = require("mongoose"); +const schema = mongoose.Schema; + +const commentSchema = mongoose.Schema({ + content: { type: String, required: true }, + commentor: { type: schema.Types.ObjectId, ref: "User", required: true }, + timestamp: { type: Date, default: Date.now }, + stats: { + upvotes: { type: Number, default: 0 }, + downvotes: { type: Number, default: 0 }, + }, + replies: [ + { + content: { type: String, required: true }, + author: { type: schema.Types.ObjectId, ref: "User", required: true }, + } + ] + + +}); + +module.exports = mongoose.model("Comment", commentSchema); \ No newline at end of file diff --git a/backend/models/Polls.js b/backend/models/Polls.js new file mode 100644 index 0000000..3454f1c --- /dev/null +++ b/backend/models/Polls.js @@ -0,0 +1,15 @@ +const mongoose = require("mongoose") + +const pollsSchema = mongoose.Schema({ + creatorId: { type: mongoose.Schema.Types.ObjectId,ref: "User", required: true }, + content: { type: String, required: true }, + timestamp: { type: Date, default: Date.now } , + options: [ + { + optionsName: String, + voted_by: [{type:mongoose.Schema.Types.ObjectId,ref: "User" }] + } + ] +}); + +module.exports = mongoose.model("Poll", pollsSchema); \ No newline at end of file diff --git a/backend/models/Posts.js b/backend/models/Posts.js new file mode 100644 index 0000000..b8c0659 --- /dev/null +++ b/backend/models/Posts.js @@ -0,0 +1,26 @@ +const mongoose = require("mongoose"); +const schema = mongoose.Schema; + +const postSchema = mongoose.Schema( + { + content: { type: String }, + imagePath: { type: String }, + imageId: { type: String }, + creator: { + type: schema.Types.ObjectId, + ref: "User", + required: true, + unique: false, + }, + timestamp: { type: Date, default: Date.now }, + stats: { + upvoted_by: { type: Array, default: [] }, + downvoted_by: { type: Array, default: [] }, + shares: { type: Number, default: 0 }, + comments: [{ type: schema.Types.ObjectId, ref: "Comment" }], + }, + }, + { timestamps: true } +); + +module.exports = mongoose.model("Post", postSchema); diff --git a/backend/models/Users.js b/backend/models/Users.js new file mode 100644 index 0000000..e039f23 --- /dev/null +++ b/backend/models/Users.js @@ -0,0 +1,64 @@ +const mongoose = require("mongoose"); +const passportLocalMongoose = require("passport-local-mongoose"); +const findOrCreate = require("mongoose-findorcreate"); + +let UserSchema = new mongoose.Schema( + { + firstname: { + type: String, + required: true, + match: [/^[a-zA-Z0-9]+$/, "is invalid"], + index: {type: "text"}, + }, + lastname: { + type: String, + required: true, + match: [/^[a-zA-Z0-9]+$/, "is invalid"], + index: {type: "text"}, + }, + username: { + type: String, + lowercase: true, + required: true, + unique: true, + match: [/^[a-zA-Z0-9]+$/, "is invalid"], + index: {type: "text"}, + }, + googleId: { + type: String, + }, + password: { + type: String, + }, + bio: { + type: String, + }, + date_of_birth: { type: Date }, + email: { + type: String, + required: true, + index: true, + }, + profilePic_url: { + type: String, + }, + profilePicId:{type:String}, + points: { + type: Number, + default: 0, + }, + sharedPosts: [{ type: mongoose.Schema.Types.ObjectId, ref: "Post" }], + participatedChallenges: [{ type: mongoose.Schema.Types.ObjectId, ref: "Challenge" }], + posts: [{ type: mongoose.Schema.Types.ObjectId, ref: "Post" }], + challenges: [{ type: mongoose.Schema.Types.ObjectId, ref: "Challenge" }], + polls: [{ type: mongoose.Schema.Types.ObjectId, ref: "Poll" }], + followers: [{ type: mongoose.Schema.Types.ObjectId, ref: "User" }], + following: [{ type: mongoose.Schema.Types.ObjectId, ref: "User" }], + }, + { + timestamps: true, + } +); +UserSchema.plugin(passportLocalMongoose); +UserSchema.plugin(findOrCreate); +module.exports = mongoose.model("User", UserSchema); diff --git a/backend/routes/auth.js b/backend/routes/auth.js new file mode 100644 index 0000000..b503471 --- /dev/null +++ b/backend/routes/auth.js @@ -0,0 +1,18 @@ +const router = require("express").Router(); +const passport = require("passport"); +const checkNotAuthorized = require("../middlewares/notAuth.js"); + +router.get( + "/google", + passport.authenticate("google", { scope: ["profile", "email"] }) +); + +router.get( + "/google/login", + passport.authenticate("google", { failureRedirect: "/login" }), + (req, res) => { + res.redirect("/"); + } +); + +module.exports = router; \ No newline at end of file diff --git a/backend/routes/challenges.js b/backend/routes/challenges.js new file mode 100644 index 0000000..3a96fe1 --- /dev/null +++ b/backend/routes/challenges.js @@ -0,0 +1,11 @@ +const router = require('express').Router(); +const challengesController = require('../controllers/challengesController'); +const checkAuthorized = require("../middlewares/checkAuth.js"); + +router.route('/').get(checkAuthorized, challengesController.challengesRender); +router.route('/add').get(checkAuthorized, challengesController.createChallengeRender).post(checkAuthorized, challengesController.createChallengeController); +router.get('/:id', checkAuthorized, challengesController.viewOneChallengeRender); +router.get('/participate/:id', checkAuthorized, challengesController.participateInChallengeRender); +router.route('/delete/:challengeId').get(challengesController.deleteChallengeController); + +module.exports = router; diff --git a/backend/routes/devApi.js b/backend/routes/devApi.js new file mode 100644 index 0000000..61beba6 --- /dev/null +++ b/backend/routes/devApi.js @@ -0,0 +1,10 @@ +const router = require("express").Router(); +const controller = require("../controllers/postController"); +const getSignature = require("../api/getSignature"); + +router.route("/post/upvote").post(controller.likeCountController); +router.route("/post/downvote").post(controller.dislikeCountController); +router.route("/post/share").post(controller.sharePostController); +router.route("/get-signature").post(getSignature); + +module.exports = router; diff --git a/backend/routes/followers.js b/backend/routes/followers.js new file mode 100644 index 0000000..fd7ba78 --- /dev/null +++ b/backend/routes/followers.js @@ -0,0 +1,9 @@ +const router = require('express').Router(); +const controller = require('../controllers/followersController'); + +router.route('/followers').get(controller.followersRender); +router.route('/following').get(controller.followingRender); +router.route('/followers/:profileId').get(controller.viewProfileFollowersRender); +router.route('/following/:profileId').get(controller.viewProfileFollowingRender); + +module.exports = router; \ No newline at end of file diff --git a/backend/routes/forgotpassword.js b/backend/routes/forgotpassword.js new file mode 100644 index 0000000..9fa8fdc --- /dev/null +++ b/backend/routes/forgotpassword.js @@ -0,0 +1,10 @@ +const router = require('express').Router(); +const controller = require('../controllers/userController'); +const checkNotAuthorized = require("../middlewares/notAuth.js"); + + +router.route('/').get(checkNotAuthorized, controller.forgotPasswordController); + +module.exports = router; + + diff --git a/backend/routes/home.js b/backend/routes/home.js new file mode 100644 index 0000000..5a06d3c --- /dev/null +++ b/backend/routes/home.js @@ -0,0 +1,6 @@ +const router = require('express').Router(); +const home = require('../controllers/homeController'); + +router.get('/', home.feedController); + +module.exports = router; \ No newline at end of file diff --git a/backend/routes/login.js b/backend/routes/login.js new file mode 100644 index 0000000..d7691ef --- /dev/null +++ b/backend/routes/login.js @@ -0,0 +1,10 @@ +const router = require('express').Router(); +const controller = require('../controllers/userController'); +const checkNotAuthorized = require("../middlewares/notAuth.js"); + + +router.route('/').get(checkNotAuthorized, controller.loginRender).post(controller.loginController); + +module.exports = router; + + diff --git a/backend/routes/logout.js b/backend/routes/logout.js new file mode 100644 index 0000000..32722a2 --- /dev/null +++ b/backend/routes/logout.js @@ -0,0 +1,8 @@ +const router = require('express').Router(); +const controller = require('../controllers/userController'); +const checkAuthorized = require("../middlewares/checkAuth.js"); + + +router.route('/').post(checkAuthorized, controller.logoutController); + +module.exports = router; diff --git a/backend/routes/points.js b/backend/routes/points.js new file mode 100644 index 0000000..79a8d74 --- /dev/null +++ b/backend/routes/points.js @@ -0,0 +1,7 @@ +const router = require('express').Router(); +const points = require('../controllers/pointsController'); + +router.get('/', points.pointsController); + + +module.exports = router; \ No newline at end of file diff --git a/backend/routes/polls.js b/backend/routes/polls.js new file mode 100644 index 0000000..d804989 --- /dev/null +++ b/backend/routes/polls.js @@ -0,0 +1,12 @@ +const router = require('express').Router(); +const pollsController = require('../controllers/pollController'); +const checkAuthorized = require("../middlewares/checkAuth.js"); + +router.route('/').get(pollsController.pollsRender) +router.post('/vote',pollsController.voteController); +router.route('/add').get(pollsController.createPollsRender).post(checkAuthorized, pollsController.createPollsController); +router.route('/delete/:pollId').get(pollsController.deletePollController); + + + +module.exports = router; diff --git a/backend/routes/post.js b/backend/routes/post.js new file mode 100644 index 0000000..611d7fc --- /dev/null +++ b/backend/routes/post.js @@ -0,0 +1,12 @@ +const router = require('express').Router(); +const controller = require('../controllers/postController'); +const {addCommentController,deleteCommentController} = require('../controllers/commentController') +const checkAuthorized = require("../middlewares/checkAuth.js"); + + +router.route('/add').get(checkAuthorized, controller.createPostRender).post(checkAuthorized, controller.createPostController); +router.route('/delete/:postId').get(checkAuthorized, controller.deletePostController); +router.route('/:postId').get(checkAuthorized, controller.getSinglePostRender) +router.route("/:postId/comment").post(addCommentController).delete(deleteCommentController) + +module.exports = router; diff --git a/backend/routes/profile.js b/backend/routes/profile.js new file mode 100644 index 0000000..10db487 --- /dev/null +++ b/backend/routes/profile.js @@ -0,0 +1,16 @@ + +const router = require('express').Router(); +const controller = require('../controllers/profileController'); +const checkAuthorized = require("../middlewares/checkAuth.js"); + + +router.route('/').get(checkAuthorized, controller.viewProfileRender); +router.get('/searchuser', controller.searchProfileRender); +router.get('/search', controller.searchProfileController); +router.route('/activity').get(checkAuthorized, controller.viewActivityRender); +router.route("/update").get(controller.editProfileRender).post(controller.editProfileController); +router.get('/follow/:followingId',checkAuthorized, controller.followController) +router.route('/:profileId').get(checkAuthorized, controller.singleProfileRender); +router.route('/activity/:profileId').get(checkAuthorized, controller.singleProfileActivityRender); + +module.exports = router; diff --git a/backend/routes/signup.js b/backend/routes/signup.js new file mode 100644 index 0000000..5d683e9 --- /dev/null +++ b/backend/routes/signup.js @@ -0,0 +1,13 @@ +const router = require("express").Router(); +const passport = require("passport"); +const checkNotAuthorized = require("../middlewares/notAuth.js"); + +const signUp = require("../controllers/userController"); +router + .route("/") + .get(checkNotAuthorized, signUp.signUpRender) + .post(signUp.signUpController); + + +module.exports = router; + diff --git a/backend/views/404.ejs b/backend/views/404.ejs new file mode 100644 index 0000000..4be560f --- /dev/null +++ b/backend/views/404.ejs @@ -0,0 +1,25 @@ + + + + + + + + + Page not found - Knot + + +
+
+

404

+
+ +
+

Looks like you're lost

+

The page you are looking for, we did Knot design that yet!

+ Go to Home +
+
+ + + diff --git a/backend/views/addChallenge.ejs b/backend/views/addChallenge.ejs new file mode 100644 index 0000000..e8b452d --- /dev/null +++ b/backend/views/addChallenge.ejs @@ -0,0 +1,9 @@ +<%- include ('partials/header',{pageTitle: pageInfo.title}) %> <%- include ('partials/nav',{profilePic: + pageInfo.profilePic, pageName: pageInfo.pagename }) %> + +
+ <%- include ('partials/createChallenges',{profilePic: pageInfo.profilePic, pageName: pageInfo.pagename, pageInfo: + pageInfo }) %> +
+ + <%- include ('partials/footer') %> \ No newline at end of file diff --git a/backend/views/addPolls.ejs b/backend/views/addPolls.ejs new file mode 100644 index 0000000..9ca0e4b --- /dev/null +++ b/backend/views/addPolls.ejs @@ -0,0 +1,9 @@ +<%- include ('partials/header',{pageTitle: pageInfo.title}) %> <%- include ('partials/nav',{profilePic: + pageInfo.profilePic, pageName: pageInfo.pagename }) %> + +
+ <%- include ('partials/createPolls',{profilePic: pageInfo.profilePic, pageName: pageInfo.pagename, pageInfo: + pageInfo }) %> +
+ + <%- include ('partials/footer') %> \ No newline at end of file diff --git a/backend/views/addpost.ejs b/backend/views/addpost.ejs new file mode 100644 index 0000000..d148efa --- /dev/null +++ b/backend/views/addpost.ejs @@ -0,0 +1,13 @@ +<%- include ('partials/header',{pageTitle: pageInfo.title}) %> <%- include ('partials/nav',{profilePic: + pageInfo.profilePic, pageName: pageInfo.pagename }) %> + +
+ <%- include ('partials/createPost',{profilePic: pageInfo.profilePic, pageName: pageInfo.pagename, pageInfo: + pageInfo, messages: messages}) %> +
+ + + +<% if (messages.error) { %> + <%- include ('partials/flashModal.ejs',{messages: messages}) %> + <% }%> \ No newline at end of file diff --git a/backend/views/challenges.ejs b/backend/views/challenges.ejs new file mode 100644 index 0000000..845418c --- /dev/null +++ b/backend/views/challenges.ejs @@ -0,0 +1,70 @@ +<%- include ('partials/header',{pageTitle: pageInfo.title}) %> + <%- include ('partials/nav',{profilePic: pageInfo.profilePic, pageName: pageInfo.pagename }) %> + +
+ <% challenges.map(challenge=>{ %> +
+
+
+ +
+ <%- challenge.creatorId.firstname==undefined ? challenge.creatorId : + challenge.creatorId.firstname + ' ' + challenge.creatorId.lastname %> + + <%= new Intl.RelativeTimeFormat('en',{style: 'long' + }).format((((challenge.timestamp.valueOf()) - Date.now()) / (1000 * 60 * 60 * + 24)).toFixed(),'day') %> + +
+
+
+ + <%=challenge.content%> + <% const remainingTime=new Date(challenge.duration) - new Date(); %> + <% if (remainingTime> 0) { %> + <% const remainingDays=Math.ceil(remainingTime / (1000 * 60 * 60 * 24)); %> + <% if (remainingDays> 1) { %> +

+ <%= remainingDays %> days remaining +

+ <% } else { %> +

1 day remaining

+ <% } %> + <% } else { %> +

Challenge has + ended

+ <% } %> +
+
+
+

+ + <%=challenge.description%> + +

+
+
+ + <% if (challenge.participators.includes(pageInfo.userId) && ((new Date(challenge.duration) - new Date()) > 0)) { %> +
Participated
+ <% } else if(challenge.creatorId._id==pageInfo.userId) { %> +
+ <% } else if (((new Date(challenge.duration) - new Date()) > 0)) { %> + Participate + <% } else if(!((new Date(challenge.duration) - new Date()) > 0)) { %> +
Challenge Ended +
+ <% } %> +
+ +
+ +
+ + <% }) %> +
+ +<%- include ('partials/footer') %> \ No newline at end of file diff --git a/backend/views/editProfile.ejs b/backend/views/editProfile.ejs new file mode 100644 index 0000000..d5cc881 --- /dev/null +++ b/backend/views/editProfile.ejs @@ -0,0 +1,63 @@ +<%- include ('partials/header',{pageTitle: pageTitle}) %> + <%- include ('partials/nav',{profilePic: profilePicLoggedIn, pageName: "" }) %> + <%- include ('partials/profilecard',{user: user, activeUser: activeUser }) %> + +
+ +
+
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ +
+

50 points required to update your profile picture. know why !!

+
+ + +
+
+ + +
+
+ + +
+ +
+
+ +
+ +
+
+ <% if (messages.error) { %> + <%- include ('partials/flashModal',{messages: messages}) %> + <% } else if(messages.success){ %> + <%- include ('partials/flashModal',{messages: messages}) %> + <% } %> \ No newline at end of file diff --git a/backend/views/followers.ejs b/backend/views/followers.ejs new file mode 100644 index 0000000..dc6bae2 --- /dev/null +++ b/backend/views/followers.ejs @@ -0,0 +1,127 @@ +<%- include ('partials/header',{pageTitle: pageTitle}) %> + <%- include ('partials/nav',{profilePic: currentUser.profilePic_url, pageName: pageName }) %> + +
+
+
+
+ + +
+
+ +
+ <% isFollowers && followers.map(follower => { %> +
+ +
+ +
+ <%= follower.firstname+' '+follower.lastname %> +
+ <% if (currentUser._id.toString() !== follower._id.toString()) { %> + <%= currentUser.following.includes(follower._id) ? 'Unfollow' : 'Follow' %> + <% } %> +
+
+ <% }) %> + + <% isFollowing && following.map(following => { %> +
+ +
+ +
+ <%= following.firstname+' '+following.lastname %> +
+ <% if (currentUser._id.toString() !== following._id.toString()) { %> + <%= currentUser.following.includes(following._id) ? 'Unfollow' : 'Follow' %> + <% } %> +
+
+ <% }) %> + <% if(isSearching) { %> +
+
+ + +
+
+ <% } %> +
+<% if(isSearching && foundUser.length > 0 ) { %> +
+ <% isSearching && foundUser.length > 0 && foundUser.map(user => { %> +
+ +
+ +
+ <%= user.firstname+' '+user.lastname %> +
+ + <%=user.username%> +
+
+ <% }) %> +
+ <% } %> + <% if(isSearching && foundUser.length === 0 ) { %> +
+ <% if(messages.error) { %> +
+ <%= messages.error %> +
+ <% } %> +
+ <% } %> + <% if(isSearching && messages.somethingWrong ) { %> +
+ <% if(messages.somethingWrong) { %> +
+ <%= messages.somethingWrong %> +
+ <% } %> +
+ <% } %> + + + +
+
+ + +<%- include ('partials/footer') %> + + diff --git a/backend/views/home.ejs b/backend/views/home.ejs new file mode 100644 index 0000000..d9d055f --- /dev/null +++ b/backend/views/home.ejs @@ -0,0 +1,18 @@ +<%- include ('partials/header',{pageTitle: pageInfo.title}) %> +<%- include ('partials/nav',{profilePic: pageInfo.profilePic, pageName: pageInfo.pagename }) %> + + + +
+ + <%- include ('partials/homePageAddButtons',{profilePic: pageInfo.profilePic, pageName: pageInfo.pagename, pageInfo: pageInfo }) %> + + <% posts.map(post =>{ %> + <%- include ('partials/timeline',{post: post,user:pageInfo.user, userId: pageInfo.userId, pageName: pageInfo.pagename}) %> + + <% }) %> +
+<% if (messages.error) { %> + <%- include ('partials/flashModal.ejs',{messages: messages}) %> + <% }%> +<%- include ('partials/footer') %> \ No newline at end of file diff --git a/backend/views/login.ejs b/backend/views/login.ejs new file mode 100644 index 0000000..dcefead --- /dev/null +++ b/backend/views/login.ejs @@ -0,0 +1,59 @@ +<%- include('partials/header',{pageTitle: pageTitle}) %> + + + + + +
+
+
+
+
+
+
+ +
+ +
Sign in to Knot
+
+ +
+
+ + +
+ +
+ + + +
+ + +
+ +
+
+ + + +
+ +
+
+
+
+ + <% if (messages.error || messages.warning) { %> + <%- include('partials/flashModal', {message: messages}) %> + <% } %> + + + \ No newline at end of file diff --git a/backend/views/oneChallenge.ejs b/backend/views/oneChallenge.ejs new file mode 100644 index 0000000..54b82c1 --- /dev/null +++ b/backend/views/oneChallenge.ejs @@ -0,0 +1,94 @@ +<%- include ('partials/header',{pageTitle: pageInfo.title}) %> + <%- include ('partials/nav',{profilePic: pageInfo.profilePic, pageName: pageInfo.pagename }) %> + +
+
+
+
+ +
+ <%- challenge.creatorId.firstname==undefined ? challenge.creatorId : + challenge.creatorId.firstname + ' ' + challenge.creatorId.lastname %> + + <%= new Intl.RelativeTimeFormat('en',{style: 'long' + }).format((((challenge.timestamp.valueOf()) - Date.now()) / (1000 * 60 * 60 * + 24)).toFixed(),'day') %> + +
+
+
+ <%=challenge.content%> + <% const remainingTime=new Date(challenge.duration) - new Date(); %> + <% if (remainingTime> 0) { %> + <% const remainingDays=Math.ceil(remainingTime / (1000 * 60 * 60 * 24)); %> + <% if (remainingDays> 1) { %> +

+ <%= remainingDays %> days remaining +

+ <% } else { %> +

1 day remaining

+ <% } %> + <% } else { %> +

Challenge has ended

+ <% } %> +
+
+

+ <%=challenge.description%> +

+
+
+
+
+ <%= challenge.participators.length%> Participants +
+
+ + <% if (challengeParticipators.includes(pageInfo.userId) && !challengeEnded) { %> +
Participated
+ <% } else if(challenge.creatorId._id==pageInfo.userId) { %> +
+ <% } else if (!challengeEnded) { %> + Participate + <% } else if(challengeEnded) { %> +
Challenge Ended +
+ <% } %> +
+
+ +
+
+ +
+
+
+

Participants

+
+
+ <% challenge.participators.map(participator=>{ %> + + <% }) %> +
+
+
+ <% if (messages.success) { %> + <%- include ('partials/flashModal',{message: messages}) %> + <% } %> + <% if (messages.error) { %> + <%- include ('partials/flashModal',{message: messages}) %> + <% } %> +
+
+ +
+
+ + <%- include ('partials/footer') %> \ No newline at end of file diff --git a/backend/views/partials/createChallenges.ejs b/backend/views/partials/createChallenges.ejs new file mode 100644 index 0000000..9247ea0 --- /dev/null +++ b/backend/views/partials/createChallenges.ejs @@ -0,0 +1,23 @@ +
+
+
+ +
+ <%- pageInfo.user.firstname==undefined ? creatorDetails.creator : + pageInfo.user.firstname + ' ' + pageInfo.user.lastname %> +
+
+
+
+ + +
+ + +
+ +
+
+
+
\ No newline at end of file diff --git a/backend/views/partials/createPolls.ejs b/backend/views/partials/createPolls.ejs new file mode 100644 index 0000000..8812e8f --- /dev/null +++ b/backend/views/partials/createPolls.ejs @@ -0,0 +1,23 @@ +
+
+
+ +
+ <%- pageInfo.user.firstname==undefined ? creatorDetails.creator : + pageInfo.user.firstname + ' ' + pageInfo.user.lastname %> +
+
+
+
+ +
+ + + + +
+ +
+
+
+
\ No newline at end of file diff --git a/backend/views/partials/createPost.ejs b/backend/views/partials/createPost.ejs new file mode 100644 index 0000000..622bb5b --- /dev/null +++ b/backend/views/partials/createPost.ejs @@ -0,0 +1,25 @@ +
+
+
+ +
+ <%- pageInfo.user.firstname==undefined ? creatorDetails.creator : pageInfo.user.firstname + + ' ' + pageInfo.user.lastname %> +
+
+
+ + +
+ + +
+ + +
+
+
\ No newline at end of file diff --git a/backend/views/partials/flashModal.ejs b/backend/views/partials/flashModal.ejs new file mode 100644 index 0000000..60dc853 --- /dev/null +++ b/backend/views/partials/flashModal.ejs @@ -0,0 +1,42 @@ + + + + \ No newline at end of file diff --git a/backend/views/partials/footer.ejs b/backend/views/partials/footer.ejs new file mode 100644 index 0000000..691287b --- /dev/null +++ b/backend/views/partials/footer.ejs @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/backend/views/partials/header.ejs b/backend/views/partials/header.ejs new file mode 100644 index 0000000..4b1674b --- /dev/null +++ b/backend/views/partials/header.ejs @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <%= pageTitle %> + \ No newline at end of file diff --git a/backend/views/partials/homePageAddButtons.ejs b/backend/views/partials/homePageAddButtons.ejs new file mode 100644 index 0000000..2b87927 --- /dev/null +++ b/backend/views/partials/homePageAddButtons.ejs @@ -0,0 +1,19 @@ +
+
+
+ +
+ <%- pageInfo.user.firstname==undefined ? creatorDetails.creator : + pageInfo.user.firstname + ' ' + pageInfo.user.lastname %> +
+
+
+ feeling bored ? try clicking on these! +
+ +
+
\ No newline at end of file diff --git a/backend/views/partials/nav.ejs b/backend/views/partials/nav.ejs new file mode 100644 index 0000000..90a186e --- /dev/null +++ b/backend/views/partials/nav.ejs @@ -0,0 +1,22 @@ + + + + +
+
+ + + +
+
\ No newline at end of file diff --git a/backend/views/partials/profilecard.ejs b/backend/views/partials/profilecard.ejs new file mode 100644 index 0000000..6f6c755 --- /dev/null +++ b/backend/views/partials/profilecard.ejs @@ -0,0 +1,55 @@ +
+
+
+

+ <%=user.firstname%> + <%=user.lastname%> +

+
+
+ +
+
+
+ + <% if(user._id !== activeUser._id ){ %> + + <% } %> +
+

+ <%=user.bio%> +

+

+ <%=user.username%> +

+
+
+
\ No newline at end of file diff --git a/backend/views/partials/timeline.ejs b/backend/views/partials/timeline.ejs new file mode 100644 index 0000000..92bcd44 --- /dev/null +++ b/backend/views/partials/timeline.ejs @@ -0,0 +1,187 @@ +
+ <% if (pageName === 'profile' && post.creator._id.toString() !== userId.toString()){ %> +
+
+ +
+ <%= creatorDetails.creator %> + + shared + +
+
+
+
+ +
+ <%- post.creator.firstname==undefined ? creatorDetails.creator : post.creator.firstname + ' ' + + post.creator.lastname %> + + <%= new Intl.RelativeTimeFormat('en',{style: 'long' }).format((((post.timestamp.valueOf()) - + Date.now()) / (1000 * 60 * 60 * 24)).toFixed(),'day') %> + +
+ <% if(pageName === "profile"){ %> +
+ + + +
+ <% } %> +
+ +
+ +

+ <%=post.content%> +

+ +
+
+ +
+ +
+ + <%= post.stats.downvoted_by.length %> +
+ + +
+
+
+ + <% } else if(pageName === 'viewProfile' && post.creator._id.toString() !== user._id.toString()){ %> +
+
+ +
+ <%= creatorDetails.creator %> + + shared + +
+
+
+
+ +
+ <%- post.creator.firstname==undefined ? creatorDetails.creator : post.creator.firstname + ' ' + + post.creator.lastname %> + + <%= new Intl.RelativeTimeFormat('en',{style: 'long' }).format((((post.timestamp.valueOf()) - + Date.now()) / (1000 * 60 * 60 * 24)).toFixed(),'day') %> + +
+ <% if(pageName === "profile"){ %> +
+ + + +
+ <% } %> +
+ +
+ +

+ <%=post.content%> +

+ +
+
+ +
+ +
+ + <%= post.stats.downvoted_by.length %> +
+ + +
+
+
+ + <% } else{ %> +
+
+ +
+ <%- post.creator.firstname==undefined ? creatorDetails.creator : post.creator.firstname + ' ' + + post.creator.lastname %> + + <%= new Intl.RelativeTimeFormat('en',{style: 'long' }).format((((post.timestamp.valueOf()) - + Date.now()) / (1000 * 60 * 60 * 24)).toFixed(),'day') %> + +
+ <% if(pageName === "profile"){ %> +
+ + + +
+ <% } %> +
+ +
+ +

+ <%=post.content%> +

+ +
+
+ +
+ +
+ + <%= post.stats.downvoted_by.length %> +
+ + +
+
+ + <% } %> + + + +
\ No newline at end of file diff --git a/backend/views/points.ejs b/backend/views/points.ejs new file mode 100644 index 0000000..f055f1e --- /dev/null +++ b/backend/views/points.ejs @@ -0,0 +1,167 @@ +<%- include ('partials/header',{pageTitle: pageInfo.title}) %> + <%- include ('partials/nav',{profilePic: pageInfo.profilePicLoggedIn, pageName: pageInfo.pagename }) %> + + + +
+
+
+ +
+
+
+
+
+ Work hard and earn it !! +
+
+
+
+
+
+
    +
  • +
    + Get 3 points for every post you create +
    +
  • +
  • +
    + + Get 5 points for every challenges and polls you create +
    +
  • +
  • +
    + Get 1 points for every upvote you get +
    +
  • +
  • +
    + + Get 2 points for every comment in your post +
    +
  • +
  • +
    + Get 2 points for every participation on your challenges +
    +
  • +
  • +
    + + Get 1 points for every vote on your polls +
    +
  • +
    + Get 2 points for every share of your posts +
    +
  • +
  • +
    + + Get 10 points when someone follows you +
    +
  • +
+
+
+ +
+
+
+
+ Lose points 'Knot' mind +
+
+
+
+
+
+
    +
  • +
    + Lose 3 points for every post you delete +
    +
  • +
  • +
    + + Lose 5 points for every challenges and polls you delete +
    +
  • +
  • +
    + Lose 1 points for every downvote you get +
    +
  • +
  • +
    + + Lose 2 points when a comment gets deleted from your post +
    +
  • +
  • +
    + Lose 10 points whenever someone unfollows you +
    +
  • + +
+
+
+ +
+
+
+
+ Just use it ! +
+
+
+
+
+
+
    +
  • +
    + Updating 'username' costs you 20 points +
    +
  • +
  • +
    + + Updating profile picture costs you 50 points +
    +
  • +
  • +
    + More usage coming soon, stay tuneeeeeeed... +
    +
  • +
+
+
+ +
+ +
+ +<%- include ('partials/footer') %> \ No newline at end of file diff --git a/backend/views/polls.ejs b/backend/views/polls.ejs new file mode 100644 index 0000000..cecc90e --- /dev/null +++ b/backend/views/polls.ejs @@ -0,0 +1,46 @@ +<%- include ('partials/header',{pageTitle: pageInfo.title}) %> + <%- include ('partials/nav',{profilePic: pageInfo.profilePic, pageName: pageInfo.pagename }) %> + +
+ + <% polls.map((poll,index)=>{ %> +
+
+
+ +
+ <%- poll.creatorId.firstname==undefined ? + poll.creatorId : poll.creatorId.firstname + ' ' + poll.creatorId.lastname %> + + <%= new Intl.RelativeTimeFormat('en',{style: 'long' + }).format((((poll.timestamp.valueOf()) - Date.now()) / (1000 * 60 * 60 * + 24)).toFixed(),'day') %> + +
+
+

+ <%=poll.content%> +

+
+ <% poll.options.map(option=>{%> +
+
+

+ <%=option.optionsName%> +

+ + <%=option.voted_by.length%> + +
+ <%})%> + +
+
+ +
+ + <% }) %> +
+ +<%- include ('partials/footer') %> \ No newline at end of file diff --git a/backend/views/post.ejs b/backend/views/post.ejs new file mode 100644 index 0000000..7a7b563 --- /dev/null +++ b/backend/views/post.ejs @@ -0,0 +1,98 @@ +<%- include ('partials/header',{pageTitle: pageInfo.title}) %> +<%- include ('partials/nav',{profilePic: pageInfo.profilePic, pageName: pageInfo.pagename }) %> + +
+
+ + +
+
+ +
+ <%- post.creator.firstname==undefined ? creatorDetails.creator : post.creator.firstname + ' ' + + post.creator.lastname %> + + <%= new Intl.RelativeTimeFormat('en',{style: 'long' }).format((((post.timestamp.valueOf()) - + Date.now()) / (1000 * 60 * 60 * 24)).toFixed(),'day') %> + +
+
+ +
+ +

+ <%=post.content%> +

+ +
+
+ +
+ +
+ + <%= post.stats.downvoted_by.length %> +
+
+ + <%= post.stats.comments.length %> +
+ +
+
+
+
+
+
+
+
+
+ +
+ + +
+
+
+
+

Comments

+
+ <% comments.map((comment) =>{ %> +
+
+ +
+ <%= comment.commentor.firstname+' '+ comment.commentor.lastname %> + + <%= new Intl.RelativeTimeFormat('en',{style: 'long' }).format((((comment.timestamp.valueOf()) - + Date.now()) / (1000 * 60 * 60 * 24)).toFixed(),'day') %> + +
+ <% if(comment.commentor._id.toString() === pageInfo.userId.toString() || post.creator._id.toString() === pageInfo.userId.toString()){ %> +
+ +
+ <% } %> +
+
+

<%= comment.content %>

+
+
+ <% }) %> + +
+ +
+ +<% if(messages.error){ %> + + <%- include ('partials/flashModal',{messages: messages}) %> +<% } %> +<%- include ('partials/footer') %> \ No newline at end of file diff --git a/backend/views/profile.ejs b/backend/views/profile.ejs new file mode 100644 index 0000000..f7e982b --- /dev/null +++ b/backend/views/profile.ejs @@ -0,0 +1,28 @@ +<%- include ('partials/header',{pageTitle: pageTitle}) %> + <%- include ('partials/nav',{profilePic: profilePicLoggedIn, pageName: "" }) %> + <%- include ('partials/profilecard',{user: user, activeUser: activeUser }) %> +
+ + +
+
+ <% posts.map(post=>{ %> + <%- include ('partials/timeline',{post: post,user:user, userId: activeUser._id, creatorDetails: + creatorDetails, pageName: pageName}) %> + + <% }) %> +
+ + <% if (messages.error) { %> + <%- include ('partials/flashModal.ejs',{messages: messages}) %> + <% }%> + + <%- include ('partials/footer') %> \ No newline at end of file diff --git a/backend/views/profileActivity.ejs b/backend/views/profileActivity.ejs new file mode 100644 index 0000000..efa35c8 --- /dev/null +++ b/backend/views/profileActivity.ejs @@ -0,0 +1,146 @@ +<%- include ('partials/header',{pageTitle: pageTitle}) %> + <%- include ('partials/nav',{profilePic: profilePicLoggedIn, pageName: "" }) %> + <%- include ('partials/profilecard',{user: user, activeUser: activeUser }) %> + +
+ +
+
+ + <% activities.map((activity,index)=>{ %> + <% if (!activity.duration) { %> +
+
+
+ +
+ <%- creatorDetails.creator %> + + <%= new Intl.RelativeTimeFormat('en',{style: 'long' + }).format((((activity.timestamp.valueOf()) - Date.now()) / (1000 * 60 * + 60 * 24)).toFixed(),'day') %> + +
+ <% if(pageName==="profile-activities" ){ %> +
+ + + +
+ <% } %> + +
+

+ <%=activity.content%> + +

+
+ <% activity.options.map(option=>{%> +
+
+

+ <%=option.optionsName%> +

+ + <%=option.voted_by.length%> + +
+ <%})%> + +
+
+
+ <% } else{ %> + +
+
+
+ +
+ <%- activity.creatorId.firstname ? activity.creatorId.firstname+" "+activity.creatorId.lastname : creatorDetails.creator %> + + <%= new Intl.RelativeTimeFormat('en',{style: 'long' + }).format((((activity.timestamp.valueOf()) - Date.now()) / (1000 * 60 * + 60 * 24)).toFixed(),'day') %> + +
+ <% if(activeUser._id.toString() == activity.creatorId){ %> +
+ + + +
+ <% } %> +
+
+ + <%=activity.content%> + <% const remainingTime=new Date(activity.duration) - new Date(); + %> + <% if (remainingTime> 0) { %> + <% const remainingDays=Math.ceil(remainingTime / (1000 * + 60 * 60 * 24)); %> + <% if (remainingDays> 1) { %> +

+ <%= remainingDays %> days remaining +

+ <% } else { %> +

1 day remaining +

+ <% } %> + <% } else { %> +

+ Challenge has + ended

+ <% } %> +
+
+
+

+ + <%=activity.description%> + +

+
+
+ + <% if (activity.participators.includes(activeUser._id)) { %> + Participated + <% } else if(activity.creatorId._id==activeUser._id) { %> +
+ <% } else { %> + Participate + <% } %> +
+ +
+ +
+ + + + + <% } %> + <% }) %> +
+ + + <%- include('partials/footer') %> \ No newline at end of file diff --git a/backend/views/signup.ejs b/backend/views/signup.ejs new file mode 100644 index 0000000..c6a6a07 --- /dev/null +++ b/backend/views/signup.ejs @@ -0,0 +1,65 @@ +<%- include ('partials/header', {pageTitle: pageTitle}) %> + + + + + +
+
+
+
+
+
+
+ +
+ +
Sign up to Knot
+
+ +
+ +
+
+ + + + +
+
+ + <% if (messages.error) { %> + <%- include('partials/flashModal', {messages: messages}) %> + <% } %> + + + + \ No newline at end of file diff --git a/frontend/public/css/404.css b/frontend/public/css/404.css new file mode 100644 index 0000000..55b7e35 --- /dev/null +++ b/frontend/public/css/404.css @@ -0,0 +1,46 @@ +@import url('global.css'); + +.page_404 { + font-size: 1.2rem; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + background: #fff; + font-family: var(--regular); + text-align: center; + gap: 20rem; +} + +h1 { + font-size: 5rem; + +} + +.page_404 img { + width: 100%; +} + +.main_image { + background-image: url(/images/404.gif); + background-position: center; + background-repeat: no-repeat; + height: 100vh; + width: 100%; + +} + +.link_404 { + color: #fff !important; + padding: 10px 20px; + background: #39ac31; + margin: 20px 0; + display: inline-block; + text-decoration: none; +} + +@media screen and (max-width: 768px) { + .page_404 { + font-size: 1rem; + } +} \ No newline at end of file diff --git a/frontend/public/css/addPost.css b/frontend/public/css/addPost.css new file mode 100644 index 0000000..f49754c --- /dev/null +++ b/frontend/public/css/addPost.css @@ -0,0 +1,74 @@ +.submit-post, +.submit-comment { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + gap: 0.5rem; + border-radius: 10px; + width: 100%; + max-width: 100%; +} +.submit-post input, +.submit-post textarea, +.submit-comment textarea { + width: 100%; + max-width: 100%; + padding: 0.5rem; + border-radius: 10px; + border: none; + outline: none; + font-family: var(--regular); + background-color: var(--body-color); + color: var(--secondary-color); +} +.submit-post textarea{ + height: 4rem; +} +#content { + font-size: 1rem; + resize: none; +} +.post-submit-btn, +#comment-btn { + font-size: large; + width: 30%; + margin-bottom: 10px; + padding: 0.5rem; + border-radius: 10px; + border: none; + outline: none; + font-family: var(--regular); + background-color: var(--secondary-color); + color: var(--body-color); + cursor: pointer; + transition: all 0.5s ease; +} +#comment-btn { + width:15%; + display: flex; + align-items: center; + justify-content: center; + text-align: center; + margin-left: auto; + margin-bottom: 0; +} +.comment-section{ + display: flex; + justify-content: center; + align-items: center; + flex-direction: row; +} +.post-submit-btn{ + width: 100%; +} +.post-submit-btn:disabled{ + cursor: not-allowed; +} +.post-submit-btn:hover, +.comment-btn:hover { + /* some cool hover effect */ + background-color: var(--primary-color); + color: var(--body-color); + transform: rotateZ(2deg); +} diff --git a/frontend/public/css/challenge.css b/frontend/public/css/challenge.css new file mode 100644 index 0000000..6638fe5 --- /dev/null +++ b/frontend/public/css/challenge.css @@ -0,0 +1,151 @@ +.challenges-section { + padding-bottom: 5rem; +} + +.challenge-container { + width: 100%; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + gap: 1rem; +} +.label-input label { + color: var(--dark-color); + width: 70%; +} + +.challenge-title { + width: 100%; + font-size: 1.3rem; + flex-direction: row; + display: flex; + align-items: center; + gap: 0.5rem; +} +.small-duration { + font-size: 0.7rem; + color: var(--dark-color); + background-color: var(--body-color); + padding: 0.3rem; + border-radius: 8px; +} +.duration-ended { + background-color: rgba(185, 43, 43, 0.596); + color: var(--primary-color); +} + +.challenge-interaction { + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; + flex-direction: row; + max-width: 100%; + overflow: hidden; +} +.participate-btn, +.current-participation { + display: flex; + justify-content: center; + align-items: center; + gap: 0.5rem; + background-color: var(--body-color); + color: var(--secondary-color); + padding: 0.5rem 1rem; + border-radius: 10px; + cursor: pointer; +} +.participate-btn { + background-color: var(--primary-color); + color: var(--body-color); +} + +.participate-btn:hover { + background-color: var(--body-color); + color: var(--secondary-color); +} +.participated{ + background-color: var(--dark-color); + cursor: not-allowed; + pointer-events: none; +} + + +.ended{ + background-color: rgba(185, 43, 43, 0.596); + color: var(--primary-color); + cursor: not-allowed; + pointer-events: none; +} +.participants-list, .participation-feedback { + width: 100%; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + gap: 1rem; +} +.participants-list-content { + width: 75%; + box-sizing: border-box; + display: flex; + justify-content: flex-start; + align-items: center; + flex-direction: column; + gap: 1rem; + overflow: auto; + max-height: 20rem; + scrollbar-width: 5px; +} +.participant { + width: 100%; + display: flex; + justify-content: flex-start; + align-items: center; + flex-direction: row; + gap: 1rem; + padding: 0.5rem; + border-radius: 10px; + background-color: var(--body-color); +} +.participant-image { + width: 2rem; + height: 2rem; + border-radius: 50%; + object-fit: cover; +} + + + +.feedback-text{ + width: 100%; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + gap: 1rem; + padding: 0.5rem; + background-color: rgba(77, 240, 158, 0.445); + border-radius: 10px; +} +.participate-error{ + background-color: var(--body-color) ; +} + + +@media screen and (min-width: 769px) and (max-width: 1400px) { + .participate-btn, + .current-participation { + padding: 0.5rem 1rem; + gap: 0.5rem; + } +} + +@media screen and (max-width: 768px) { + .participate-btn, + .current-participation { + padding: 0.25rem 0.5rem; + gap: 0.25rem; + } +} diff --git a/frontend/public/css/follow.css b/frontend/public/css/follow.css new file mode 100644 index 0000000..a483972 --- /dev/null +++ b/frontend/public/css/follow.css @@ -0,0 +1,132 @@ +@import 'global.css'; + +.follow-options{ + display: flex; + justify-content: space-around; + align-items: center; + height: 50px; + margin: 10px 0; + width: 35%; + background: var(--body-color); + color: var(--secondary-color); + font-family: var(--medium); + border-radius: 10px; + gap: 0.5rem; +} + +.follower, .following, .search-user-btn{ + display: flex; + justify-content: center; + align-items: center; + width: 50%; + height: 100%; + cursor: pointer; + background-color: var(--secondary-body-color); + border-radius: 10px; +} +.follower a, .following a{ + display: flex; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; + cursor: pointer; +} + +.follower:hover, .follower a:hover, .following:hover, .following a:hover, .search-user-btn:hover, .active-option{ + background: var(--primary-color); + color: var(--secondary-body-color); + border-radius: 10px; +} + +.active-option a{ + color: var(--secondary-body-color); +} +a.unfollow-btn{ + width: 20%; + overflow: hidden; + text-align: center; + text-overflow: ellipsis; + min-width: auto; + margin-left: auto; + background-color: var(--secondary-body-color); + padding: 5px; + border-radius: 10px; +} +.search-user-btn a { + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; +} +.search-user-btn a:hover { + background: var(--primary-color); + color: var(--secondary-body-color); + border-radius: 10px; +} + +.search-user-btn{ + width: 20%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; +} + +.search-form{ + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + gap: 0.5rem; +} +.search-form-btn{ + border: none; + outline: none; + width: 10%; + display: flex; + justify-content: center; + align-items: center; + background: var(--secondary-body-color); + padding: 5.6px; + color: var(--primary-color); + cursor: pointer; + border-radius: 0px 8px 8px 0px; + +} +.search-form-btn:hover{ + background: var(--primary-color); + color: var(--secondary-body-color); + border-radius: 0px 8px 8px 0px; +} + +.search-bar-input{ + width: 100%; + height: 100%; + border: none; + outline: none; + background: var(--secondary-body-color); + border-radius: 8px 0px 0px 8px; + padding: 10px; + color: var(--primary-color); +} +.search-result-user{ + margin-top: 0.5rem; +} +.search-error{ + background-color: rgba(255, 221, 31, 0.377); +} + +@media screen and (max-width: 1400px) and (min-width: 768px){ + .follow-options{ + width: 60%; + } +} + +@media screen and (max-width: 768px){ + .follow-options{ + width: 100%; + } +} diff --git a/frontend/public/css/global.css b/frontend/public/css/global.css new file mode 100644 index 0000000..267dbf8 --- /dev/null +++ b/frontend/public/css/global.css @@ -0,0 +1,78 @@ +@charset 'utf-8'; +@font-face { + font-family: 'Mukta-Bold'; + src: url('../fonts/Mukta-Bold.woff2') format('woff2'); +} +@font-face { + font-family: 'Mukta-ExtraBold'; + src: url('../fonts/Mukta-ExtraBold.woff2') format('woff2'); +} +@font-face { + font-family: 'Mukta-SemiBold'; + src: url('../fonts/Mukta-SemiBold.woff2') format("woff2"); +} +@font-face { + font-family: 'Mukta-Regular'; + src: url('../fonts/Mukta-Regular.woff2') format("woff2"); +} +@font-face { + font-family: 'Mukta-Light'; + src: url('../fonts/Mukta-Light.woff2') format("woff2"); +} +@font-face { + font-family: 'Mukta-extraLight'; + src: url('../fonts/Mukta-extraLight.woff2') format("woff2"); +} +@font-face { + font-family: 'Mukta-Medium'; + src: url('../fonts/Mukta-Medium.woff2') format("woff2"); + font-display: swap; +} + +:root{ + /* Fonts */ + --light: 'Mukta-Light'; + --regular: 'Mukta-Regular'; + --medium: 'Mukta-Medium'; + --semi-bold: 'Mukta-SemiBold'; + --bold: 'Mukta-Bold'; + --extra-bold: 'Mukta-ExtraBold'; + --extra-light: 'Mukta-extraLight'; +/* Colors */ + --body-color: #16213E; + --secondary-body-color: #1D2D44; + --primary-color: #BCEAD5; + --secondary-color: #DEF5E5; + --light-color: #9ED5C5; + --dark-color: #8EC3B0; +} + +*, *::before, *::after { + box-sizing: border-box; + margin: 0; + padding: 0; +} +body{ + background-color: var(--body-color); + scrollbar-width: thin; + scrollbar-color: var(--dark-color) var(--body-color); +} +img{ + object-fit: cover; + max-width: 100%; + width: 100%; +} +::-webkit-scrollbar { width: 1rem; } +::-webkit-scrollbar-thumb { + background-color: var(--dark-color); + border-radius: 1rem; + border: .3rem solid var(--body-color); + +} +::-webkit-scrollbar-thumb:hover { + background-color: var(--primary-color); + } +::-webkit-scrollbar-track { + background-color: var(--body-color); +} + diff --git a/frontend/public/css/header.css b/frontend/public/css/header.css new file mode 100644 index 0000000..e6c2779 --- /dev/null +++ b/frontend/public/css/header.css @@ -0,0 +1,119 @@ +@import 'global.css'; + +li{ + list-style: none; +} +a{ + text-decoration: none; +} + +.header{ + display: flex; + justify-content: center; + align-items: center; + position: fixed; + top: 0; + background-color: var(--body-color); + width: 100%; + height: 9%; + padding: 0.5rem; + z-index: 200; + isolation: isolate; +} +.container{ + position: relative; + display: flex; + justify-content: space-around; + align-items: center; + width: 100%; +} +.nav-items{ + display: flex; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; + gap: 7.5rem; +} +.nav-item{ + color: var(--dark-color); + transition: all 0.4s ease-in-out; +} +.nav-item-effect{ + display: flex; + justify-content: center; + align-items: center; + height: 50px; + width: 50px; + border-radius: 20%; + transition: all 0.4s ease-in-out; + transform:translateX(0,0); + cursor: pointer; + +} +.knot-logo{ + max-width: 64px; + max-height: 64px; + padding: 5px; +} +.nav-icons{ + font-size: 2rem !important; +} +/* Effects */ +.nav-item-effect:hover{ + background-color: var(--secondary-body-color); + transform:translateX(10%) rotateZ(4deg); +} +.nav-item-effect:hover .nav-item{ + color: var(--secondary-color); +} +.active{ + background-color: var(--secondary-body-color); + transform:translateX(10%) rotateZ(4deg); +} +.active .nav-item{ + color: var(--secondary-color); +} + +.profile-logo{ + max-width: 48px; + max-height: 48px; + min-width: 48px; + min-height: 48px; + border-radius: 50%; +} + + + + + + +/* Media queries */ +@media screen and (max-width: 768px){ + .header{ + position: fixed; + bottom: 0; + top: auto; + height: 10%; + } + .knot-logo{ + display: none; + } + .container{ + display: flex; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; + } + .nav-items{ + display: flex; + justify-content: center; + align-items: center; + height: 100%; + gap: 2.5rem; + } + .profile-logo{ + display: none; + } +} diff --git a/frontend/public/css/login.css b/frontend/public/css/login.css new file mode 100644 index 0000000..88f3e00 --- /dev/null +++ b/frontend/public/css/login.css @@ -0,0 +1,743 @@ +@import 'global.css'; + +body{ + font-family: var(--regular); +} +a{ + text-decoration: none; +} +.logo{ + display: flex; + margin-left: auto; + margin-right: auto; + height: 80px; + width: 80px; + +} +.star{ + position: absolute; + z-index: 100; + opacity: 0.7; +} +.wrapper-stars{ + position: absolute; + width: 100%; + height: 100%; + overflow: hidden; +} +.box{ + background-image: linear-gradient(180deg, var(--body-color) 0%, #8fd3f4 100%); + position: fixed; + display: flex; + width: 100%; + justify-content: center; + align-items: center; + min-height: 100vh; + background-repeat: no-repeat; +} +.container{ + width: 350px; + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + + +} +span{ + color: #fff; + font-size: small; + display: flex; + justify-content: center; + padding: 10px 0 10px 0; +} +header{ + color: #fff; + font-size: 30px; + display: flex; + justify-content: center; + padding: 10px 0 10px 0; +} + +.input-field .input{ + height: 45px; + width: 100%; + border: none; + border-radius: 30px; + color: var(--secondary-color); + font-size: 15px; + padding: 0 0 0 45px; + padding-right: 75px; + background: rgba(255,255,255, 0.1); + outline: none; + margin: 10px 0 10px 10px; +} +.input::placeholder{ + color: var(--secondary-color); + +} +.input-field{ + display: flex; + align-items: center; + justify-content: center; + position: relative; +} + +::-webkit-input-placeholder{ + color: rgb(105,105,105); +} +.input-field .signin, .signup{ + margin: 10px 0 10px; + border: none; + border-radius: 30px; + font-size: 15px; + height: 45px; + outline: none; + width: 100%; + color: black; + background: rgba(255,255,255,0.7); + cursor: pointer; + transition: .3s; +} +.signup{ + margin-left: 10px; +} +.hovereffect:hover{ + box-shadow: 1px 5px 7px 1px rgba(0, 0, 0, 0.3); +} + +.withcredentials{ + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + gap: 4rem; + color: #fff; + width: 100%; + font-size: 14px; + margin-top: 10px; +} +.insignin{ + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 0.8rem; + color: #fff; + font-size: 14px; + margin-top: 10px; + +} + +label a{ + text-decoration: none; + color: #fff; +} +.userpass_logo{ + height: 20px; + width: 20px; +} +.alternates{ + margin-top: 1rem; + display: flex; + + align-items: center; + justify-content: center; +} +#google{ + display: flex; + gap: 1rem; + align-items: center; + justify-content: center; + margin: 10px 0px; + padding: 8px 75px; + width: 100%; + font-size: medium; + background-color: rgb(255, 255, 255,0.7); + color: black; + transition: all 0.3s ; + border:none; + border-radius: 5rem; + cursor: pointer; +} +#google-logo{ + max-width: 32px; + width: 32px; +} + +.hidden{ + display: none; +} + +.credentials{ + font-size: 16px; +} +#eyeicon{ + position: absolute; + right: 1.5rem; + cursor: pointer; +} + +#stars { + width: 1px; + height: 1px; + background: transparent; + animation: animStar 50s linear infinite; + box-shadow: 779px 1331px #fff, 324px 42px #fff, 303px 586px #fff, + 1312px 276px #fff, 451px 625px #fff, 521px 1931px #fff, 1087px 1871px #fff, + 36px 1546px #fff, 132px 934px #fff, 1698px 901px #fff, 1418px 664px #fff, + 1448px 1157px #fff, 1084px 232px #fff, 347px 1776px #fff, 1722px 243px #fff, + 1629px 835px #fff, 479px 969px #fff, 1231px 960px #fff, 586px 384px #fff, + 164px 527px #fff, 8px 646px #fff, 1150px 1126px #fff, 665px 1357px #fff, + 1556px 1982px #fff, 1260px 1961px #fff, 1675px 1741px #fff, + 1843px 1514px #fff, 718px 1628px #fff, 242px 1343px #fff, 1497px 1880px #fff, + 1364px 230px #fff, 1739px 1302px #fff, 636px 959px #fff, 304px 686px #fff, + 614px 751px #fff, 1935px 816px #fff, 1428px 60px #fff, 355px 335px #fff, + 1594px 158px #fff, 90px 60px #fff, 1553px 162px #fff, 1239px 1825px #fff, + 1945px 587px #fff, 749px 1785px #fff, 1987px 1172px #fff, 1301px 1237px #fff, + 1039px 342px #fff, 1585px 1481px #fff, 995px 1048px #fff, 524px 932px #fff, + 214px 413px #fff, 1701px 1300px #fff, 1037px 1613px #fff, 1871px 996px #fff, + 1360px 1635px #fff, 1110px 1313px #fff, 412px 1783px #fff, 1949px 177px #fff, + 903px 1854px #fff, 700px 1936px #fff, 378px 125px #fff, 308px 834px #fff, + 1118px 962px #fff, 1350px 1929px #fff, 781px 1811px #fff, 561px 137px #fff, + 757px 1148px #fff, 1670px 1979px #fff, 343px 739px #fff, 945px 795px #fff, + 576px 1903px #fff, 1078px 1436px #fff, 1583px 450px #fff, 1366px 474px #fff, + 297px 1873px #fff, 192px 162px #fff, 1624px 1633px #fff, 59px 453px #fff, + 82px 1872px #fff, 1933px 498px #fff, 1966px 1974px #fff, 1975px 1688px #fff, + 779px 314px #fff, 1858px 1543px #fff, 73px 1507px #fff, 1693px 975px #fff, + 1683px 108px #fff, 1768px 1654px #fff, 654px 14px #fff, 494px 171px #fff, + 1689px 1895px #fff, 1660px 263px #fff, 1031px 903px #fff, 1203px 1393px #fff, + 1333px 1421px #fff, 1113px 41px #fff, 1206px 1645px #fff, 1325px 1635px #fff, + 142px 388px #fff, 572px 215px #fff, 1535px 296px #fff, 1419px 407px #fff, + 1379px 1003px #fff, 329px 469px #fff, 1791px 1652px #fff, 935px 1802px #fff, + 1330px 1820px #fff, 421px 1933px #fff, 828px 365px #fff, 275px 316px #fff, + 707px 960px #fff, 1605px 1554px #fff, 625px 58px #fff, 717px 1697px #fff, + 1669px 246px #fff, 1925px 322px #fff, 1154px 1803px #fff, 1929px 295px #fff, + 1248px 240px #fff, 1045px 1755px #fff, 166px 942px #fff, 1888px 1773px #fff, + 678px 1963px #fff, 1370px 569px #fff, 1974px 1400px #fff, 1786px 460px #fff, + 51px 307px #fff, 784px 1400px #fff, 730px 1258px #fff, 1712px 393px #fff, + 416px 170px #fff, 1797px 1932px #fff, 572px 219px #fff, 1557px 1856px #fff, + 218px 8px #fff, 348px 1334px #fff, 469px 413px #fff, 385px 1738px #fff, + 1357px 1818px #fff, 240px 942px #fff, 248px 1847px #fff, 1535px 806px #fff, + 236px 1514px #fff, 1429px 1556px #fff, 73px 1633px #fff, 1398px 1121px #fff, + 671px 1301px #fff, 1404px 1663px #fff, 740px 1018px #fff, 1600px 377px #fff, + 785px 514px #fff, 112px 1084px #fff, 1915px 1887px #fff, 1463px 1848px #fff, + 687px 1115px #fff, 1268px 1768px #fff, 1729px 1425px #fff, + 1284px 1022px #fff, 801px 974px #fff, 1975px 1317px #fff, 1354px 834px #fff, + 1446px 1484px #fff, 1283px 1786px #fff, 11px 523px #fff, 1842px 236px #fff, + 1355px 654px #fff, 429px 7px #fff, 1033px 1128px #fff, 157px 297px #fff, + 545px 635px #fff, 52px 1080px #fff, 827px 1520px #fff, 1121px 490px #fff, + 9px 309px #fff, 1744px 1586px #fff, 1014px 417px #fff, 1534px 524px #fff, + 958px 552px #fff, 1403px 1496px #fff, 387px 703px #fff, 1522px 548px #fff, + 1355px 282px #fff, 1532px 601px #fff, 1838px 790px #fff, 290px 259px #fff, + 295px 598px #fff, 1601px 539px #fff, 1561px 1272px #fff, 34px 1922px #fff, + 1024px 543px #fff, 467px 369px #fff, 722px 333px #fff, 1976px 1255px #fff, + 766px 983px #fff, 1582px 1285px #fff, 12px 512px #fff, 617px 1410px #fff, + 682px 577px #fff, 1334px 1438px #fff, 439px 327px #fff, 1617px 1661px #fff, + 673px 129px #fff, 794px 941px #fff, 1386px 1902px #fff, 37px 1353px #fff, + 1467px 1353px #fff, 416px 18px #fff, 187px 344px #fff, 200px 1898px #fff, + 1491px 1619px #fff, 811px 347px #fff, 924px 1827px #fff, 945px 217px #fff, + 1735px 1228px #fff, 379px 1890px #fff, 79px 761px #fff, 825px 1837px #fff, + 1980px 1558px #fff, 1308px 1573px #fff, 1488px 1726px #fff, + 382px 1208px #fff, 522px 595px #fff, 1277px 1898px #fff, 354px 552px #fff, + 161px 1784px #fff, 614px 251px #fff, 526px 1576px #fff, 17px 212px #fff, + 179px 996px #fff, 467px 1208px #fff, 1944px 1838px #fff, 1140px 1093px #fff, + 858px 1007px #fff, 200px 1064px #fff, 423px 1964px #fff, 1945px 439px #fff, + 1377px 689px #fff, 1120px 1437px #fff, 1876px 668px #fff, 907px 1324px #fff, + 343px 1976px #fff, 1816px 1501px #fff, 1849px 177px #fff, 647px 91px #fff, + 1984px 1012px #fff, 1336px 1300px #fff, 128px 648px #fff, 305px 1060px #fff, + 1324px 826px #fff, 1263px 1314px #fff, 1801px 629px #fff, 1614px 1555px #fff, + 1634px 90px #fff, 1603px 452px #fff, 891px 1984px #fff, 1556px 1906px #fff, + 121px 68px #fff, 1676px 1714px #fff, 516px 936px #fff, 1947px 1492px #fff, + 1455px 1519px #fff, 45px 602px #fff, 205px 1039px #fff, 793px 172px #fff, + 1562px 1739px #fff, 1056px 110px #fff, 1512px 379px #fff, 1795px 1621px #fff, + 1848px 607px #fff, 262px 1719px #fff, 477px 991px #fff, 483px 883px #fff, + 1239px 1197px #fff, 1496px 647px #fff, 1649px 25px #fff, 1491px 1946px #fff, + 119px 996px #fff, 179px 1472px #fff, 1341px 808px #fff, 1565px 1700px #fff, + 407px 1544px #fff, 1754px 357px #fff, 1288px 981px #fff, 902px 1997px #fff, + 1755px 1668px #fff, 186px 877px #fff, 1202px 1882px #fff, 461px 1213px #fff, + 1400px 748px #fff, 1969px 1899px #fff, 809px 522px #fff, 514px 1219px #fff, + 374px 275px #fff, 938px 1973px #fff, 357px 552px #fff, 144px 1722px #fff, + 1572px 912px #fff, 402px 1858px #fff, 1544px 1195px #fff, 667px 1257px #fff, + 727px 1496px #fff, 993px 232px #fff, 1772px 313px #fff, 1040px 1590px #fff, + 1204px 1973px #fff, 1268px 79px #fff, 1555px 1048px #fff, 986px 1707px #fff, + 978px 1710px #fff, 713px 360px #fff, 407px 863px #fff, 461px 736px #fff, + 284px 1608px #fff, 103px 430px #fff, 1283px 1319px #fff, 977px 1186px #fff, + 1966px 1516px #fff, 1287px 1129px #fff, 70px 1098px #fff, 1189px 889px #fff, + 1126px 1734px #fff, 309px 1292px #fff, 879px 764px #fff, 65px 473px #fff, + 1003px 1959px #fff, 658px 791px #fff, 402px 1576px #fff, 35px 622px #fff, + 529px 1589px #fff, 164px 666px #fff, 1876px 1290px #fff, 1541px 526px #fff, + 270px 1297px #fff, 440px 865px #fff, 1500px 802px #fff, 182px 1754px #fff, + 1264px 892px #fff, 272px 1249px #fff, 1289px 1535px #fff, 190px 1646px #fff, + 955px 242px #fff, 1456px 1597px #fff, 1727px 1983px #fff, 635px 801px #fff, + 226px 455px #fff, 1396px 1710px #fff, 849px 1863px #fff, 237px 1264px #fff, + 839px 140px #fff, 1122px 735px #fff, 1280px 15px #fff, 1318px 242px #fff, + 1819px 1148px #fff, 333px 1392px #fff, 1949px 553px #fff, 1878px 1332px #fff, + 467px 548px #fff, 1812px 1082px #fff, 1067px 193px #fff, 243px 156px #fff, + 483px 1616px #fff, 1714px 933px #fff, 759px 1800px #fff, 1822px 995px #fff, + 1877px 572px #fff, 581px 1084px #fff, 107px 732px #fff, 642px 1837px #fff, + 166px 1493px #fff, 1555px 198px #fff, 819px 307px #fff, 947px 345px #fff, + 827px 224px #fff, 927px 1394px #fff, 540px 467px #fff, 1093px 405px #fff, + 1140px 927px #fff, 130px 529px #fff, 33px 1980px #fff, 1147px 1663px #fff, + 1616px 1436px #fff, 528px 710px #fff, 798px 1100px #fff, 505px 1480px #fff, + 899px 641px #fff, 1909px 1949px #fff, 1311px 964px #fff, 979px 1301px #fff, + 1393px 969px #fff, 1793px 1886px #fff, 292px 357px #fff, 1196px 1718px #fff, + 1290px 1994px #fff, 537px 1973px #fff, 1181px 1674px #fff, + 1740px 1566px #fff, 1307px 265px #fff, 922px 522px #fff, 1892px 472px #fff, + 384px 1746px #fff, 392px 1098px #fff, 647px 548px #fff, 390px 1498px #fff, + 1246px 138px #fff, 730px 876px #fff, 192px 1472px #fff, 1790px 1789px #fff, + 928px 311px #fff, 1253px 1647px #fff, 747px 1921px #fff, 1561px 1025px #fff, + 1533px 1292px #fff, 1985px 195px #fff, 728px 729px #fff, 1712px 1936px #fff, + 512px 1717px #fff, 1528px 483px #fff, 313px 1642px #fff, 281px 1849px #fff, + 1212px 799px #fff, 435px 1191px #fff, 1422px 611px #fff, 1718px 1964px #fff, + 411px 944px #fff, 210px 636px #fff, 1502px 1295px #fff, 1434px 349px #fff, + 769px 60px #fff, 747px 1053px #fff, 789px 504px #fff, 1436px 1264px #fff, + 1893px 1225px #fff, 1394px 1788px #fff, 1108px 1317px #fff, + 1673px 1395px #fff, 854px 1010px #fff, 1705px 80px #fff, 1858px 148px #fff, + 1729px 344px #fff, 1388px 664px #fff, 895px 406px #fff, 1479px 157px #fff, + 1441px 1157px #fff, 552px 1900px #fff, 516px 364px #fff, 1647px 189px #fff, + 1427px 1071px #fff, 785px 729px #fff, 1080px 1710px #fff, 504px 204px #fff, + 1177px 1622px #fff, 657px 34px #fff, 1296px 1099px #fff, 248px 180px #fff, + 1212px 1568px #fff, 667px 1562px #fff, 695px 841px #fff, 1608px 1247px #fff, + 751px 882px #fff, 87px 167px #fff, 607px 1368px #fff, 1363px 1203px #fff, + 1836px 317px #fff, 1668px 1703px #fff, 830px 1154px #fff, 1721px 1398px #fff, + 1601px 1280px #fff, 976px 874px #fff, 1743px 254px #fff, 1020px 1815px #fff, + 1670px 1766px #fff, 1890px 735px #fff, 1379px 136px #fff, 1864px 695px #fff, + 206px 965px #fff, 1404px 1932px #fff, 1923px 1360px #fff, 247px 682px #fff, + 519px 1708px #fff, 645px 750px #fff, 1164px 1204px #fff, 834px 323px #fff, + 172px 1350px #fff, 213px 972px #fff, 1837px 190px #fff, 285px 1806px #fff, + 1047px 1299px #fff, 1548px 825px #fff, 1730px 324px #fff, 1346px 1909px #fff, + 772px 270px #fff, 345px 1190px #fff, 478px 1433px #fff, 1479px 25px #fff, + 1994px 1830px #fff, 1744px 732px #fff, 20px 1635px #fff, 690px 1795px #fff, + 1594px 569px #fff, 579px 245px #fff, 1398px 733px #fff, 408px 1352px #fff, + 1774px 120px #fff, 1152px 1370px #fff, 1698px 1810px #fff, 710px 1450px #fff, + 665px 286px #fff, 493px 1720px #fff, 786px 5px #fff, 637px 1140px #fff, + 764px 324px #fff, 927px 310px #fff, 938px 1424px #fff, 1884px 744px #fff, + 913px 462px #fff, 1831px 1936px #fff, 1527px 249px #fff, 36px 1381px #fff, + 1597px 581px #fff, 1530px 355px #fff, 949px 459px #fff, 799px 828px #fff, + 242px 1471px #fff, 654px 797px #fff, 796px 594px #fff, 1365px 678px #fff, + 752px 23px #fff, 1630px 541px #fff, 982px 72px #fff, 1733px 1831px #fff, + 21px 412px #fff, 775px 998px #fff, 335px 1945px #fff, 264px 583px #fff, + 158px 1311px #fff, 528px 164px #fff, 1978px 574px #fff, 717px 1203px #fff, + 734px 1591px #fff, 1555px 820px #fff, 16px 1943px #fff, 1625px 1177px #fff, + 1236px 690px #fff, 1585px 1590px #fff, 1737px 1728px #fff, 721px 698px #fff, + 1804px 1186px #fff, 166px 980px #fff, 1850px 230px #fff, 330px 1712px #fff, + 95px 797px #fff, 1948px 1078px #fff, 469px 939px #fff, 1269px 1899px #fff, + 955px 1220px #fff, 1137px 1075px #fff, 312px 1293px #fff, 986px 1762px #fff, + 1103px 1238px #fff, 428px 1993px #fff, 355px 570px #fff, 977px 1836px #fff, + 1395px 1092px #fff, 276px 913px #fff, 1743px 656px #fff, 773px 502px #fff, + 1686px 1322px #fff, 1516px 1945px #fff, 1334px 501px #fff, 266px 156px #fff, + 455px 655px #fff, 798px 72px #fff, 1059px 1259px #fff, 1402px 1687px #fff, + 236px 1329px #fff, 1455px 786px #fff, 146px 1228px #fff, 1851px 823px #fff, + 1062px 100px #fff, 1220px 953px #fff, 20px 1826px #fff, 36px 1063px #fff, + 1525px 338px #fff, 790px 1521px #fff, 741px 1099px #fff, 288px 1489px #fff, + 700px 1060px #fff, 390px 1071px #fff, 411px 1036px #fff, 1853px 1072px #fff, + 1446px 1085px #fff, 1164px 874px #fff, 924px 925px #fff, 291px 271px #fff, + 1257px 1964px #fff, 1580px 1352px #fff, 1507px 1216px #fff, 211px 956px #fff, + 985px 1195px #fff, 975px 1640px #fff, 518px 101px #fff, 663px 1395px #fff, + 914px 532px #fff, 145px 1320px #fff, 69px 1397px #fff, 982px 523px #fff, + 257px 725px #fff, 1599px 831px #fff, 1636px 1513px #fff, 1250px 1158px #fff, + 1132px 604px #fff, 183px 102px #fff, 1057px 318px #fff, 1247px 1835px #fff, + 1983px 1110px #fff, 1077px 1455px #fff, 921px 1770px #fff, 806px 1350px #fff, + 1938px 1992px #fff, 855px 1260px #fff, 902px 1345px #fff, 658px 1908px #fff, + 1845px 679px #fff, 712px 1482px #fff, 595px 950px #fff, 1784px 1992px #fff, + 1847px 1785px #fff, 691px 1004px #fff, 175px 1179px #fff, 1666px 1911px #fff, + 41px 61px #fff, 971px 1080px #fff, 1830px 1450px #fff, 1351px 1518px #fff, + 1257px 99px #fff, 1395px 1498px #fff, 1117px 252px #fff, 1779px 597px #fff, + 1346px 729px #fff, 1108px 1144px #fff, 402px 691px #fff, 72px 496px #fff, + 1673px 1604px #fff, 1497px 974px #fff, 1865px 1664px #fff, 88px 806px #fff, + 918px 77px #fff, 244px 1118px #fff, 256px 1820px #fff, 1851px 1840px #fff, + 605px 1851px #fff, 634px 383px #fff, 865px 37px #fff, 943px 1024px #fff, + 1951px 177px #fff, 1097px 523px #fff, 985px 1700px #fff, 1243px 122px #fff, + 768px 1070px #fff, 468px 194px #fff, 320px 1867px #fff, 1850px 185px #fff, + 380px 1616px #fff, 468px 1294px #fff, 1122px 1743px #fff, 884px 299px #fff, + 1300px 1917px #fff, 1860px 396px #fff, 1270px 990px #fff, 529px 733px #fff, + 1975px 1347px #fff, 1885px 685px #fff, 226px 506px #fff, 651px 878px #fff, + 1323px 680px #fff, 1284px 680px #fff, 238px 1967px #fff, 911px 174px #fff, + 1111px 521px #fff, 1150px 85px #fff, 794px 502px #fff, 484px 1856px #fff, + 1809px 368px #fff, 112px 953px #fff, 590px 1009px #fff, 1655px 311px #fff, + 100px 1026px #fff, 1803px 352px #fff, 865px 306px #fff, 1077px 1019px #fff, + 1335px 872px #fff, 1647px 1298px #fff, 1233px 1387px #fff, 698px 1036px #fff, + 659px 1860px #fff, 388px 1412px #fff, 1212px 458px #fff, 755px 1468px #fff, + 696px 1654px #fff, 1144px 60px #fff; +} + +#stars:after { + content: ''; + position: absolute; + top: 2000px; + width: 1px; + height: 1px; + background: transparent; + box-shadow: 779px 1331px #fff, 324px 42px #fff, 303px 586px #fff, + 1312px 276px #fff, 451px 625px #fff, 521px 1931px #fff, 1087px 1871px #fff, + 36px 1546px #fff, 132px 934px #fff, 1698px 901px #fff, 1418px 664px #fff, + 1448px 1157px #fff, 1084px 232px #fff, 347px 1776px #fff, 1722px 243px #fff, + 1629px 835px #fff, 479px 969px #fff, 1231px 960px #fff, 586px 384px #fff, + 164px 527px #fff, 8px 646px #fff, 1150px 1126px #fff, 665px 1357px #fff, + 1556px 1982px #fff, 1260px 1961px #fff, 1675px 1741px #fff, + 1843px 1514px #fff, 718px 1628px #fff, 242px 1343px #fff, 1497px 1880px #fff, + 1364px 230px #fff, 1739px 1302px #fff, 636px 959px #fff, 304px 686px #fff, + 614px 751px #fff, 1935px 816px #fff, 1428px 60px #fff, 355px 335px #fff, + 1594px 158px #fff, 90px 60px #fff, 1553px 162px #fff, 1239px 1825px #fff, + 1945px 587px #fff, 749px 1785px #fff, 1987px 1172px #fff, 1301px 1237px #fff, + 1039px 342px #fff, 1585px 1481px #fff, 995px 1048px #fff, 524px 932px #fff, + 214px 413px #fff, 1701px 1300px #fff, 1037px 1613px #fff, 1871px 996px #fff, + 1360px 1635px #fff, 1110px 1313px #fff, 412px 1783px #fff, 1949px 177px #fff, + 903px 1854px #fff, 700px 1936px #fff, 378px 125px #fff, 308px 834px #fff, + 1118px 962px #fff, 1350px 1929px #fff, 781px 1811px #fff, 561px 137px #fff, + 757px 1148px #fff, 1670px 1979px #fff, 343px 739px #fff, 945px 795px #fff, + 576px 1903px #fff, 1078px 1436px #fff, 1583px 450px #fff, 1366px 474px #fff, + 297px 1873px #fff, 192px 162px #fff, 1624px 1633px #fff, 59px 453px #fff, + 82px 1872px #fff, 1933px 498px #fff, 1966px 1974px #fff, 1975px 1688px #fff, + 779px 314px #fff, 1858px 1543px #fff, 73px 1507px #fff, 1693px 975px #fff, + 1683px 108px #fff, 1768px 1654px #fff, 654px 14px #fff, 494px 171px #fff, + 1689px 1895px #fff, 1660px 263px #fff, 1031px 903px #fff, 1203px 1393px #fff, + 1333px 1421px #fff, 1113px 41px #fff, 1206px 1645px #fff, 1325px 1635px #fff, + 142px 388px #fff, 572px 215px #fff, 1535px 296px #fff, 1419px 407px #fff, + 1379px 1003px #fff, 329px 469px #fff, 1791px 1652px #fff, 935px 1802px #fff, + 1330px 1820px #fff, 421px 1933px #fff, 828px 365px #fff, 275px 316px #fff, + 707px 960px #fff, 1605px 1554px #fff, 625px 58px #fff, 717px 1697px #fff, + 1669px 246px #fff, 1925px 322px #fff, 1154px 1803px #fff, 1929px 295px #fff, + 1248px 240px #fff, 1045px 1755px #fff, 166px 942px #fff, 1888px 1773px #fff, + 678px 1963px #fff, 1370px 569px #fff, 1974px 1400px #fff, 1786px 460px #fff, + 51px 307px #fff, 784px 1400px #fff, 730px 1258px #fff, 1712px 393px #fff, + 416px 170px #fff, 1797px 1932px #fff, 572px 219px #fff, 1557px 1856px #fff, + 218px 8px #fff, 348px 1334px #fff, 469px 413px #fff, 385px 1738px #fff, + 1357px 1818px #fff, 240px 942px #fff, 248px 1847px #fff, 1535px 806px #fff, + 236px 1514px #fff, 1429px 1556px #fff, 73px 1633px #fff, 1398px 1121px #fff, + 671px 1301px #fff, 1404px 1663px #fff, 740px 1018px #fff, 1600px 377px #fff, + 785px 514px #fff, 112px 1084px #fff, 1915px 1887px #fff, 1463px 1848px #fff, + 687px 1115px #fff, 1268px 1768px #fff, 1729px 1425px #fff, + 1284px 1022px #fff, 801px 974px #fff, 1975px 1317px #fff, 1354px 834px #fff, + 1446px 1484px #fff, 1283px 1786px #fff, 11px 523px #fff, 1842px 236px #fff, + 1355px 654px #fff, 429px 7px #fff, 1033px 1128px #fff, 157px 297px #fff, + 545px 635px #fff, 52px 1080px #fff, 827px 1520px #fff, 1121px 490px #fff, + 9px 309px #fff, 1744px 1586px #fff, 1014px 417px #fff, 1534px 524px #fff, + 958px 552px #fff, 1403px 1496px #fff, 387px 703px #fff, 1522px 548px #fff, + 1355px 282px #fff, 1532px 601px #fff, 1838px 790px #fff, 290px 259px #fff, + 295px 598px #fff, 1601px 539px #fff, 1561px 1272px #fff, 34px 1922px #fff, + 1024px 543px #fff, 467px 369px #fff, 722px 333px #fff, 1976px 1255px #fff, + 766px 983px #fff, 1582px 1285px #fff, 12px 512px #fff, 617px 1410px #fff, + 682px 577px #fff, 1334px 1438px #fff, 439px 327px #fff, 1617px 1661px #fff, + 673px 129px #fff, 794px 941px #fff, 1386px 1902px #fff, 37px 1353px #fff, + 1467px 1353px #fff, 416px 18px #fff, 187px 344px #fff, 200px 1898px #fff, + 1491px 1619px #fff, 811px 347px #fff, 924px 1827px #fff, 945px 217px #fff, + 1735px 1228px #fff, 379px 1890px #fff, 79px 761px #fff, 825px 1837px #fff, + 1980px 1558px #fff, 1308px 1573px #fff, 1488px 1726px #fff, + 382px 1208px #fff, 522px 595px #fff, 1277px 1898px #fff, 354px 552px #fff, + 161px 1784px #fff, 614px 251px #fff, 526px 1576px #fff, 17px 212px #fff, + 179px 996px #fff, 467px 1208px #fff, 1944px 1838px #fff, 1140px 1093px #fff, + 858px 1007px #fff, 200px 1064px #fff, 423px 1964px #fff, 1945px 439px #fff, + 1377px 689px #fff, 1120px 1437px #fff, 1876px 668px #fff, 907px 1324px #fff, + 343px 1976px #fff, 1816px 1501px #fff, 1849px 177px #fff, 647px 91px #fff, + 1984px 1012px #fff, 1336px 1300px #fff, 128px 648px #fff, 305px 1060px #fff, + 1324px 826px #fff, 1263px 1314px #fff, 1801px 629px #fff, 1614px 1555px #fff, + 1634px 90px #fff, 1603px 452px #fff, 891px 1984px #fff, 1556px 1906px #fff, + 121px 68px #fff, 1676px 1714px #fff, 516px 936px #fff, 1947px 1492px #fff, + 1455px 1519px #fff, 45px 602px #fff, 205px 1039px #fff, 793px 172px #fff, + 1562px 1739px #fff, 1056px 110px #fff, 1512px 379px #fff, 1795px 1621px #fff, + 1848px 607px #fff, 262px 1719px #fff, 477px 991px #fff, 483px 883px #fff, + 1239px 1197px #fff, 1496px 647px #fff, 1649px 25px #fff, 1491px 1946px #fff, + 119px 996px #fff, 179px 1472px #fff, 1341px 808px #fff, 1565px 1700px #fff, + 407px 1544px #fff, 1754px 357px #fff, 1288px 981px #fff, 902px 1997px #fff, + 1755px 1668px #fff, 186px 877px #fff, 1202px 1882px #fff, 461px 1213px #fff, + 1400px 748px #fff, 1969px 1899px #fff, 809px 522px #fff, 514px 1219px #fff, + 374px 275px #fff, 938px 1973px #fff, 357px 552px #fff, 144px 1722px #fff, + 1572px 912px #fff, 402px 1858px #fff, 1544px 1195px #fff, 667px 1257px #fff, + 727px 1496px #fff, 993px 232px #fff, 1772px 313px #fff, 1040px 1590px #fff, + 1204px 1973px #fff, 1268px 79px #fff, 1555px 1048px #fff, 986px 1707px #fff, + 978px 1710px #fff, 713px 360px #fff, 407px 863px #fff, 461px 736px #fff, + 284px 1608px #fff, 103px 430px #fff, 1283px 1319px #fff, 977px 1186px #fff, + 1966px 1516px #fff, 1287px 1129px #fff, 70px 1098px #fff, 1189px 889px #fff, + 1126px 1734px #fff, 309px 1292px #fff, 879px 764px #fff, 65px 473px #fff, + 1003px 1959px #fff, 658px 791px #fff, 402px 1576px #fff, 35px 622px #fff, + 529px 1589px #fff, 164px 666px #fff, 1876px 1290px #fff, 1541px 526px #fff, + 270px 1297px #fff, 440px 865px #fff, 1500px 802px #fff, 182px 1754px #fff, + 1264px 892px #fff, 272px 1249px #fff, 1289px 1535px #fff, 190px 1646px #fff, + 955px 242px #fff, 1456px 1597px #fff, 1727px 1983px #fff, 635px 801px #fff, + 226px 455px #fff, 1396px 1710px #fff, 849px 1863px #fff, 237px 1264px #fff, + 839px 140px #fff, 1122px 735px #fff, 1280px 15px #fff, 1318px 242px #fff, + 1819px 1148px #fff, 333px 1392px #fff, 1949px 553px #fff, 1878px 1332px #fff, + 467px 548px #fff, 1812px 1082px #fff, 1067px 193px #fff, 243px 156px #fff, + 483px 1616px #fff, 1714px 933px #fff, 759px 1800px #fff, 1822px 995px #fff, + 1877px 572px #fff, 581px 1084px #fff, 107px 732px #fff, 642px 1837px #fff, + 166px 1493px #fff, 1555px 198px #fff, 819px 307px #fff, 947px 345px #fff, + 827px 224px #fff, 927px 1394px #fff, 540px 467px #fff, 1093px 405px #fff, + 1140px 927px #fff, 130px 529px #fff, 33px 1980px #fff, 1147px 1663px #fff, + 1616px 1436px #fff, 528px 710px #fff, 798px 1100px #fff, 505px 1480px #fff, + 899px 641px #fff, 1909px 1949px #fff, 1311px 964px #fff, 979px 1301px #fff, + 1393px 969px #fff, 1793px 1886px #fff, 292px 357px #fff, 1196px 1718px #fff, + 1290px 1994px #fff, 537px 1973px #fff, 1181px 1674px #fff, + 1740px 1566px #fff, 1307px 265px #fff, 922px 522px #fff, 1892px 472px #fff, + 384px 1746px #fff, 392px 1098px #fff, 647px 548px #fff, 390px 1498px #fff, + 1246px 138px #fff, 730px 876px #fff, 192px 1472px #fff, 1790px 1789px #fff, + 928px 311px #fff, 1253px 1647px #fff, 747px 1921px #fff, 1561px 1025px #fff, + 1533px 1292px #fff, 1985px 195px #fff, 728px 729px #fff, 1712px 1936px #fff, + 512px 1717px #fff, 1528px 483px #fff, 313px 1642px #fff, 281px 1849px #fff, + 1212px 799px #fff, 435px 1191px #fff, 1422px 611px #fff, 1718px 1964px #fff, + 411px 944px #fff, 210px 636px #fff, 1502px 1295px #fff, 1434px 349px #fff, + 769px 60px #fff, 747px 1053px #fff, 789px 504px #fff, 1436px 1264px #fff, + 1893px 1225px #fff, 1394px 1788px #fff, 1108px 1317px #fff, + 1673px 1395px #fff, 854px 1010px #fff, 1705px 80px #fff, 1858px 148px #fff, + 1729px 344px #fff, 1388px 664px #fff, 895px 406px #fff, 1479px 157px #fff, + 1441px 1157px #fff, 552px 1900px #fff, 516px 364px #fff, 1647px 189px #fff, + 1427px 1071px #fff, 785px 729px #fff, 1080px 1710px #fff, 504px 204px #fff, + 1177px 1622px #fff, 657px 34px #fff, 1296px 1099px #fff, 248px 180px #fff, + 1212px 1568px #fff, 667px 1562px #fff, 695px 841px #fff, 1608px 1247px #fff, + 751px 882px #fff, 87px 167px #fff, 607px 1368px #fff, 1363px 1203px #fff, + 1836px 317px #fff, 1668px 1703px #fff, 830px 1154px #fff, 1721px 1398px #fff, + 1601px 1280px #fff, 976px 874px #fff, 1743px 254px #fff, 1020px 1815px #fff, + 1670px 1766px #fff, 1890px 735px #fff, 1379px 136px #fff, 1864px 695px #fff, + 206px 965px #fff, 1404px 1932px #fff, 1923px 1360px #fff, 247px 682px #fff, + 519px 1708px #fff, 645px 750px #fff, 1164px 1204px #fff, 834px 323px #fff, + 172px 1350px #fff, 213px 972px #fff, 1837px 190px #fff, 285px 1806px #fff, + 1047px 1299px #fff, 1548px 825px #fff, 1730px 324px #fff, 1346px 1909px #fff, + 772px 270px #fff, 345px 1190px #fff, 478px 1433px #fff, 1479px 25px #fff, + 1994px 1830px #fff, 1744px 732px #fff, 20px 1635px #fff, 690px 1795px #fff, + 1594px 569px #fff, 579px 245px #fff, 1398px 733px #fff, 408px 1352px #fff, + 1774px 120px #fff, 1152px 1370px #fff, 1698px 1810px #fff, 710px 1450px #fff, + 665px 286px #fff, 493px 1720px #fff, 786px 5px #fff, 637px 1140px #fff, + 764px 324px #fff, 927px 310px #fff, 938px 1424px #fff, 1884px 744px #fff, + 913px 462px #fff, 1831px 1936px #fff, 1527px 249px #fff, 36px 1381px #fff, + 1597px 581px #fff, 1530px 355px #fff, 949px 459px #fff, 799px 828px #fff, + 242px 1471px #fff, 654px 797px #fff, 796px 594px #fff, 1365px 678px #fff, + 752px 23px #fff, 1630px 541px #fff, 982px 72px #fff, 1733px 1831px #fff, + 21px 412px #fff, 775px 998px #fff, 335px 1945px #fff, 264px 583px #fff, + 158px 1311px #fff, 528px 164px #fff, 1978px 574px #fff, 717px 1203px #fff, + 734px 1591px #fff, 1555px 820px #fff, 16px 1943px #fff, 1625px 1177px #fff, + 1236px 690px #fff, 1585px 1590px #fff, 1737px 1728px #fff, 721px 698px #fff, + 1804px 1186px #fff, 166px 980px #fff, 1850px 230px #fff, 330px 1712px #fff, + 95px 797px #fff, 1948px 1078px #fff, 469px 939px #fff, 1269px 1899px #fff, + 955px 1220px #fff, 1137px 1075px #fff, 312px 1293px #fff, 986px 1762px #fff, + 1103px 1238px #fff, 428px 1993px #fff, 355px 570px #fff, 977px 1836px #fff, + 1395px 1092px #fff, 276px 913px #fff, 1743px 656px #fff, 773px 502px #fff, + 1686px 1322px #fff, 1516px 1945px #fff, 1334px 501px #fff, 266px 156px #fff, + 455px 655px #fff, 798px 72px #fff, 1059px 1259px #fff, 1402px 1687px #fff, + 236px 1329px #fff, 1455px 786px #fff, 146px 1228px #fff, 1851px 823px #fff, + 1062px 100px #fff, 1220px 953px #fff, 20px 1826px #fff, 36px 1063px #fff, + 1525px 338px #fff, 790px 1521px #fff, 741px 1099px #fff, 288px 1489px #fff, + 700px 1060px #fff, 390px 1071px #fff, 411px 1036px #fff, 1853px 1072px #fff, + 1446px 1085px #fff, 1164px 874px #fff, 924px 925px #fff, 291px 271px #fff, + 1257px 1964px #fff, 1580px 1352px #fff, 1507px 1216px #fff, 211px 956px #fff, + 985px 1195px #fff, 975px 1640px #fff, 518px 101px #fff, 663px 1395px #fff, + 914px 532px #fff, 145px 1320px #fff, 69px 1397px #fff, 982px 523px #fff, + 257px 725px #fff, 1599px 831px #fff, 1636px 1513px #fff, 1250px 1158px #fff, + 1132px 604px #fff, 183px 102px #fff, 1057px 318px #fff, 1247px 1835px #fff, + 1983px 1110px #fff, 1077px 1455px #fff, 921px 1770px #fff, 806px 1350px #fff, + 1938px 1992px #fff, 855px 1260px #fff, 902px 1345px #fff, 658px 1908px #fff, + 1845px 679px #fff, 712px 1482px #fff, 595px 950px #fff, 1784px 1992px #fff, + 1847px 1785px #fff, 691px 1004px #fff, 175px 1179px #fff, 1666px 1911px #fff, + 41px 61px #fff, 971px 1080px #fff, 1830px 1450px #fff, 1351px 1518px #fff, + 1257px 99px #fff, 1395px 1498px #fff, 1117px 252px #fff, 1779px 597px #fff, + 1346px 729px #fff, 1108px 1144px #fff, 402px 691px #fff, 72px 496px #fff, + 1673px 1604px #fff, 1497px 974px #fff, 1865px 1664px #fff, 88px 806px #fff, + 918px 77px #fff, 244px 1118px #fff, 256px 1820px #fff, 1851px 1840px #fff, + 605px 1851px #fff, 634px 383px #fff, 865px 37px #fff, 943px 1024px #fff, + 1951px 177px #fff, 1097px 523px #fff, 985px 1700px #fff, 1243px 122px #fff, + 768px 1070px #fff, 468px 194px #fff, 320px 1867px #fff, 1850px 185px #fff, + 380px 1616px #fff, 468px 1294px #fff, 1122px 1743px #fff, 884px 299px #fff, + 1300px 1917px #fff, 1860px 396px #fff, 1270px 990px #fff, 529px 733px #fff, + 1975px 1347px #fff, 1885px 685px #fff, 226px 506px #fff, 651px 878px #fff, + 1323px 680px #fff, 1284px 680px #fff, 238px 1967px #fff, 911px 174px #fff, + 1111px 521px #fff, 1150px 85px #fff, 794px 502px #fff, 484px 1856px #fff, + 1809px 368px #fff, 112px 953px #fff, 590px 1009px #fff, 1655px 311px #fff, + 100px 1026px #fff, 1803px 352px #fff, 865px 306px #fff, 1077px 1019px #fff, + 1335px 872px #fff, 1647px 1298px #fff, 1233px 1387px #fff, 698px 1036px #fff, + 659px 1860px #fff, 388px 1412px #fff, 1212px 458px #fff, 755px 1468px #fff, + 696px 1654px #fff, 1144px 60px #fff; +} + +#stars2 { + width: 2px; + height: 2px; + background: transparent; + animation: animStar 100s linear infinite; + box-shadow: 1448px 320px #fff, 1775px 1663px #fff, 332px 1364px #fff, + 878px 340px #fff, 569px 1832px #fff, 1422px 1684px #fff, 1946px 1907px #fff, + 121px 979px #fff, 1044px 1069px #fff, 463px 381px #fff, 423px 112px #fff, + 523px 1179px #fff, 779px 654px #fff, 1398px 694px #fff, 1085px 1464px #fff, + 1599px 1869px #fff, 801px 1882px #fff, 779px 1231px #fff, 552px 932px #fff, + 1057px 1196px #fff, 282px 1280px #fff, 496px 1986px #fff, 1833px 1120px #fff, + 1802px 1293px #fff, 6px 1696px #fff, 412px 1902px #fff, 605px 438px #fff, + 24px 1212px #fff, 234px 1320px #fff, 544px 344px #fff, 1107px 170px #fff, + 1603px 196px #fff, 905px 648px #fff, 68px 1458px #fff, 649px 1969px #fff, + 744px 675px #fff, 1127px 478px #fff, 714px 1814px #fff, 1486px 526px #fff, + 270px 1636px #fff, 1931px 149px #fff, 1807px 378px #fff, 8px 390px #fff, + 1415px 699px #fff, 1473px 1211px #fff, 1590px 141px #fff, 270px 1705px #fff, + 69px 1423px #fff, 1108px 1053px #fff, 1946px 128px #fff, 371px 371px #fff, + 1490px 220px #fff, 357px 1885px #fff, 363px 363px #fff, 1896px 1256px #fff, + 1979px 1050px #fff, 947px 1342px #fff, 1754px 242px #fff, 514px 974px #fff, + 65px 1477px #fff, 1840px 547px #fff, 950px 695px #fff, 459px 1150px #fff, + 1124px 1502px #fff, 481px 940px #fff, 680px 839px #fff, 797px 1169px #fff, + 1977px 1491px #fff, 734px 1724px #fff, 210px 298px #fff, 816px 628px #fff, + 686px 770px #fff, 1721px 267px #fff, 1663px 511px #fff, 1481px 1141px #fff, + 582px 248px #fff, 1308px 953px #fff, 628px 657px #fff, 897px 1535px #fff, + 270px 931px #fff, 791px 467px #fff, 1336px 1732px #fff, 1013px 1653px #fff, + 1911px 956px #fff, 587px 816px #fff, 83px 456px #fff, 930px 1478px #fff, + 1587px 1694px #fff, 614px 1200px #fff, 302px 1782px #fff, 1711px 1432px #fff, + 443px 904px #fff, 1666px 714px #fff, 1588px 1167px #fff, 273px 1075px #fff, + 1679px 461px #fff, 721px 664px #fff, 1202px 10px #fff, 166px 1126px #fff, + 331px 1628px #fff, 430px 1565px #fff, 1585px 509px #fff, 640px 38px #fff, + 822px 837px #fff, 1760px 1664px #fff, 1122px 1458px #fff, 398px 131px #fff, + 689px 285px #fff, 460px 652px #fff, 1627px 365px #fff, 348px 1648px #fff, + 819px 1946px #fff, 981px 1917px #fff, 323px 76px #fff, 979px 684px #fff, + 887px 536px #fff, 1348px 1596px #fff, 1055px 666px #fff, 1402px 1797px #fff, + 1300px 1055px #fff, 937px 238px #fff, 1474px 1815px #fff, 1144px 1710px #fff, + 1629px 1087px #fff, 911px 919px #fff, 771px 819px #fff, 403px 720px #fff, + 163px 736px #fff, 1062px 238px #fff, 1774px 818px #fff, 1874px 1178px #fff, + 1177px 699px #fff, 1244px 1244px #fff, 1371px 58px #fff, 564px 1515px #fff, + 1824px 487px #fff, 929px 702px #fff, 394px 1348px #fff, 1161px 641px #fff, + 219px 1841px #fff, 358px 941px #fff, 140px 1759px #fff, 1019px 1345px #fff, + 274px 436px #fff, 1433px 1605px #fff, 1798px 1426px #fff, 294px 1848px #fff, + 1681px 1877px #fff, 1344px 1824px #fff, 1439px 1632px #fff, + 161px 1012px #fff, 1308px 588px #fff, 1789px 582px #fff, 721px 1910px #fff, + 318px 218px #fff, 607px 319px #fff, 495px 535px #fff, 1552px 1575px #fff, + 1562px 67px #fff, 403px 926px #fff, 1096px 1800px #fff, 1814px 1709px #fff, + 1882px 1831px #fff, 533px 46px #fff, 823px 969px #fff, 530px 165px #fff, + 1030px 352px #fff, 1681px 313px #fff, 338px 115px #fff, 1607px 211px #fff, + 1718px 1184px #fff, 1589px 659px #fff, 278px 355px #fff, 464px 1464px #fff, + 1165px 277px #fff, 950px 694px #fff, 1746px 293px #fff, 793px 911px #fff, + 528px 773px #fff, 1883px 1694px #fff, 748px 182px #fff, 1924px 1531px #fff, + 100px 636px #fff, 1473px 1445px #fff, 1264px 1244px #fff, 850px 1377px #fff, + 987px 1976px #fff, 933px 1761px #fff, 922px 1270px #fff, 500px 396px #fff, + 1324px 8px #fff, 1967px 1814px #fff, 1072px 1401px #fff, 961px 37px #fff, + 156px 81px #fff, 1915px 502px #fff, 1076px 1846px #fff, 152px 1669px #fff, + 986px 1529px #fff, 1667px 1137px #fff; +} + +#stars2:after { + content: ''; + position: absolute; + top: 2000px; + width: 2px; + height: 2px; + background: transparent; + box-shadow: 1448px 320px #fff, 1775px 1663px #fff, 332px 1364px #fff, + 878px 340px #fff, 569px 1832px #fff, 1422px 1684px #fff, 1946px 1907px #fff, + 121px 979px #fff, 1044px 1069px #fff, 463px 381px #fff, 423px 112px #fff, + 523px 1179px #fff, 779px 654px #fff, 1398px 694px #fff, 1085px 1464px #fff, + 1599px 1869px #fff, 801px 1882px #fff, 779px 1231px #fff, 552px 932px #fff, + 1057px 1196px #fff, 282px 1280px #fff, 496px 1986px #fff, 1833px 1120px #fff, + 1802px 1293px #fff, 6px 1696px #fff, 412px 1902px #fff, 605px 438px #fff, + 24px 1212px #fff, 234px 1320px #fff, 544px 344px #fff, 1107px 170px #fff, + 1603px 196px #fff, 905px 648px #fff, 68px 1458px #fff, 649px 1969px #fff, + 744px 675px #fff, 1127px 478px #fff, 714px 1814px #fff, 1486px 526px #fff, + 270px 1636px #fff, 1931px 149px #fff, 1807px 378px #fff, 8px 390px #fff, + 1415px 699px #fff, 1473px 1211px #fff, 1590px 141px #fff, 270px 1705px #fff, + 69px 1423px #fff, 1108px 1053px #fff, 1946px 128px #fff, 371px 371px #fff, + 1490px 220px #fff, 357px 1885px #fff, 363px 363px #fff, 1896px 1256px #fff, + 1979px 1050px #fff, 947px 1342px #fff, 1754px 242px #fff, 514px 974px #fff, + 65px 1477px #fff, 1840px 547px #fff, 950px 695px #fff, 459px 1150px #fff, + 1124px 1502px #fff, 481px 940px #fff, 680px 839px #fff, 797px 1169px #fff, + 1977px 1491px #fff, 734px 1724px #fff, 210px 298px #fff, 816px 628px #fff, + 686px 770px #fff, 1721px 267px #fff, 1663px 511px #fff, 1481px 1141px #fff, + 582px 248px #fff, 1308px 953px #fff, 628px 657px #fff, 897px 1535px #fff, + 270px 931px #fff, 791px 467px #fff, 1336px 1732px #fff, 1013px 1653px #fff, + 1911px 956px #fff, 587px 816px #fff, 83px 456px #fff, 930px 1478px #fff, + 1587px 1694px #fff, 614px 1200px #fff, 302px 1782px #fff, 1711px 1432px #fff, + 443px 904px #fff, 1666px 714px #fff, 1588px 1167px #fff, 273px 1075px #fff, + 1679px 461px #fff, 721px 664px #fff, 1202px 10px #fff, 166px 1126px #fff, + 331px 1628px #fff, 430px 1565px #fff, 1585px 509px #fff, 640px 38px #fff, + 822px 837px #fff, 1760px 1664px #fff, 1122px 1458px #fff, 398px 131px #fff, + 689px 285px #fff, 460px 652px #fff, 1627px 365px #fff, 348px 1648px #fff, + 819px 1946px #fff, 981px 1917px #fff, 323px 76px #fff, 979px 684px #fff, + 887px 536px #fff, 1348px 1596px #fff, 1055px 666px #fff, 1402px 1797px #fff, + 1300px 1055px #fff, 937px 238px #fff, 1474px 1815px #fff, 1144px 1710px #fff, + 1629px 1087px #fff, 911px 919px #fff, 771px 819px #fff, 403px 720px #fff, + 163px 736px #fff, 1062px 238px #fff, 1774px 818px #fff, 1874px 1178px #fff, + 1177px 699px #fff, 1244px 1244px #fff, 1371px 58px #fff, 564px 1515px #fff, + 1824px 487px #fff, 929px 702px #fff, 394px 1348px #fff, 1161px 641px #fff, + 219px 1841px #fff, 358px 941px #fff, 140px 1759px #fff, 1019px 1345px #fff, + 274px 436px #fff, 1433px 1605px #fff, 1798px 1426px #fff, 294px 1848px #fff, + 1681px 1877px #fff, 1344px 1824px #fff, 1439px 1632px #fff, + 161px 1012px #fff, 1308px 588px #fff, 1789px 582px #fff, 721px 1910px #fff, + 318px 218px #fff, 607px 319px #fff, 495px 535px #fff, 1552px 1575px #fff, + 1562px 67px #fff, 403px 926px #fff, 1096px 1800px #fff, 1814px 1709px #fff, + 1882px 1831px #fff, 533px 46px #fff, 823px 969px #fff, 530px 165px #fff, + 1030px 352px #fff, 1681px 313px #fff, 338px 115px #fff, 1607px 211px #fff, + 1718px 1184px #fff, 1589px 659px #fff, 278px 355px #fff, 464px 1464px #fff, + 1165px 277px #fff, 950px 694px #fff, 1746px 293px #fff, 793px 911px #fff, + 528px 773px #fff, 1883px 1694px #fff, 748px 182px #fff, 1924px 1531px #fff, + 100px 636px #fff, 1473px 1445px #fff, 1264px 1244px #fff, 850px 1377px #fff, + 987px 1976px #fff, 933px 1761px #fff, 922px 1270px #fff, 500px 396px #fff, + 1324px 8px #fff, 1967px 1814px #fff, 1072px 1401px #fff, 961px 37px #fff, + 156px 81px #fff, 1915px 502px #fff, 1076px 1846px #fff, 152px 1669px #fff, + 986px 1529px #fff, 1667px 1137px #fff; +} + +#stars3 { + width: 2.5px; + height: 2.5px; + background: transparent; + animation: animStar 150s linear infinte; + box-shadow: 387px 1878px #fff, 760px 1564px #fff, 1487px 999px #fff, + 948px 1828px #fff, 1977px 1001px #fff, 1284px 1963px #fff, 656px 284px #fff, + 1268px 1635px #fff, 1820px 598px #fff, 642px 1900px #fff, 296px 57px #fff, + 921px 1620px #fff, 476px 1858px #fff, 658px 613px #fff, 1171px 1363px #fff, + 1419px 283px #fff, 1037px 731px #fff, 503px 663px #fff, 1562px 463px #fff, + 383px 1197px #fff, 1171px 1233px #fff, 876px 1768px #fff, 856px 1615px #fff, + 1375px 1924px #fff, 1725px 918px #fff, 952px 119px #fff, 768px 1212px #fff, + 992px 1462px #fff, 1929px 717px #fff, 1947px 755px #fff, 1818px 1123px #fff, + 1896px 1672px #fff, 460px 198px #fff, 256px 271px #fff, 752px 544px #fff, + 1222px 1859px #fff, 1851px 443px #fff, 313px 1858px #fff, 709px 446px #fff, + 1546px 697px #fff, 674px 1155px #fff, 1112px 130px #fff, 355px 1790px #fff, + 1496px 974px #fff, 1696px 480px #fff, 1316px 1265px #fff, 1645px 1063px #fff, + 1182px 237px #fff, 427px 1582px #fff, 859px 253px #fff, 458px 939px #fff, + 1517px 1644px #fff, 1943px 60px #fff, 212px 1650px #fff, 966px 1786px #fff, + 473px 712px #fff, 130px 76px #fff, 1417px 1186px #fff, 909px 1580px #fff, + 1913px 762px #fff, 204px 1143px #fff, 1998px 1057px #fff, 1468px 1301px #fff, + 144px 1676px #fff, 21px 1601px #fff, 382px 1362px #fff, 912px 753px #fff, + 1488px 1405px #fff, 802px 156px #fff, 174px 550px #fff, 338px 1366px #fff, + 1197px 774px #fff, 602px 486px #fff, 682px 1877px #fff, 348px 1503px #fff, + 407px 1139px #fff, 950px 1400px #fff, 922px 1139px #fff, 1697px 293px #fff, + 1238px 1281px #fff, 1038px 1197px #fff, 376px 1889px #fff, + 1255px 1680px #fff, 1008px 1316px #fff, 1538px 1447px #fff, + 1186px 874px #fff, 1967px 640px #fff, 1341px 19px #fff, 29px 1732px #fff, + 16px 1650px #fff, 1021px 1075px #fff, 723px 424px #fff, 1175px 41px #fff, + 494px 1957px #fff, 1296px 431px #fff, 175px 1507px #fff, 831px 121px #fff, + 498px 1947px #fff, 617px 880px #fff, 240px 403px #fff; +} + +#stars3:after { + content: ''; + position: absolute; + top: 200px; + width: 2.5px; + height: 2.5px; + background: transparent; + box-shadow: 387px 1878px #fff, 760px 1564px #fff, 1487px 999px #fff, + 948px 1828px #fff, 1977px 1001px #fff, 1284px 1963px #fff, 656px 284px #fff, + 1268px 1635px #fff, 1820px 598px #fff, 642px 1900px #fff, 296px 57px #fff, + 921px 1620px #fff, 476px 1858px #fff, 658px 613px #fff, 1171px 1363px #fff, + 1419px 283px #fff, 1037px 731px #fff, 503px 663px #fff, 1562px 463px #fff, + 383px 1197px #fff, 1171px 1233px #fff, 876px 1768px #fff, 856px 1615px #fff, + 1375px 1924px #fff, 1725px 918px #fff, 952px 119px #fff, 768px 1212px #fff, + 992px 1462px #fff, 1929px 717px #fff, 1947px 755px #fff, 1818px 1123px #fff, + 1896px 1672px #fff, 460px 198px #fff, 256px 271px #fff, 752px 544px #fff, + 1222px 1859px #fff, 1851px 443px #fff, 313px 1858px #fff, 709px 446px #fff, + 1546px 697px #fff, 674px 1155px #fff, 1112px 130px #fff, 355px 1790px #fff, + 1496px 974px #fff, 1696px 480px #fff, 1316px 1265px #fff, 1645px 1063px #fff, + 1182px 237px #fff, 427px 1582px #fff, 859px 253px #fff, 458px 939px #fff, + 1517px 1644px #fff, 1943px 60px #fff, 212px 1650px #fff, 966px 1786px #fff, + 473px 712px #fff, 130px 76px #fff, 1417px 1186px #fff, 909px 1580px #fff, + 1913px 762px #fff, 204px 1143px #fff, 1998px 1057px #fff, 1468px 1301px #fff, + 144px 1676px #fff, 21px 1601px #fff, 382px 1362px #fff, 912px 753px #fff, + 1488px 1405px #fff, 802px 156px #fff, 174px 550px #fff, 338px 1366px #fff, + 1197px 774px #fff, 602px 486px #fff, 682px 1877px #fff, 348px 1503px #fff, + 407px 1139px #fff, 950px 1400px #fff, 922px 1139px #fff, 1697px 293px #fff, + 1238px 1281px #fff, 1038px 1197px #fff, 376px 1889px #fff, + 1255px 1680px #fff, 1008px 1316px #fff, 1538px 1447px #fff, + 1186px 874px #fff, 1967px 640px #fff, 1341px 19px #fff, 29px 1732px #fff, + 16px 1650px #fff, 1021px 1075px #fff, 723px 424px #fff, 1175px 41px #fff, + 494px 1957px #fff, 1296px 431px #fff, 175px 1507px #fff, 831px 121px #fff, + 498px 1947px #fff, 617px 880px #fff, 240px 403px #fff; +} +@keyframes animStar { + from { + transform: translateY(0px); + } + to { + transform: translateY(-2000px); + } +} \ No newline at end of file diff --git a/frontend/public/css/modal.css b/frontend/public/css/modal.css new file mode 100644 index 0000000..3b2d934 --- /dev/null +++ b/frontend/public/css/modal.css @@ -0,0 +1,74 @@ +@import 'global.css'; + +/* The Modal (background) */ +.modal { + position: fixed; /* Stay in place */ + z-index: 9999; /* Sit on top */ + left: 0; + top: 0; + width: 100%; /* Full width */ + height: 100%; /* Full height */ + overflow: auto; /* Enable scroll if needed */ + background-color: rgba(36, 34, 34, 0.528); /* Black w/ opacity */ + backdrop-filter: blur(8px); + font-family: var(--regular); + } + + + /* Modal Content/Box */ + .modal-content { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + background-color: var(--secondary-body-color); + color: var(--secondary-color); + margin: 15% auto; /* 15% from the top and centered */ + border: 1px solid #888; + width: 50%; /* Could be more or less, depending on screen size */ + border-radius: 10px; + box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.2); + } + + /* Modal Header */ + .modal-header { + display: flex; + justify-content: flex-start; + align-items: center; + padding: 10px 20px; + background-color: var(--light-color); + color: var(--body-color); + border-top-left-radius: 10px; + border-top-right-radius: 10px; + width: 100%; + } + + /* Modal Body */ + .modal-body { + padding: 20px; + font-size: 1rem; + line-height: 1.5; + } + + /* Style the close button */ + .close { + /* color: #aaa; */ + background-color: var(--light-color); + border: none; + margin-left: auto; + font-weight: bold; + } + + .close:hover, + .close:focus { + color: black; + text-decoration: none; + cursor: pointer; + } + +@media screen and (max-width: 768px) { + .modal-content { + width: 80%; + } +} + \ No newline at end of file diff --git a/frontend/public/css/points.css b/frontend/public/css/points.css new file mode 100644 index 0000000..c0592d4 --- /dev/null +++ b/frontend/public/css/points.css @@ -0,0 +1,100 @@ +.get-points { + padding: 1rem; + font-weight: bold; + font-size: 2rem; + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; +} +.happy-gif, +.sad-gif, +.dance-gif { + height: 5rem; + width: 5rem; + margin-right: 0.5rem; + transition: 1.5s ease-in-out; +} +.dance-gif { + transition: 3s ease-in-out; +} +.happy-gif:hover { + transform: scale(2.5); + z-index: 30; +} +.sad-gif:hover, +.dance-gif:hover { + transform: scale(2.5) rotateY(180deg); + z-index: 30; +} +.sad-gif, +.dance-gif { + transform: rotateY(180deg); +} +.dance-gif:hover { + margin-right: 30rem; +} +.points-right { + text-align: right; + margin-right: auto; + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; +} +.points-left { + text-align: left; + margin-right: auto; + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; +} +.points-left img { + transform: rotateY(180deg); + transition: 1.5s ease-in-out; +} +.points-right img { + transition: 1.5s ease-in-out; +} +.points-left img:hover { + margin-right: 6rem; +} +.points-right img:hover { + margin-left: 6rem; +} + +.star-gif { + max-height: 3rem; + max-width: 3rem; + margin-right: 0.5rem; +} +.li-content { + padding: 1rem; + width: 100%; + border-radius: 10px; + background-color: var(--secondary-body-color); +} +.points-gain { + display: flex; + width: 100%; + flex-direction: column; + gap: 1rem; + font-weight: lighter; +} + +@media screen and (max-width: 768px) { + .happy-gif { + transform: scale(2.5); + margin-right: 1rem; + } + .dance-gif, + .sad-gif { + margin-right: 1rem; + transform: rotateY(180deg) scale(2.5); + + } + .dance-gif:active,.sad-gif:active{ + margin-right: 30rem; + } +} diff --git a/frontend/public/css/polls.css b/frontend/public/css/polls.css new file mode 100644 index 0000000..29c011b --- /dev/null +++ b/frontend/public/css/polls.css @@ -0,0 +1,85 @@ +.poll-container { + align-items: flex-end; + } + .create-poll-form{ + display: flex; + justify-content: center; + align-items: flex-end; + flex-direction: column; + gap: 0.8rem; + border-radius: 10px; + width: 100%; + max-width: 100%; + padding-bottom: 2rem; + } + + .poll-title{ + width: 100%; + border-radius: 10px; + padding: 0.8rem; + background-color: var(--body-color); + border: none; + outline: none; + color: var(--primary-color); + font-size: 1rem; + } + .poll-options{ + width: 90%; + display: flex; + flex-direction: column; + gap: 0.8rem; + } + .each-option{ + width: 100%; + padding: 0.8rem; + border-radius: 10px; + background-color: var(--body-color); + border: none; + outline: none; + color: var(--primary-color); + } + + .poll-submit-btn{ + cursor: pointer; + font-size: 1rem; + width: 100%; + padding: 0.8rem; + border-radius: 10px; + background-color: var(--body-color); + color: var(--primary-color); + border: none; + outline: none; + } + .poll-submit-btn:hover{ + background-color: var(--primary-color); + color: var(--body-color); + } + +.voted{ + border:2px solid var(--secondary-color); + +} +.option-fill{ + background: var(--light-color); + color: var(--light-color); + height: 100%; + /* width: 100%; */ + z-index: 3; + border-radius: 10px; + opacity: 0.4; + /* transition: width 300ms ease-in-out; */ + position: absolute; +} + +.animate-fill{ + animation: fill 800ms ease-in-out; +} + +@keyframes fill{ + 0%{ + width: 0%; + } + 50%{ + width: 100%; + } +} \ No newline at end of file diff --git a/frontend/public/css/postcard.css b/frontend/public/css/postcard.css new file mode 100644 index 0000000..038cdf7 --- /dev/null +++ b/frontend/public/css/postcard.css @@ -0,0 +1,473 @@ +@import "global.css"; + +a { + text-decoration: none; + color: var(--secondary-color); +} +.post-section, +.poll-section, +.challenges-section { + padding-top: 5rem; +} +.posts, +.polls, +.challenges, +.edit-profile { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + margin-top: 15px; +} +.comments-container { + display: flex; + flex-direction: column; + gap: 0.5rem; +} +#comment{ + resize: none; +} +.hide { + display: none; +} +.pointer-events { + pointer-events: none; +} +.post-container, +.poll-container, +.each-challenge-container, +.edit-profile-container { + display: flex; + justify-content: flex-start; + align-items: flex-start; + flex-direction: column; + background-color: var(--secondary-body-color); + width: 35%; + height: 100%; + padding: 1rem; + border-radius: 10px; + gap: 1rem; + color: var(--secondary-color); + font-family: var(--regular); +} +.share-container{ + display: flex; + justify-content: center; + align-items: center; +} +.post-creator { + display: flex; + /* justify-content: flex-start; */ + align-items: center; + gap: 1rem; + width: 100%; +} +.delete-icon, +.poll-delete-icon, +.challenge-delete-icon, +.comment-delete-icon { + display: flex; + justify-content: center; + align-items: center; + cursor: pointer; + color: var(--primary-color); + margin-left: auto; +} +.post-creator-name { + display: flex; + justify-content: center; + align-items: center; + gap: 0.5rem; +} + +.follow-count{ + font-size: 4.2rem; +} +.follow-text{ + display: flex; + justify-content: space-evenly; + width: 100%; +} +.profile-name{ + display: flex; + justify-content: center; + align-items: center; + gap:0.5rem; +} +.followers-following{ + display: flex; + gap:3rem; +} +.followers-following-text{ + font-size: 1rem; + margin-left: 2px; +} +.post-content { + display: flex; + justify-content: center; + flex-direction: column; + align-items: flex-start; + padding: 0.6rem; + background-color: var(--body-color); + border-radius: 10px; + width: 100%; + gap: 0.8rem; + font-size: large; +} +.shared-content{ + display: flex; + justify-content: flex-start; + align-items: flex-start; + flex-direction: column; + background-color: var(--body-color); + height: 100%; + width: 100%; + padding: 0.5rem; + border-radius: 10px; + gap: 1rem; + color: var(--secondary-color); + font-family: var(--regular); +} +.shared-post-content{ + background-color: var(--secondary-body-color); +} +.post-content p, +.post-content a { + min-width: 100%; +} +.poll-options { + display: flex; + justify-content: center; + flex-direction: column; + align-items: flex-start; + padding: 0.6rem; + border-radius: 10px; + width: 100%; + gap: 0.8rem; + font-size: large; +} +.poll-title { + margin-left: 5px; +} +.post-image { + width: 100%; + max-width: 100%; + border-radius: 10px; + margin-inline: auto; +} +.post-creator-name small { + color: var(--dark-color); +} +.interaction { + display: flex; + justify-content: center; + align-items: center; + width: 100%; + max-width: 100%; +} +.like, +.comment, +.share, +.dislike { + display: flex; + justify-content: center; + align-items: center; + width: 100%; + align-items: center; + gap: 0.5rem; + font-size: small; +} +.interaction-icons { + font-size: 0.5rem; +} + +.post-profile { + width: 50px; + height: 50px; + border-radius: 50%; +} +.interaction i, +.interaction span { + cursor: pointer; + text-align: center; +} + +/* Voted Options in Polls */ +.option { + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; + background-color: var(--body-color); + border-radius: 10px; + + cursor: pointer; + position: relative; +} +.option p, +.option span { + padding: 5px 12px; + z-index: 10; +} +.option p { + width: 100%; +} +.option span { + padding-left: 0; + text-align: right; +} + +/* edit profile */ +.edit-profile-form, +.create-challenge-form { + display: flex; + justify-content: center; + align-items: flex-start; + flex-direction: column; + gap: 0.8rem; + border-radius: 10px; + width: 100%; + max-width: 100%; +} +.edit-profile-form input, +.create-challenge-form input, +.create-challenge-form textarea,#uploadpic { + width: 100%; + max-width: 100%; + padding: 0.5rem; + border-radius: 10px; + border: none; + outline: none; + background-color: var(--body-color); + color: var(--secondary-color); + font-family: var(--regular); +} + +.create-challenge-form input, +.create-challenge-form textarea{ + font-size: 0.9rem; +} + +.edit-profile-form input::placeholder, +.create-challenge-form input::placeholder, +.create-challenge-form textarea::placeholder { + color: var(--dark-color); +} +.edit-profile-form input:focus { + border-inline: 1px solid var(--primary-color); +} +.edit-profile-submit, +.challenge-submit-btn, +.logout-btn { + cursor: pointer; + font-size: 1rem; +} +.edit-profile-submit:hover, +.challenge-submit-btn:hover { + background-color: var(--primary-color); + color: var(--body-color); +} +.edit-profile-submit{ + color: var(--body-color) !important; + background-color: var(--primary-color) !important; +} +.edit-profile-submit:hover { + color: var(--body-color) !important; + background-color: rgb(163, 248, 163) !important; +} +.logout-form input{ + color: var(--body-color); + background-color: #fc8799; + font-size: 1.1rem; +} +.logout-btn:hover { + color: var(--secondary-color); + background-color: #EB455F ; +} + +.edit-profile-form + .edit-profile-form::before { + content: ""; + display: block; + margin: 2rem auto; /* adjust the margin to control the thickness of the line */ + width: 80%; /* adjust the width of the line */ + border-top: 1px solid var(--primary-color); /* adjust the color of the line */ + +} +.file-upload input[type="file"],#input-file { + display: none; +} + +.file-upload label { + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + cursor: pointer; + gap:1rem; + +} +label#uploadpic{ + width: 100%; + position: relative; +} +.file-upload{ + width: 100%; +} + + +.label-input { + width: 100%; + display: flex; + justify-content: flex-start; + align-items: center; + flex-direction: row; + gap: 0.5rem; +} +.label-input label { + width: 30%; +} +.view-point-details{ + padding: 0.2rem 0.5rem; + background-color: var(--body-color); + border-radius: 10px; + width: 100%; +} +.view-point-details span a{ + color: var(--dark-color); + padding-left: 0.5rem; + transition: 0.6s ease-in-out; + -webkit-text-decoration: underline wavy rgb(248, 183, 84); + text-decoration: underline wavy rgb(248, 183, 84); +} +.view-point-details span a:hover{ + color: rgb(248, 183, 84); + padding-left: 2rem; + -webkit-text-decoration: underline wavy var(--primary-color); + text-decoration: underline wavy var(--primary-color); + +} + +/* add buttons in timeline */ +.adding-buttons { + display: flex; + justify-content: space-between; + align-items: center; + flex-direction: row; + /* gap: 1rem; */ + width: 100%; + max-width: 100%; + padding: 1rem 0; +} + +.add-post-btn, +.add-poll-btn, +.add-challenge-btn { + cursor: pointer; + font-size: 1rem; + padding: 0.5rem 2rem; + border-radius: 10px; + background-color: var(--body-color); + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + text-align: center; +} +.add-post-btn:hover, .add-poll-btn:hover, .add-challenge-btn:hover { + background-color: var(--primary-color); + color: var(--body-color); +} + +/* Media queries */ +@media screen and (max-width: 1120px) and (min-width: 768px) { + .post-section, + .poll-section, + .challenges-section { + padding-top: 5rem; + } + .like, + .comment, + .share { + display: flex; + justify-content: center; + align-items: center; + resize: none; + } +} +@media screen and (max-width: 768px) { + .post-section, + .poll-section, + .challenge-section, + .ownPosts, + .logout-form { + padding-bottom: 5rem; + } + div.file-upload{ + display: flex; + flex-direction: row; + } + label#uploadpic{ + width: 100%; + } + .post-container, + .poll-container, + .each-challenge-container, + .edit-profile-container { + width: 100%; + padding: 1rem; + } + .post-content { + font-size: 0.95rem; + } + .interaction { + max-width: 100%; + overflow: hidden; + } + .follow-text{ + display:flex; + flex-direction: column; + justify-content: center; + align-items: center; + } + .like, + .comment, + .share, + .dislike { + display: flex; + justify-content: center; + align-items: center; + } + .post-section, + .poll-section, + .challenges-section { + padding-top: 0; + } + .posts, + .polls, + .challenges, + .edit-profile { + margin: 15px; + } + .label-input { + width: 100%; + display: flex; + justify-content: flex-start; + align-items: flex-start; + flex-direction: column; + gap: 0.5rem; + } + .add-button-text { + display: none; + } +} +@media screen and (min-width: 769px) and (max-width: 1400px) { + .post-container, + .poll-container, + .each-challenge-container, + .edit-profile-container { + width: 60%; + } + #uploadpic{ + width: 100%; + } +} diff --git a/frontend/public/css/profile.css b/frontend/public/css/profile.css new file mode 100644 index 0000000..673d76f --- /dev/null +++ b/frontend/public/css/profile.css @@ -0,0 +1,179 @@ +@import "global.css"; + +.profileDetails { + font-family: var(--light); + font-size: clamp(1rem, 2vmin, 1.5rem); + color: var(--secondary-color); +} +.profileCard { + display: flex; + justify-content: center; + align-items: center; + flex-wrap: nowrap; + background-color: var(--secondary-body-color); + height: 100%; + width: 35%; + gap: clamp(1rem, 7vmin, 4rem); + border-radius: 0px 0px 10px 10px; + padding: 6rem 1.5rem 0.7rem 1.5rem; + margin-inline: auto; +} +.nameAndDp { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + gap: 1rem; +} +.follow{ + margin-right: auto; +} +.follow input:hover{ + background: var(--primary-color); + color: var(--secondary-body-color); +} +.follow input{ + background-color: var(--secondary-body-color); + color: var(--secondary-color); + border: 2px solid var(--primary-color); + width: 100px; + height: 30px; + border-radius: 5px; + cursor: pointer; +} +.bioAndConnections { + display: flex; + justify-content: flex-start; + align-items: center; + flex-direction: column; + flex-wrap: nowrap; + gap: clamp(0.01rem, 5vmin, 0.4rem); +} + +.followers, +.followings, +.points { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; +} +.connections p{ + font-size: 1.2rem !important; + font-weight: bold; +} +.connections { + display: flex; + justify-content: space-between; + align-items: center; + flex-direction: row; + gap: clamp(0.8rem, 2.5vmin, 2rem); +} +.bioAndUsername { + margin-right: auto; +} +.profile-bio { + font-family: var(--light); + font-size: clamp(0.8rem, 2vmin, 1.5rem); + color: var(--light-color); + letter-spacing: 0.2px; +} +.profile-username { + font-family: var(--light); + font-size: clamp(0.6rem, 80vmin, 1.2rem); + color: var(--light-color); +} + +.profilePic { + --size: 6rem; + max-width: clamp(var(--size), 15vmin, 12rem); + max-height: clamp(var(--size), 15vmin, 12rem); + min-width: clamp(var(--size), 15vmin, 12rem); + min-height: clamp(var(--size), 15vmin, 12rem); + border-radius: 50%; +} +.bioAndConnections h3 { + font-family: var(--extra-light); + font-size: clamp(1rem, 2.2vmin, 2rem); + color: var(--dark-color); + letter-spacing: 1px; +} +.bioAndConnections p { + font-family: var(--extra-light); + font-size: clamp(0.8rem, 2vmin, 1.5rem); + color: var(--light-color); +} +/* styling the profile navigation */ +.profileNav-items { + display: flex; + justify-content: center; + align-items: center; + flex-wrap: nowrap; + flex-direction: row; + background-color: var(--secondary-body-color); + gap: clamp(4rem, 25vmin, 8rem); + margin-top: 1rem; + width: 35%; + margin-inline: auto; + padding: 0.8rem; + border-radius: 10px; +} +.profileNav-items .navigation-active { + position: relative; + color: var(--primary-color); +} + +.profileNav-items .navigation-active::after { + content: ""; + position: absolute; + bottom: 0; + left: 0; + width: 0%; + height: 2px; + background-color: var(--primary-color); + animation: border-animation 3s ease-in-out infinite; +} + +@keyframes border-animation { + 0% { + width: 2%; + } + 50% { + width: 100%; + } + 100% { + width: 2%; + } +} + + + + + +@media screen and (max-width: 1400px) { + .profileCard { + padding: 1.6rem 0.5rem 1rem 0.5rem; + justify-content: center; + align-items: center; + width: 100%; + } + .profileDetails { + display: none; + } + .profileNav-items { + border-radius: 0px 0px 10px 10px; + padding: 0.8rem; + width: 100%; + } +} +@media screen and (min-width: 769px) and (max-width: 1400px) { + .profileCard { + padding: 7rem 0rem 2rem 0rem; + + width: 60%; + } + .profileNav-items { + width: 60%; + padding: 0.8rem; + } +} diff --git a/frontend/public/fonts/Mukta-Bold.woff2 b/frontend/public/fonts/Mukta-Bold.woff2 new file mode 100644 index 0000000..2edc30d Binary files /dev/null and b/frontend/public/fonts/Mukta-Bold.woff2 differ diff --git a/frontend/public/fonts/Mukta-ExtraBold.woff2 b/frontend/public/fonts/Mukta-ExtraBold.woff2 new file mode 100644 index 0000000..0e585da Binary files /dev/null and b/frontend/public/fonts/Mukta-ExtraBold.woff2 differ diff --git a/frontend/public/fonts/Mukta-ExtraLight.woff2 b/frontend/public/fonts/Mukta-ExtraLight.woff2 new file mode 100644 index 0000000..82729e9 Binary files /dev/null and b/frontend/public/fonts/Mukta-ExtraLight.woff2 differ diff --git a/frontend/public/fonts/Mukta-Light.woff2 b/frontend/public/fonts/Mukta-Light.woff2 new file mode 100644 index 0000000..8c4218b Binary files /dev/null and b/frontend/public/fonts/Mukta-Light.woff2 differ diff --git a/frontend/public/fonts/Mukta-Medium.woff2 b/frontend/public/fonts/Mukta-Medium.woff2 new file mode 100644 index 0000000..db00331 Binary files /dev/null and b/frontend/public/fonts/Mukta-Medium.woff2 differ diff --git a/frontend/public/fonts/Mukta-Regular.woff2 b/frontend/public/fonts/Mukta-Regular.woff2 new file mode 100644 index 0000000..9a7cafe Binary files /dev/null and b/frontend/public/fonts/Mukta-Regular.woff2 differ diff --git a/frontend/public/fonts/Mukta-SemiBold.woff2 b/frontend/public/fonts/Mukta-SemiBold.woff2 new file mode 100644 index 0000000..496a6d9 Binary files /dev/null and b/frontend/public/fonts/Mukta-SemiBold.woff2 differ diff --git a/frontend/public/images/404.gif b/frontend/public/images/404.gif new file mode 100644 index 0000000..b4eb84b Binary files /dev/null and b/frontend/public/images/404.gif differ diff --git a/frontend/public/images/Maillogo.png b/frontend/public/images/Maillogo.png new file mode 100644 index 0000000..c07fbfd Binary files /dev/null and b/frontend/public/images/Maillogo.png differ diff --git a/frontend/public/images/Pass.png b/frontend/public/images/Pass.png new file mode 100644 index 0000000..779214c Binary files /dev/null and b/frontend/public/images/Pass.png differ diff --git a/frontend/public/images/User.png b/frontend/public/images/User.png new file mode 100644 index 0000000..3edf7d5 Binary files /dev/null and b/frontend/public/images/User.png differ diff --git a/frontend/public/images/closedeye.png b/frontend/public/images/closedeye.png new file mode 100644 index 0000000..4007913 Binary files /dev/null and b/frontend/public/images/closedeye.png differ diff --git a/frontend/public/images/dance.gif b/frontend/public/images/dance.gif new file mode 100644 index 0000000..ef0077f Binary files /dev/null and b/frontend/public/images/dance.gif differ diff --git a/frontend/public/images/google.png b/frontend/public/images/google.png new file mode 100644 index 0000000..87c5fb5 Binary files /dev/null and b/frontend/public/images/google.png differ diff --git a/frontend/public/images/happy.gif b/frontend/public/images/happy.gif new file mode 100644 index 0000000..78c9fdd Binary files /dev/null and b/frontend/public/images/happy.gif differ diff --git a/frontend/public/images/knot.png b/frontend/public/images/knot.png new file mode 100644 index 0000000..4a5b1f1 Binary files /dev/null and b/frontend/public/images/knot.png differ diff --git a/frontend/public/images/logout.svg b/frontend/public/images/logout.svg new file mode 100644 index 0000000..66212bb --- /dev/null +++ b/frontend/public/images/logout.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/public/images/openeye.png b/frontend/public/images/openeye.png new file mode 100644 index 0000000..1c25418 Binary files /dev/null and b/frontend/public/images/openeye.png differ diff --git a/frontend/public/images/sad.gif b/frontend/public/images/sad.gif new file mode 100644 index 0000000..5ede3ef Binary files /dev/null and b/frontend/public/images/sad.gif differ diff --git a/frontend/public/images/sea-knot.png b/frontend/public/images/sea-knot.png new file mode 100644 index 0000000..74f60da Binary files /dev/null and b/frontend/public/images/sea-knot.png differ diff --git a/frontend/public/images/star.gif b/frontend/public/images/star.gif new file mode 100644 index 0000000..7ecf15c Binary files /dev/null and b/frontend/public/images/star.gif differ diff --git a/frontend/public/js/addPostHandler.js b/frontend/public/js/addPostHandler.js new file mode 100644 index 0000000..346e332 --- /dev/null +++ b/frontend/public/js/addPostHandler.js @@ -0,0 +1,90 @@ +import { getImageUrl } from "../utils/imageUrl.js"; + +// Listening to image field change + +const imageFieldChanegd = document.querySelector("#input-file"); +imageFieldChanegd && + imageFieldChanegd.addEventListener("change", (e) => { + const file = e.target.files[0]; + const reader = new FileReader(); + reader.readAsDataURL(file); + reader.onload = () => { + const image = document.querySelector(".image-preview"); + image.src = reader.result; + image.alt = file.name; + }; + reader.onerror = (error) => { + console.log(error); + }; + }); + +// Submit button event listener +const submitBtn = document.querySelector(".submit-post"); +submitBtn && + submitBtn.addEventListener("submit", async (e) => { + e.preventDefault(); + const postBtn = document.querySelector("#post-submit-btn"); + let url = ""; + if (location.href.includes("/post/add")) { + url = location.href; + } else { + url = location.href + "post/add"; + } + const errorSpan = document.querySelector("#error-span"); + + const content = document.querySelector("#content").value || ""; + if (content.length > 500) { + errorSpan.style.textAlign = "center"; + errorSpan.innerHTML = + "Sorry! but bloggin is not allowed here
Keep your content short and sweet 🤞"; + return; + } + const isImage = imageFieldChanegd.files.length <= 0 ? false : true; + if (content.length <= 0 && !isImage) { + let randomNumber = Math.floor(Math.random() * 2); + errorSpan.style.textAlign = "center"; + errorSpan.innerHTML = + randomNumber === 0 + ? `Please add content
"Something" is better than "Nothing" 🤞` + : `Please add content
We need to hear something from you! 🤞`; + return; + } else { + errorSpan.innerHTML = ""; + postBtn.disabled = true; + postBtn.value = "Posting..."; + } + + const postInfo = { + content, + isImage, + imgUrl: "", + imgUpload: null, + uploadedImgId: null, + }; + try { + if (isImage) { + const imageFile = imageFieldChanegd.files[0]; + const { url, publicId } = await getImageUrl(imageFile); + postInfo.imgUrl = url; + postInfo.uploadedImgId = publicId; + } + const response = await fetch(url, { + method: "POST", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + }, + body: JSON.stringify(postInfo), + }); + if (response) { + const data = await response.json(); + if (data.success) { + window.location.href = "/"; + } else { + window.location.reload(); + } + } + } catch (err) { + console.log(err); + } + }); diff --git a/frontend/public/js/deleteCommentHandler.js b/frontend/public/js/deleteCommentHandler.js new file mode 100644 index 0000000..9632871 --- /dev/null +++ b/frontend/public/js/deleteCommentHandler.js @@ -0,0 +1,21 @@ +import { globalEvent } from '../utils/eventListener.js'; + +const deletePost = async (e) => { + e.preventDefault(); + const commentId = e.target.parentElement.getAttribute('data-comment-id'); + const postId = e.target.parentElement.getAttribute('data-post-id'); + const post = await fetch(`/post/${postId}/comment`, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + commentId: commentId + }) + }); + if (post.redirected === true) { + window.location = post.url; + } +}; + +globalEvent('click', '.comment-delete-icon', deletePost); diff --git a/frontend/public/js/editProfileHandler.js b/frontend/public/js/editProfileHandler.js new file mode 100644 index 0000000..97def90 --- /dev/null +++ b/frontend/public/js/editProfileHandler.js @@ -0,0 +1,61 @@ +import { getImageUrl } from "../utils/imageUrl.js"; + +const imageFieldChanged = document.querySelector("#update-profile-pic"); +imageFieldChanged && imageFieldChanged.addEventListener("change", (e) => { + const file = e.target.files[0]; + const reader = new FileReader(); + reader.readAsDataURL(file); + reader.onload = () => { + const image = document.querySelector("#profilePicPreview"); + image.src = reader.result; + image.alt = file.name; + }; + reader.onerror = (error) => { + console.log(error); + }; +}); + +const editProfileSubmit = document.querySelector(".edit-profile-form"); +editProfileSubmit && editProfileSubmit.addEventListener("submit", async (e) => { + e.preventDefault(); + const updateBtn = document.querySelector("#updateProfileBtn"); + updateBtn.style.pointerEvents = "none"; + updateBtn.value = "Updating..."; + const formData = new FormData(editProfileSubmit); + const firstname = formData.get("firstname"); + const lastname = formData.get("lastname"); + const username = formData.get("username"); + const bio = formData.get("bio"); + const dob = formData.get("dob"); + let profilePic = formData.get("profilePic"); + if (profilePic.name !== "") { + profilePic = await getImageUrl(profilePic); + } else { + profilePic = { url: "", publicId: "" }; + } + const body = { + firstname, + lastname, + username, + profilePic: profilePic.url, + profilePicId: profilePic.publicId, + bio, + dob, + }; + try{ + const response = await fetch("/profile/update", { + method: "POST", + body: JSON.stringify(body), + headers: { + "Content-Type": "application/json", + "accept-patch": "application/json", + }, + }); + if (response) { + window.location.reload(); + } + } catch (err) { + console.log(err); + } + +}); \ No newline at end of file diff --git a/frontend/public/js/login.js b/frontend/public/js/login.js new file mode 100644 index 0000000..d53f211 --- /dev/null +++ b/frontend/public/js/login.js @@ -0,0 +1,15 @@ + +let eyeicon = document.querySelector("#eyeicon"); +let password = document.querySelector("#password"); + +eyeicon.onclick=function(){ + if(password.type == "password"){ + password.type = "text"; + eyeicon.src=("/images/openeye.png"); + + }else{ + password.type = "password"; + eyeicon.src=("/images/closedeye.png"); + + } +} diff --git a/frontend/public/js/pollsHandler.js b/frontend/public/js/pollsHandler.js new file mode 100644 index 0000000..26320b9 --- /dev/null +++ b/frontend/public/js/pollsHandler.js @@ -0,0 +1,52 @@ +import { globalEvent } from "../utils/eventListener.js"; + +async function voteCount(e) { + e.preventDefault(); + + e.target.parentElement.classList.add("voted"); + Array.from(e.target.parentElement.parentElement.children).forEach((child) => { + let totalVote = Number(child.parentElement.getAttribute("data-total-votes")); + let currentVote = Number(child.children[2].innerHTML); + child.parentElement.classList.add("pointer-events"); + child.children[0].classList.remove("hide"); + child.children[2].classList.remove("hide"); + if(child.classList.contains("voted")){ + child.children[0].style.width =`${((currentVote+1) * 100) / (totalVote +1)}%`; + } else{ + + child.children[0].style.width =`${(currentVote * 100) / (totalVote+1)}%`; + } + }) + + e.target.parentElement.children[2].innerText = Number(e.target.parentElement.children[2].innerText) + 1; + + const clickedOptionId = e.target.parentElement.getAttribute("data-option-id"); + const pollId = e.target.parentElement.parentElement.getAttribute("data-poll-id"); + + try { + const response = await fetch("/polls/vote", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ clickedOptionId, pollId }), + + }); + } + catch (err) { + console.log(err) + } +} + +let allOptions = document.querySelectorAll(".option"); +allOptions.forEach(function (option) { + if (option.classList.contains("voted")) { + option.parentElement.classList.add("pointer-events"); + Array.from(option.parentElement.children).forEach((child) => { + child.children[0].classList.remove("hide"); + child.children[2].classList.remove("hide"); + }) + } +}); + +globalEvent("click", ".option", voteCount); diff --git a/frontend/public/js/postHandler.js b/frontend/public/js/postHandler.js new file mode 100644 index 0000000..7882f74 --- /dev/null +++ b/frontend/public/js/postHandler.js @@ -0,0 +1,86 @@ +import { likePost, dislikePost,sharePost } from "../utils/postReaction.js"; +import { globalEvent } from "../utils/eventListener.js"; +async function likePostEvent(e) { + if (Array.from(e.target.parentElement.classList).includes("liked")) { + return; + } + const postId = + e.target.parentElement.parentElement.getAttribute("data-post-id"); + const currentLike = + e.target.parentElement.parentElement.getAttribute("data-upvotes"); + const currentDisLike = + e.target.parentElement.parentElement.getAttribute("data-downvotes"); + // const userId = + // e.target.parentElement.parentElement.getAttribute("data-user-id"); + if (e.target.classList.length > 0) { + e.target.classList.toggle("bxs-upvote"); + let upvoteCount = e.target.nextElementSibling + let downvoteCount = e.target.parentElement.nextElementSibling.firstElementChild.nextElementSibling + let downCount = Number(downvoteCount.innerText); + let count = Number(upvoteCount.innerText); + upvoteCount.innerText = String(count + 1); + if(Array.from(e.target.parentElement.nextElementSibling.classList).includes("disliked") && downCount > 0){ + downvoteCount.innerText = String(downCount - 1); + } + } else { + return + } + e.target.parentElement.classList.add("liked"); + e.target.parentElement.nextElementSibling.firstElementChild.classList.remove( + "bxs-downvote" + ); + e.target.parentElement.nextElementSibling.classList.remove("disliked"); + e.target.parentElement.nextElementSibling.firstElementChild.classList.add( + "bx-downvote" + ); + await likePost(e, postId, currentLike, currentDisLike); +} + +async function dislikePostEvent(e) { + if (Array.from(e.target.parentElement.classList).includes("disliked")) { + console.log("already disliked"); + return; + } + const postId = + e.target.parentElement.parentElement.getAttribute("data-post-id"); + const currentLike = + e.target.parentElement.parentElement.getAttribute("data-upvotes"); + const currentDisLike = + e.target.parentElement.parentElement.getAttribute("data-downvotes"); + // const userId = + // e.target.parentElement.parentElement.getAttribute("data-user-id"); + if (e.target.classList.length > 0) { + e.target.classList.toggle("bxs-downvote"); + let upvoteCount = e.target.parentElement.previousElementSibling.firstElementChild.nextElementSibling + let downvoteCount = e.target.nextElementSibling + let downCount = Number(downvoteCount.innerText); + let count = Number(upvoteCount.innerText); + downvoteCount.innerText = String(downCount + 1); + if(Array.from(e.target.parentElement.previousElementSibling.classList).includes("liked") && count > 0){ + upvoteCount.innerText = String(count - 1); + } + } else { + return + } + e.target.parentElement.classList.add("disliked"); + e.target.parentElement.previousElementSibling.firstElementChild.classList.remove( + "bxs-upvote" + ); + e.target.parentElement.previousElementSibling.classList.remove("liked"); + e.target.parentElement.previousElementSibling.firstElementChild.classList.add( + "bx-upvote" + ); + await dislikePost(e, postId, currentLike, currentDisLike); +} + +async function sharePostEvent(e) { + const postId = + e.target.parentElement.parentElement.getAttribute("data-post-id"); + const currentShare = + e.target.parentElement.parentElement.getAttribute("data-shares"); + await sharePost(e, postId, currentShare); +} + +globalEvent("click", ".like", likePostEvent); +globalEvent("click", ".dislike", dislikePostEvent); +globalEvent("click", ".share", sharePostEvent); diff --git a/frontend/public/js/profileNavigatiionHandler.js b/frontend/public/js/profileNavigatiionHandler.js new file mode 100644 index 0000000..6dd7b77 --- /dev/null +++ b/frontend/public/js/profileNavigatiionHandler.js @@ -0,0 +1,3 @@ +const postIcon = document.querySelector('.own-posts'); +const activityIcon = document.querySelector('.own-activities'); +const editProfileIcon = document.querySelector('.own-profile-edit'); diff --git a/frontend/public/js/script.js b/frontend/public/js/script.js new file mode 100644 index 0000000..d5a81aa --- /dev/null +++ b/frontend/public/js/script.js @@ -0,0 +1,17 @@ +let togglewithCredentials = document.querySelector("#credentials") +togglewithCredentials && togglewithCredentials.addEventListener("click", function (e) { + e.preventDefault() + let form = document.querySelector(".hiddenform") + form.classList.toggle("hidden") + const formClasses = form.classList; + + Array.from(formClasses).length == 2 ? togglewithCredentials.innerText = "Or, Signup with cedentials." : togglewithCredentials.innerText = "Close Form" + +}) + +const challengeDateElem = document.querySelector("#date") + +// set the max date and min date of 7 days + +challengeDateElem && challengeDateElem.setAttribute("min", new Date().toISOString().split("T")[0]) + diff --git a/frontend/public/manifest.json b/frontend/public/manifest.json new file mode 100644 index 0000000..3f12f2f --- /dev/null +++ b/frontend/public/manifest.json @@ -0,0 +1,28 @@ +{ + "name": "Knot", + "short_name": "Knot", + "description": "The sophisticated social network", + "icons": [ + { + "src": "./images/knot.png", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/png", + "purpose": "any maskable" + }, + { + "src":"./images/sea-knot.png", + "sizes": "512x512 256x256 192x192", + "type": "image/png", + "purpose": "any maskable" + } + ], + "start_url": "/", + "display": "standalone", + "theme_color": "#BCEAD5", + "background_color": "#16213E" +} + + + + + \ No newline at end of file diff --git a/frontend/public/robots.txt b/frontend/public/robots.txt new file mode 100644 index 0000000..5a9d8d6 --- /dev/null +++ b/frontend/public/robots.txt @@ -0,0 +1,3 @@ +User-agent: * +Disallow: /admin +Disallow: /private diff --git a/frontend/public/utils/eventListener.js b/frontend/public/utils/eventListener.js new file mode 100644 index 0000000..caa3dfe --- /dev/null +++ b/frontend/public/utils/eventListener.js @@ -0,0 +1,8 @@ +const globalEvent = (eventType, selector, callback) => { + document.addEventListener(eventType, (e) => { + if (e.target.parentElement.matches(selector)) callback(e); + }); +}; + + +export {globalEvent}; \ No newline at end of file diff --git a/frontend/public/utils/imageUrl.js b/frontend/public/utils/imageUrl.js new file mode 100644 index 0000000..aa1ea87 --- /dev/null +++ b/frontend/public/utils/imageUrl.js @@ -0,0 +1,85 @@ +const dataURLtoFile = (dataurl, filename) => { + const arr = dataurl.split(","); + const mime = arr[0].match(/:(.*?);/)[1]; + const bstr = atob(arr[1]); + let n = bstr.length; + const u8arr = new Uint8Array(n); + while (n--) { + u8arr[n] = bstr.charCodeAt(n); + } + return new File([u8arr], filename, { type: mime }); +}; + + +const compressImage = async (file) => { + // check the file type + if ((file.type == "image/jpeg") || (file.type == "image/png") || (file.type == "image/jpg")) { + const image = new Image(); + const canvas = document.createElement("canvas"); + const ctx = canvas.getContext("2d"); + const reader = new FileReader(); + reader.readAsDataURL(file); + return new Promise((resolve, reject) => { + reader.onload = (e) => { + image.src = e.target.result; + image.onload = () => { + const width = image.width; + const height = image.height; + canvas.width = width; + canvas.height = height; + ctx.drawImage(image, 0, 0, width, height); + const dataUrl = canvas.toDataURL("image/jpeg", 0.5); + const compressedFile = dataURLtoFile(dataUrl, file.name); + resolve(compressedFile); + }; + } + reader.onerror = (err) => { + reject(err); + }; + }); + } else { + return; + } +}; + + + + +const getImageUrl = async (imageFile) => { + + if (imageFile === "") return; + const compressedImage = await compressImage(imageFile); + if (!compressedImage) { + return { url: null, publicId: null }; + } + const API_KEY = "196589649614855"; + const CLOUD_NAME = "dj8uufxkn"; + const cloudinaryUrl = `https://api.cloudinary.com/v1_1/${CLOUD_NAME}/image/upload`; + try { + const sign = await fetch("/api/v1/get-signature", { + method: "POST", + }); + + const signJson = await sign.json(); + const formData = new FormData(); + // compress the image using canvas + + formData.append("file", compressedImage); + formData.append("api_key", API_KEY); + formData.append("signature", signJson.signature); + formData.append("timestamp", signJson.timestamp); + const response = await fetch(cloudinaryUrl, { + method: "POST", + body: formData, + }); + const urlResponse = await response.json(); + return { + url: urlResponse.secure_url, + publicId: urlResponse.public_id, + }; + } catch (err) { + return { url: null, publicId: null }; + } +}; + +export { getImageUrl }; \ No newline at end of file diff --git a/frontend/public/utils/postReaction.js b/frontend/public/utils/postReaction.js new file mode 100644 index 0000000..d3e92e3 --- /dev/null +++ b/frontend/public/utils/postReaction.js @@ -0,0 +1,63 @@ +async function likePost(event, postId, currentLike, currentDisLike) { + event.preventDefault(); + try { + await fetch(`/api/v1/post/upvote`, { + method: "POST", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + }, + body: JSON.stringify({ + postId: postId, + upvotes: currentLike, + downvotes: currentDisLike + }), + }); + } catch (err) { + return; + } +} + +async function dislikePost(event, postId, currentLike, currentDisLike) { + event.preventDefault(); + try { + await fetch(`/api/v1/post/downvote`, { + method: "POST", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + }, + body: JSON.stringify({ + postId: postId, + upvotes: currentLike, + downvotes: currentDisLike + }), + }); + } catch (err) { + return; + } +} + +async function sharePost(event, postId, currentShare) { + event.preventDefault(); + try { + const res = await fetch(`/api/v1/post/share`, { + method: "POST", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + }, + body: JSON.stringify({ + postId: postId, + shares: currentShare, + }), + }) + if(res.redirected === true){ + window.location = res.url; + } + } catch (err) { + return; + } +} + +export { likePost, dislikePost, sharePost }; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..98f1d4e --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5912 @@ +{ + "name": "knot", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "knot", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "cloudinary": "^1.34.0", + "connect-flash": "^0.1.1", + "dotenv": "^16.0.3", + "ejs": "^3.1.8", + "express": "^4.18.2", + "express-session": "^1.17.3", + "mongoose": "^6.9.1", + "mongoose-findorcreate": "^3.0.0", + "passport": "^0.6.0", + "passport-google-oauth20": "^2.0.0", + "passport-local-mongoose": "^7.1.2" + }, + "devDependencies": { + "nodemon": "^2.0.20" + } + }, + "node_modules/@aws-crypto/ie11-detection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", + "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", + "optional": true, + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", + "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "optional": true, + "dependencies": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/sha256-js": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", + "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "optional": true, + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", + "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "optional": true, + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + }, + "node_modules/@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/util/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + }, + "node_modules/@aws-sdk/abort-controller": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.267.0.tgz", + "integrity": "sha512-5R7OSnHFV/f+qQpMf1RuSQoVdXroK94Vl6naWjMOAhMyofHykVhEok9hmFPac86AVx8rVX/vuA7u9GKI6/EE7g==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.267.0.tgz", + "integrity": "sha512-jEE5aw7wp7VhiaU0vCbNQbEIhiaNZnBhRj+vJVCd2HQBI9IVLVXAoyExWxLruAXKEO+A1w1df+fwZAOo0M7aQQ==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.267.0", + "@aws-sdk/config-resolver": "3.267.0", + "@aws-sdk/credential-provider-node": "3.267.0", + "@aws-sdk/fetch-http-handler": "3.267.0", + "@aws-sdk/hash-node": "3.267.0", + "@aws-sdk/invalid-dependency": "3.267.0", + "@aws-sdk/middleware-content-length": "3.267.0", + "@aws-sdk/middleware-endpoint": "3.267.0", + "@aws-sdk/middleware-host-header": "3.267.0", + "@aws-sdk/middleware-logger": "3.267.0", + "@aws-sdk/middleware-recursion-detection": "3.267.0", + "@aws-sdk/middleware-retry": "3.267.0", + "@aws-sdk/middleware-serde": "3.267.0", + "@aws-sdk/middleware-signing": "3.267.0", + "@aws-sdk/middleware-stack": "3.267.0", + "@aws-sdk/middleware-user-agent": "3.267.0", + "@aws-sdk/node-config-provider": "3.267.0", + "@aws-sdk/node-http-handler": "3.267.0", + "@aws-sdk/protocol-http": "3.267.0", + "@aws-sdk/smithy-client": "3.267.0", + "@aws-sdk/types": "3.267.0", + "@aws-sdk/url-parser": "3.267.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.267.0", + "@aws-sdk/util-defaults-mode-node": "3.267.0", + "@aws-sdk/util-endpoints": "3.267.0", + "@aws-sdk/util-retry": "3.267.0", + "@aws-sdk/util-user-agent-browser": "3.267.0", + "@aws-sdk/util-user-agent-node": "3.267.0", + "@aws-sdk/util-utf8": "3.254.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.267.0.tgz", + "integrity": "sha512-/475/mT0gYhimpCdK4iZW+eX0DT6mkTgVk5P9ARpQGzEblFM6i2pE7GQnlGeLyHVOtA0cNAyGrWUuj2pyigUaA==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.267.0", + "@aws-sdk/fetch-http-handler": "3.267.0", + "@aws-sdk/hash-node": "3.267.0", + "@aws-sdk/invalid-dependency": "3.267.0", + "@aws-sdk/middleware-content-length": "3.267.0", + "@aws-sdk/middleware-endpoint": "3.267.0", + "@aws-sdk/middleware-host-header": "3.267.0", + "@aws-sdk/middleware-logger": "3.267.0", + "@aws-sdk/middleware-recursion-detection": "3.267.0", + "@aws-sdk/middleware-retry": "3.267.0", + "@aws-sdk/middleware-serde": "3.267.0", + "@aws-sdk/middleware-stack": "3.267.0", + "@aws-sdk/middleware-user-agent": "3.267.0", + "@aws-sdk/node-config-provider": "3.267.0", + "@aws-sdk/node-http-handler": "3.267.0", + "@aws-sdk/protocol-http": "3.267.0", + "@aws-sdk/smithy-client": "3.267.0", + "@aws-sdk/types": "3.267.0", + "@aws-sdk/url-parser": "3.267.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.267.0", + "@aws-sdk/util-defaults-mode-node": "3.267.0", + "@aws-sdk/util-endpoints": "3.267.0", + "@aws-sdk/util-retry": "3.267.0", + "@aws-sdk/util-user-agent-browser": "3.267.0", + "@aws-sdk/util-user-agent-node": "3.267.0", + "@aws-sdk/util-utf8": "3.254.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.267.0.tgz", + "integrity": "sha512-Jdq0v0mJSJbG/CKLfHC1L0cjCot48Y6lLMQV1lfkYE65xD0ZSs8Gl7P/T391ZH7cLO6ifVoPdsYnwzhi1ZPXSQ==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.267.0", + "@aws-sdk/fetch-http-handler": "3.267.0", + "@aws-sdk/hash-node": "3.267.0", + "@aws-sdk/invalid-dependency": "3.267.0", + "@aws-sdk/middleware-content-length": "3.267.0", + "@aws-sdk/middleware-endpoint": "3.267.0", + "@aws-sdk/middleware-host-header": "3.267.0", + "@aws-sdk/middleware-logger": "3.267.0", + "@aws-sdk/middleware-recursion-detection": "3.267.0", + "@aws-sdk/middleware-retry": "3.267.0", + "@aws-sdk/middleware-serde": "3.267.0", + "@aws-sdk/middleware-stack": "3.267.0", + "@aws-sdk/middleware-user-agent": "3.267.0", + "@aws-sdk/node-config-provider": "3.267.0", + "@aws-sdk/node-http-handler": "3.267.0", + "@aws-sdk/protocol-http": "3.267.0", + "@aws-sdk/smithy-client": "3.267.0", + "@aws-sdk/types": "3.267.0", + "@aws-sdk/url-parser": "3.267.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.267.0", + "@aws-sdk/util-defaults-mode-node": "3.267.0", + "@aws-sdk/util-endpoints": "3.267.0", + "@aws-sdk/util-retry": "3.267.0", + "@aws-sdk/util-user-agent-browser": "3.267.0", + "@aws-sdk/util-user-agent-node": "3.267.0", + "@aws-sdk/util-utf8": "3.254.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.267.0.tgz", + "integrity": "sha512-bJ+SwJZAP3DuDUgToDV89HsB80IhSfB1rhzLG9csqs6h7uMLO8H1/fymElYKT4VMMAA+rpWJ3pznyGiCK7w28A==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.267.0", + "@aws-sdk/credential-provider-node": "3.267.0", + "@aws-sdk/fetch-http-handler": "3.267.0", + "@aws-sdk/hash-node": "3.267.0", + "@aws-sdk/invalid-dependency": "3.267.0", + "@aws-sdk/middleware-content-length": "3.267.0", + "@aws-sdk/middleware-endpoint": "3.267.0", + "@aws-sdk/middleware-host-header": "3.267.0", + "@aws-sdk/middleware-logger": "3.267.0", + "@aws-sdk/middleware-recursion-detection": "3.267.0", + "@aws-sdk/middleware-retry": "3.267.0", + "@aws-sdk/middleware-sdk-sts": "3.267.0", + "@aws-sdk/middleware-serde": "3.267.0", + "@aws-sdk/middleware-signing": "3.267.0", + "@aws-sdk/middleware-stack": "3.267.0", + "@aws-sdk/middleware-user-agent": "3.267.0", + "@aws-sdk/node-config-provider": "3.267.0", + "@aws-sdk/node-http-handler": "3.267.0", + "@aws-sdk/protocol-http": "3.267.0", + "@aws-sdk/smithy-client": "3.267.0", + "@aws-sdk/types": "3.267.0", + "@aws-sdk/url-parser": "3.267.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.267.0", + "@aws-sdk/util-defaults-mode-node": "3.267.0", + "@aws-sdk/util-endpoints": "3.267.0", + "@aws-sdk/util-retry": "3.267.0", + "@aws-sdk/util-user-agent-browser": "3.267.0", + "@aws-sdk/util-user-agent-node": "3.267.0", + "@aws-sdk/util-utf8": "3.254.0", + "fast-xml-parser": "4.0.11", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/config-resolver": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.267.0.tgz", + "integrity": "sha512-UMvJY548xOkamU9ZuZk336VX9r3035CAbttagiPJ/FXy9S8jcQ7N722PAovtxs69nNBQf56cmWsnOHphLCGG9w==", + "optional": true, + "dependencies": { + "@aws-sdk/signature-v4": "3.267.0", + "@aws-sdk/types": "3.267.0", + "@aws-sdk/util-config-provider": "3.208.0", + "@aws-sdk/util-middleware": "3.267.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.267.0.tgz", + "integrity": "sha512-H97VsbiTcb4tbY/LQMZNglJIHt7CHso7RtGgctmdsEA7Rha79fV/egF0Vqo2OQHDgEEpgQDWCeHbXO1P5ibR/A==", + "optional": true, + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.267.0", + "@aws-sdk/property-provider": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.267.0.tgz", + "integrity": "sha512-oiem2UtaFe4CQHscUCImJjPhYWd4iF8fqXhlq6BqHs1wsO6A0vnIUGh+Srut/2q7Xeegl/SRU34HK0hh8JCbxg==", + "optional": true, + "dependencies": { + "@aws-sdk/property-provider": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-imds": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.267.0.tgz", + "integrity": "sha512-Afd5+LdJ9QyeI5L4iyVmI4MLV+0JBtRLmRy0LdinwJaP0DyKyv9+uaIaorKfWihQpe8hwjEfQWTlTz2A3JMJtw==", + "optional": true, + "dependencies": { + "@aws-sdk/node-config-provider": "3.267.0", + "@aws-sdk/property-provider": "3.267.0", + "@aws-sdk/types": "3.267.0", + "@aws-sdk/url-parser": "3.267.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.267.0.tgz", + "integrity": "sha512-pHHlqZqZXA4cTssTyRmbYtrjxS2BEy2KFYHEEHNUrd82pUHnj70n+lrpVnT5pRhPPDacpNzxq0KZGeNgmETpbw==", + "optional": true, + "dependencies": { + "@aws-sdk/credential-provider-env": "3.267.0", + "@aws-sdk/credential-provider-imds": "3.267.0", + "@aws-sdk/credential-provider-process": "3.267.0", + "@aws-sdk/credential-provider-sso": "3.267.0", + "@aws-sdk/credential-provider-web-identity": "3.267.0", + "@aws-sdk/property-provider": "3.267.0", + "@aws-sdk/shared-ini-file-loader": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.267.0.tgz", + "integrity": "sha512-uo8VyZ/L8HBXskYZC65bR1ZUJ5mBn8JarrGHt6vMG2A+uM7AuryTsKn2wdhPfuCUGKuQLXmix5K4VW/wzq11kQ==", + "optional": true, + "dependencies": { + "@aws-sdk/credential-provider-env": "3.267.0", + "@aws-sdk/credential-provider-imds": "3.267.0", + "@aws-sdk/credential-provider-ini": "3.267.0", + "@aws-sdk/credential-provider-process": "3.267.0", + "@aws-sdk/credential-provider-sso": "3.267.0", + "@aws-sdk/credential-provider-web-identity": "3.267.0", + "@aws-sdk/property-provider": "3.267.0", + "@aws-sdk/shared-ini-file-loader": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.267.0.tgz", + "integrity": "sha512-pd1OOB1Mm+QdPv3sPfO+1G8HBaPAAYXxjLcOK5z/myBeZAsLR12Xcaft4RR1XWwXXKEQqq42cbAINWQdyVykqQ==", + "optional": true, + "dependencies": { + "@aws-sdk/property-provider": "3.267.0", + "@aws-sdk/shared-ini-file-loader": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.267.0.tgz", + "integrity": "sha512-JqwxelzeRhVdloNi+VUUXhJdziTtNrrwMuhds9wj4KPfl1S2EIzkRxHSjwDz1wtSyuIPOOo6pPJiaVbwvLpkVg==", + "optional": true, + "dependencies": { + "@aws-sdk/client-sso": "3.267.0", + "@aws-sdk/property-provider": "3.267.0", + "@aws-sdk/shared-ini-file-loader": "3.267.0", + "@aws-sdk/token-providers": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.267.0.tgz", + "integrity": "sha512-za5UsQmj3sYRhd4h5eStj3GCHHfAAjfx2x5FmgQ9ldOp+s0wHEqSL1g+OL9v6o8otf9JnWha+wfUYq3yVGfufQ==", + "optional": true, + "dependencies": { + "@aws-sdk/property-provider": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.267.0.tgz", + "integrity": "sha512-Og70E1eHGcxShMbrmm8lOepF82Hg5Fe7WXv0pnUKFFUxr+pf89bCjxGwktZIDM7ZMMXGIyladeIgTjsJkhpjRQ==", + "optional": true, + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.267.0", + "@aws-sdk/client-sso": "3.267.0", + "@aws-sdk/client-sts": "3.267.0", + "@aws-sdk/credential-provider-cognito-identity": "3.267.0", + "@aws-sdk/credential-provider-env": "3.267.0", + "@aws-sdk/credential-provider-imds": "3.267.0", + "@aws-sdk/credential-provider-ini": "3.267.0", + "@aws-sdk/credential-provider-node": "3.267.0", + "@aws-sdk/credential-provider-process": "3.267.0", + "@aws-sdk/credential-provider-sso": "3.267.0", + "@aws-sdk/credential-provider-web-identity": "3.267.0", + "@aws-sdk/property-provider": "3.267.0", + "@aws-sdk/shared-ini-file-loader": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/fetch-http-handler": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.267.0.tgz", + "integrity": "sha512-u8v8OvWvLVfifmETCAj+DCTot900AsdO1b+N+O8nXiTm2v99rtEoNRJW+no/5vJKNqR+95OAz4NWjFep8nzseg==", + "optional": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.267.0", + "@aws-sdk/querystring-builder": "3.267.0", + "@aws-sdk/types": "3.267.0", + "@aws-sdk/util-base64": "3.208.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/hash-node": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.267.0.tgz", + "integrity": "sha512-N3xeChdJg4V4jh2vrRN521EMJYxjUOo/LpvpisFyQHE/p31AfcOLb05upYFoYLvyeder9RHBIyNsvvnMYYoCsA==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.267.0", + "@aws-sdk/util-buffer-from": "3.208.0", + "@aws-sdk/util-utf8": "3.254.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/invalid-dependency": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.267.0.tgz", + "integrity": "sha512-I95IR/eDLC54+9qrL6uh64nhpLVHwxxbBhhEUZKDACp86eXulO8T/DOwUX31ps4+2lI7tbEhQT7f9WDOO3fN8Q==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/is-array-buffer": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz", + "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-content-length": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.267.0.tgz", + "integrity": "sha512-b6MBIK12iwcATKnWIhsh50xWVMmZOXZFIo9D4io6D+JM6j/U+GZrSWqxhHzb3SjavuwVgA2hwq4mUCh2WJPJKA==", + "optional": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-endpoint": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.267.0.tgz", + "integrity": "sha512-pGICM/qlQVfixtfKZt8zHq54KvLG2MmOAgNWj2MXB7oirPs/3rC9Kz9ITFXJgjlRFyfssgP/feKhs2yZkI8lhw==", + "optional": true, + "dependencies": { + "@aws-sdk/middleware-serde": "3.267.0", + "@aws-sdk/protocol-http": "3.267.0", + "@aws-sdk/signature-v4": "3.267.0", + "@aws-sdk/types": "3.267.0", + "@aws-sdk/url-parser": "3.267.0", + "@aws-sdk/util-config-provider": "3.208.0", + "@aws-sdk/util-middleware": "3.267.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.267.0.tgz", + "integrity": "sha512-D8TfjMeuQXTsB7Ni8liMmNqb3wz+T6t/tYUHtsMo0j++94KAPPj1rhkkTAjR4Rc+IYGCS4YyyCuCXjGB6gkjnA==", + "optional": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.267.0.tgz", + "integrity": "sha512-wnLeZYWbgGCuNmRl0Pmky0cSXBWmMTaQBgq90WfwyM0V8wzcoeaovTWA5/qe8oJzusOgUMFoVia4Ew20k3lu8w==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.267.0.tgz", + "integrity": "sha512-NCBkTLxaW7XtfQoVBqQCaQZqec5XDtEylkw7g0tGjYDcl934fzu3ciH9MsJ34QFe9slYM6g4v+eC9f1w9K/19g==", + "optional": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-retry": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.267.0.tgz", + "integrity": "sha512-MiiNtddZXVhtSAnJFyChwNxnhzMYmv6qWl8qgSjuIOw9SczkHPCoANTfUdRlzG6RfPYhgYtzMGqqnrficJ6mVg==", + "optional": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.267.0", + "@aws-sdk/service-error-classification": "3.267.0", + "@aws-sdk/types": "3.267.0", + "@aws-sdk/util-middleware": "3.267.0", + "@aws-sdk/util-retry": "3.267.0", + "tslib": "^2.3.1", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.267.0.tgz", + "integrity": "sha512-JLDNNvV7Hr0CQrf1vSmflvPbfDFIx5lFf8tY7DZwYWEE920ZzbJTfUsTW9iZHJGeIe8dAQX1tmfYL68+++nvEQ==", + "optional": true, + "dependencies": { + "@aws-sdk/middleware-signing": "3.267.0", + "@aws-sdk/property-provider": "3.267.0", + "@aws-sdk/protocol-http": "3.267.0", + "@aws-sdk/signature-v4": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-serde": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.267.0.tgz", + "integrity": "sha512-9qspxiZs+JShukzKMAameBSubfvtUOGZviu9GT5OfRekY2dBbwWcfchP2WvlwxZ/CcC+GwO1HcPqKDCMGsNoow==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-signing": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.267.0.tgz", + "integrity": "sha512-thkFEBiFW0M/73dIzl7hQmyAONb8zyD2ZYUFyGm7cIM60sRDUKejPHV6Izonll+HbBZgiBdwUi42uu8O+LfFGQ==", + "optional": true, + "dependencies": { + "@aws-sdk/property-provider": "3.267.0", + "@aws-sdk/protocol-http": "3.267.0", + "@aws-sdk/signature-v4": "3.267.0", + "@aws-sdk/types": "3.267.0", + "@aws-sdk/util-middleware": "3.267.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-stack": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.267.0.tgz", + "integrity": "sha512-52uH3JO3ceI15dgzt8gU7lpJf59qbRUQYJ7pAmTMiHtyEawZ39Puv6sGheY3fAffhqd/aQvup6wn18Q1fRIQUA==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.267.0.tgz", + "integrity": "sha512-eaReMnoB1Cx3OY8WDSiUMNDz/EkdAo4w/m3d5CizckKQNmB29gUrgyFs7g7sHTcShQAduZzlsfRPzc6NmKYaWQ==", + "optional": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/node-config-provider": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.267.0.tgz", + "integrity": "sha512-wNX+Cu0x+kllng253j5dvmLm4opDRr7YehJ0rNGAV24X+UPJPluN9HrBFly+z4+bH16TpJEPKx7AayiWZGFE1w==", + "optional": true, + "dependencies": { + "@aws-sdk/property-provider": "3.267.0", + "@aws-sdk/shared-ini-file-loader": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/node-http-handler": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.267.0.tgz", + "integrity": "sha512-wtt3O+e8JEKaLFtmQd74HSZj2TyiApPkwMJ3R50hyboVswt8RcdMWdFbzLnPVpT1AqskG3fMECSKbu8AC/xvBQ==", + "optional": true, + "dependencies": { + "@aws-sdk/abort-controller": "3.267.0", + "@aws-sdk/protocol-http": "3.267.0", + "@aws-sdk/querystring-builder": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/property-provider": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.267.0.tgz", + "integrity": "sha512-/BD1Zar9PCQSV8VZTAWOJmtojAeMIl16ljZX3Kix84r45qqNNxuPST2AhNVN+p97Js4x9kBFCHkdFOpW94wr4Q==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/protocol-http": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.267.0.tgz", + "integrity": "sha512-8HhOZXMCZ0nsJC/FoifX7YrTYGP91tCpSxIHkr7HxQcTdBMI7QakMtIIWK9Qjsy6tUI98aAdEo5PNCbzdpozmQ==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/querystring-builder": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.267.0.tgz", + "integrity": "sha512-SKo8V3oPV1wZy4r4lccH7R2LT0PUK/WGaXkKR30wyrtDjJRWVJDYef9ysOpRP+adCTt3G5XO0SzyPQUW5dXYVA==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.267.0", + "@aws-sdk/util-uri-escape": "3.201.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/querystring-parser": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.267.0.tgz", + "integrity": "sha512-Krq36GXqEfRfzJ9wOzkkzpbb4SWjgSYydTIgK6KtKapme0HPcB24kmmsjsUVuHzKuQMCHHDRWm+b47iBmHGpSQ==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/service-error-classification": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.267.0.tgz", + "integrity": "sha512-fOWg7bcItmJqD/YQbGvN9o03ucoBzvWNTQEB81mLKMSKr1Cf/ms0f8oa94LlImgqjjfjvAqHh6rUBTpSmSEyaw==", + "optional": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/shared-ini-file-loader": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.267.0.tgz", + "integrity": "sha512-Jz9R5hXKSk+aRoBKi4Bnf6T/FZUBYrIibbLnhiNxpQ1FY9mTggJR/rxuIdOE23LtfW+CRqqEYOtAtmC1oYE6tw==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.267.0.tgz", + "integrity": "sha512-Je1e7rum2zvxa3jWfwq4E+fyBdFJmSJAwGtWYz3+/rWipwXFlSAPeSVqtNjHdfzakgabvzLp7aesG4yQTrO2YQ==", + "optional": true, + "dependencies": { + "@aws-sdk/is-array-buffer": "3.201.0", + "@aws-sdk/types": "3.267.0", + "@aws-sdk/util-hex-encoding": "3.201.0", + "@aws-sdk/util-middleware": "3.267.0", + "@aws-sdk/util-uri-escape": "3.201.0", + "@aws-sdk/util-utf8": "3.254.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/smithy-client": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.267.0.tgz", + "integrity": "sha512-WdgXHqKmFQIkAWETO/I5boX9u6QbMLC4X74OVSBaBLhRjqYmvolMFtNrQzvSKGB3FaxAN9Do41amC0mGoeLC8A==", + "optional": true, + "dependencies": { + "@aws-sdk/middleware-stack": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.267.0.tgz", + "integrity": "sha512-CGayGrPl4ONG4RuGbNv+QS4oVuItx4hK2FCbFS7d6V7h53rkDrcFd34NsvbicQ2KVFobE7fKs6ZaripJbJbLHA==", + "optional": true, + "dependencies": { + "@aws-sdk/client-sso-oidc": "3.267.0", + "@aws-sdk/property-provider": "3.267.0", + "@aws-sdk/shared-ini-file-loader": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.267.0.tgz", + "integrity": "sha512-fICTbSeIfXlTHnciQgDt37R0kXoKxgh0a3prnLWVvTcmf7NFujdZmg5YTAZT3KJJ7SuKsIgnI8azBYioVY8BVQ==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/url-parser": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.267.0.tgz", + "integrity": "sha512-xoQ5Fd11moiE82QTL9GGE6e73SFuD0Wi73tA75TAwKuY12OP5vDJ4oBC86A1G2T+OzeHJQmYyqiA5j48CzqB6A==", + "optional": true, + "dependencies": { + "@aws-sdk/querystring-parser": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/util-base64": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz", + "integrity": "sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg==", + "optional": true, + "dependencies": { + "@aws-sdk/util-buffer-from": "3.208.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-body-length-browser": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz", + "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/util-body-length-node": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz", + "integrity": "sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-buffer-from": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz", + "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==", + "optional": true, + "dependencies": { + "@aws-sdk/is-array-buffer": "3.201.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-config-provider": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz", + "integrity": "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-defaults-mode-browser": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.267.0.tgz", + "integrity": "sha512-MgrqpedA58HVR8RpT2A42//5Lb3M0JwEiYlDaA7EvIVsMx1NzO+cng4MDJi03YBAP5hwCVQmO9Sf5Au4dm+m0g==", + "optional": true, + "dependencies": { + "@aws-sdk/property-provider": "3.267.0", + "@aws-sdk/types": "3.267.0", + "bowser": "^2.11.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-defaults-mode-node": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.267.0.tgz", + "integrity": "sha512-JyFk95T77sGM4q386id/mDt9/7HvoQySAygPyv/lj//WEJJIRKiefB277CKKJPT8nRAsO4mIyAT+YO/xGCxkQA==", + "optional": true, + "dependencies": { + "@aws-sdk/config-resolver": "3.267.0", + "@aws-sdk/credential-provider-imds": "3.267.0", + "@aws-sdk/node-config-provider": "3.267.0", + "@aws-sdk/property-provider": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.267.0.tgz", + "integrity": "sha512-c6miY83Eo0erqXY+YiS2sOg3izURqvaWHd9przJzBQea9XRCN4ANT2P8AhoC0BPIORutaaOSoCSp/crHG0XLLg==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-hex-encoding": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz", + "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.208.0.tgz", + "integrity": "sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-middleware": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.267.0.tgz", + "integrity": "sha512-7nvqBZVz3RdwYv6lU958g6sWI2Qt8lzxDVn0uwfnPH+fAiX7Ln1Hen2A0XeW5cL5uYUJy6wNM5cyfTzFZosE0A==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-retry": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.267.0.tgz", + "integrity": "sha512-ZXo1ICG2HgxkIZWlnPteh2R90kwmhRwvbP282CwrrYgTKuMZmW2R/+o6vqhWyPkjoNFN/pno0FxuDA3IYau3Sw==", + "optional": true, + "dependencies": { + "@aws-sdk/service-error-classification": "3.267.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@aws-sdk/util-uri-escape": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz", + "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.267.0.tgz", + "integrity": "sha512-SmI6xInnPPa0gFhCqhtWOUMTxLeRbm7X5HXzeprhK1d8aNNlUVyALAV7K8ovIjnv3a97lIJSekyb78oTuYITCA==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.267.0", + "bowser": "^2.11.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.267.0.tgz", + "integrity": "sha512-nfmyffA1yIypJ30CIMO6Tc16t8dFJzdztzoowjmnfb8/LzTZECERM3GICq0DvZDPfSo+jbuz634VtS2K7tVZjA==", + "optional": true, + "dependencies": { + "@aws-sdk/node-config-provider": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/util-utf8": { + "version": "3.254.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.254.0.tgz", + "integrity": "sha512-14Kso/eIt5/qfIBmhEL9L1IfyUqswjSTqO2mY7KOzUZ9SZbwn3rpxmtkhmATkRjD7XIlLKaxBkI7tU9Zjzj8Kw==", + "optional": true, + "dependencies": { + "@aws-sdk/util-buffer-from": "3.208.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", + "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "optional": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/node": { + "version": "18.13.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz", + "integrity": "sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==" + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" + }, + "node_modules/@types/whatwg-url": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", + "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", + "dependencies": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "optional": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "optional": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "optional": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "optional": true + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "optional": true, + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/base64url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", + "optional": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bson": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz", + "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==", + "dependencies": { + "buffer": "^5.6.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/cloudinary": { + "version": "1.34.0", + "resolved": "https://registry.npmjs.org/cloudinary/-/cloudinary-1.34.0.tgz", + "integrity": "sha512-pY0TF+SVEgBZU1FmJ1z/G+c4qEO46TYz5PvbB07U5s1G7bMmKqkwTWEhvP8gO7cpqk1AewPLr2dLl+j7kI5alQ==", + "dependencies": { + "cloudinary-core": "^2.10.2", + "core-js": "^3.6.5", + "lodash": "^4.17.21", + "q": "^1.5.1" + }, + "engines": { + "node": ">=0.6" + }, + "optionalDependencies": { + "proxy-agent": "^5.0.0" + } + }, + "node_modules/cloudinary-core": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/cloudinary-core/-/cloudinary-core-2.13.0.tgz", + "integrity": "sha512-Nt0Q5I2FtenmJghtC4YZ3MZZbGg1wLm84SsxcuVwZ83OyJqG9CNIGp86CiI6iDv3QobaqBUpOT7vg+HqY5HxEA==", + "peerDependencies": { + "lodash": ">=4.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/connect-flash": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/connect-flash/-/connect-flash-0.1.1.tgz", + "integrity": "sha512-2rcfELQt/ZMP+SM/pG8PyhJRaLKp+6Hk2IUBNkEit09X+vwn3QsAL3ZbYtxUn7NVPzbMTSLRDhqe0B/eh30RYA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/core-js": { + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.28.0.tgz", + "integrity": "sha512-GiZn9D4Z/rSYvTeg1ljAIsEqFm0LaN9gVtwDCrKL80zHtS31p9BAjmTxVqTQDMpwlMolJZOFntUG2uwyj7DAqw==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "optional": true + }, + "node_modules/data-uri-to-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", + "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", + "optional": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "optional": true + }, + "node_modules/degenerator": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.2.tgz", + "integrity": "sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==", + "optional": true, + "dependencies": { + "ast-types": "^0.13.2", + "escodegen": "^1.8.1", + "esprima": "^4.0.0", + "vm2": "^3.9.8" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/ejs": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", + "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "optional": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "optional": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "optional": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express-session": { + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz", + "integrity": "sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==", + "dependencies": { + "cookie": "0.4.2", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.0.2", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.1", + "uid-safe": "~2.1.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/express-session/node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "optional": true + }, + "node_modules/fast-xml-parser": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", + "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==", + "optional": true, + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + }, + "funding": { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + }, + "node_modules/file-uri-to-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", + "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", + "optional": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "optional": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", + "optional": true, + "dependencies": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/generaterr": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/generaterr/-/generaterr-1.5.0.tgz", + "integrity": "sha512-JgcGRv2yUKeboLvvNrq9Bm90P4iJBu7/vd5wSLYqMG5GJ6SxZT46LAAkMfNhQ+EK3jzC+cRBm7P8aUWYyphgcQ==" + }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-uri": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", + "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", + "optional": true, + "dependencies": { + "@tootallnate/once": "1", + "data-uri-to-buffer": "3", + "debug": "4", + "file-uri-to-path": "2", + "fs-extra": "^8.1.0", + "ftp": "^0.3.10" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/get-uri/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/get-uri/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "optional": true + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "optional": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "optional": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/http-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "optional": true + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "optional": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "optional": true + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "optional": true + }, + "node_modules/jake": { + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optional": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/kareem": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", + "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "optional": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mongodb": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.13.0.tgz", + "integrity": "sha512-+taZ/bV8d1pYuHL4U+gSwkhmDrwkWbH1l4aah4YpmpscMwgFBkufIKxgP/G7m87/NUuQzc2Z75ZTI7ZOyqZLbw==", + "dependencies": { + "bson": "^4.7.0", + "mongodb-connection-string-url": "^2.5.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">=12.9.0" + }, + "optionalDependencies": { + "@aws-sdk/credential-providers": "^3.186.0", + "saslprep": "^1.0.3" + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", + "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", + "dependencies": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + } + }, + "node_modules/mongoose": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.9.1.tgz", + "integrity": "sha512-hOz1ZWV0w6WEVLrj89Wpk7PXDYtDDF6k7/NX79lY5iKqeFtZsceBXW8xW59YFNcW5O3cH32hQ8IbDlhgyBsDMA==", + "dependencies": { + "bson": "^4.7.0", + "kareem": "2.5.1", + "mongodb": "4.13.0", + "mpath": "0.9.0", + "mquery": "4.0.3", + "ms": "2.1.3", + "sift": "16.0.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mongoose-findorcreate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mongoose-findorcreate/-/mongoose-findorcreate-3.0.0.tgz", + "integrity": "sha512-kQhDe5XDj6tMv8kq1wjK+hITGIGUl60rj8oGLupF9poNsqIDkAJBXudZKcCdSyBZ7p6DLK2+0jSBthrb26tSYQ==" + }, + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz", + "integrity": "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/mquery/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mquery/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "optional": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/nodemon": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", + "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oauth": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", + "integrity": "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==" + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "optional": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pac-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", + "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", + "optional": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4", + "get-uri": "3", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "5", + "pac-resolver": "^5.0.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "5" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/pac-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/pac-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "optional": true + }, + "node_modules/pac-resolver": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz", + "integrity": "sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==", + "optional": true, + "dependencies": { + "degenerator": "^3.0.2", + "ip": "^1.1.5", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/pac-resolver/node_modules/ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "optional": true + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/passport": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz", + "integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==", + "dependencies": { + "passport-strategy": "1.x.x", + "pause": "0.0.1", + "utils-merge": "^1.0.1" + }, + "engines": { + "node": ">= 0.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" + } + }, + "node_modules/passport-google-oauth20": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/passport-google-oauth20/-/passport-google-oauth20-2.0.0.tgz", + "integrity": "sha512-KSk6IJ15RoxuGq7D1UKK/8qKhNfzbLeLrG3gkLZ7p4A6DBCcv7xpyQwuXtWdpyR0+E0mwkpjY1VfPOhxQrKzdQ==", + "dependencies": { + "passport-oauth2": "1.x.x" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/passport-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", + "integrity": "sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow==", + "dependencies": { + "passport-strategy": "1.x.x" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/passport-local-mongoose": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/passport-local-mongoose/-/passport-local-mongoose-7.1.2.tgz", + "integrity": "sha512-hNLIKi/6IhElr/PhOze8wLDh7T4+ZYhc8GFWYApLgG7FrjI55tuGZELPtsUBqODz77OwlUUf+ngPgHN09zxGLg==", + "dependencies": { + "generaterr": "^1.5.0", + "passport-local": "^1.0.0", + "scmp": "^2.1.0" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/passport-oauth2": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.6.1.tgz", + "integrity": "sha512-ZbV43Hq9d/SBSYQ22GOiglFsjsD1YY/qdiptA+8ej+9C1dL1TVB+mBE5kDH/D4AJo50+2i8f4bx0vg4/yDDZCQ==", + "dependencies": { + "base64url": "3.x.x", + "oauth": "0.9.x", + "passport-strategy": "1.x.x", + "uid2": "0.0.x", + "utils-merge": "1.x.x" + }, + "engines": { + "node": ">= 0.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" + } + }, + "node_modules/passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "optional": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", + "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", + "optional": true, + "dependencies": { + "agent-base": "^6.0.0", + "debug": "4", + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "lru-cache": "^5.1.1", + "pac-proxy-agent": "^5.0.0", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^5.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "optional": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "optional": true + }, + "node_modules/proxy-agent/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "optional": true + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "optional": true + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "optional": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/scmp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/scmp/-/scmp-2.1.0.tgz", + "integrity": "sha512-o/mRQGk9Rcer/jEEw/yw4mwo3EU/NvYvp577/Btqrym9Qy5/MdWGBqipbALgd2lrdWTJ5/gqDusxfnQBxOxT2Q==" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sift": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", + "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" + }, + "node_modules/simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dev": true, + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", + "optional": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "4", + "socks": "^2.3.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/socks-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socks-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "optional": true + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "optional": true + }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "optional": true + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "optional": true + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "optional": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "dependencies": { + "random-bytes": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uid2": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.4.tgz", + "integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==" + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "optional": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vm2": { + "version": "3.9.14", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.14.tgz", + "integrity": "sha512-HgvPHYHeQy8+QhzlFryvSteA4uQLBCOub02mgqdR+0bN/akRZ48TGB1v0aCv7ksyc0HXx16AZtMHKS38alc6TA==", + "optional": true, + "dependencies": { + "acorn": "^8.7.0", + "acorn-walk": "^8.2.0" + }, + "bin": { + "vm2": "bin/vm2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==", + "optional": true, + "engines": { + "node": "*" + } + } + }, + "dependencies": { + "@aws-crypto/ie11-detection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", + "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", + "optional": true, + "requires": { + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + } + } + }, + "@aws-crypto/sha256-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", + "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "optional": true, + "requires": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/sha256-js": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + } + } + }, + "@aws-crypto/sha256-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", + "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "optional": true, + "requires": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + } + } + }, + "@aws-crypto/supports-web-crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", + "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "optional": true, + "requires": { + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + } + } + }, + "@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "optional": true, + "requires": { + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + } + } + }, + "@aws-sdk/abort-controller": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.267.0.tgz", + "integrity": "sha512-5R7OSnHFV/f+qQpMf1RuSQoVdXroK94Vl6naWjMOAhMyofHykVhEok9hmFPac86AVx8rVX/vuA7u9GKI6/EE7g==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/client-cognito-identity": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.267.0.tgz", + "integrity": "sha512-jEE5aw7wp7VhiaU0vCbNQbEIhiaNZnBhRj+vJVCd2HQBI9IVLVXAoyExWxLruAXKEO+A1w1df+fwZAOo0M7aQQ==", + "optional": true, + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.267.0", + "@aws-sdk/config-resolver": "3.267.0", + "@aws-sdk/credential-provider-node": "3.267.0", + "@aws-sdk/fetch-http-handler": "3.267.0", + "@aws-sdk/hash-node": "3.267.0", + "@aws-sdk/invalid-dependency": "3.267.0", + "@aws-sdk/middleware-content-length": "3.267.0", + "@aws-sdk/middleware-endpoint": "3.267.0", + "@aws-sdk/middleware-host-header": "3.267.0", + "@aws-sdk/middleware-logger": "3.267.0", + "@aws-sdk/middleware-recursion-detection": "3.267.0", + "@aws-sdk/middleware-retry": "3.267.0", + "@aws-sdk/middleware-serde": "3.267.0", + "@aws-sdk/middleware-signing": "3.267.0", + "@aws-sdk/middleware-stack": "3.267.0", + "@aws-sdk/middleware-user-agent": "3.267.0", + "@aws-sdk/node-config-provider": "3.267.0", + "@aws-sdk/node-http-handler": "3.267.0", + "@aws-sdk/protocol-http": "3.267.0", + "@aws-sdk/smithy-client": "3.267.0", + "@aws-sdk/types": "3.267.0", + "@aws-sdk/url-parser": "3.267.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.267.0", + "@aws-sdk/util-defaults-mode-node": "3.267.0", + "@aws-sdk/util-endpoints": "3.267.0", + "@aws-sdk/util-retry": "3.267.0", + "@aws-sdk/util-user-agent-browser": "3.267.0", + "@aws-sdk/util-user-agent-node": "3.267.0", + "@aws-sdk/util-utf8": "3.254.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/client-sso": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.267.0.tgz", + "integrity": "sha512-/475/mT0gYhimpCdK4iZW+eX0DT6mkTgVk5P9ARpQGzEblFM6i2pE7GQnlGeLyHVOtA0cNAyGrWUuj2pyigUaA==", + "optional": true, + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.267.0", + "@aws-sdk/fetch-http-handler": "3.267.0", + "@aws-sdk/hash-node": "3.267.0", + "@aws-sdk/invalid-dependency": "3.267.0", + "@aws-sdk/middleware-content-length": "3.267.0", + "@aws-sdk/middleware-endpoint": "3.267.0", + "@aws-sdk/middleware-host-header": "3.267.0", + "@aws-sdk/middleware-logger": "3.267.0", + "@aws-sdk/middleware-recursion-detection": "3.267.0", + "@aws-sdk/middleware-retry": "3.267.0", + "@aws-sdk/middleware-serde": "3.267.0", + "@aws-sdk/middleware-stack": "3.267.0", + "@aws-sdk/middleware-user-agent": "3.267.0", + "@aws-sdk/node-config-provider": "3.267.0", + "@aws-sdk/node-http-handler": "3.267.0", + "@aws-sdk/protocol-http": "3.267.0", + "@aws-sdk/smithy-client": "3.267.0", + "@aws-sdk/types": "3.267.0", + "@aws-sdk/url-parser": "3.267.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.267.0", + "@aws-sdk/util-defaults-mode-node": "3.267.0", + "@aws-sdk/util-endpoints": "3.267.0", + "@aws-sdk/util-retry": "3.267.0", + "@aws-sdk/util-user-agent-browser": "3.267.0", + "@aws-sdk/util-user-agent-node": "3.267.0", + "@aws-sdk/util-utf8": "3.254.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/client-sso-oidc": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.267.0.tgz", + "integrity": "sha512-Jdq0v0mJSJbG/CKLfHC1L0cjCot48Y6lLMQV1lfkYE65xD0ZSs8Gl7P/T391ZH7cLO6ifVoPdsYnwzhi1ZPXSQ==", + "optional": true, + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.267.0", + "@aws-sdk/fetch-http-handler": "3.267.0", + "@aws-sdk/hash-node": "3.267.0", + "@aws-sdk/invalid-dependency": "3.267.0", + "@aws-sdk/middleware-content-length": "3.267.0", + "@aws-sdk/middleware-endpoint": "3.267.0", + "@aws-sdk/middleware-host-header": "3.267.0", + "@aws-sdk/middleware-logger": "3.267.0", + "@aws-sdk/middleware-recursion-detection": "3.267.0", + "@aws-sdk/middleware-retry": "3.267.0", + "@aws-sdk/middleware-serde": "3.267.0", + "@aws-sdk/middleware-stack": "3.267.0", + "@aws-sdk/middleware-user-agent": "3.267.0", + "@aws-sdk/node-config-provider": "3.267.0", + "@aws-sdk/node-http-handler": "3.267.0", + "@aws-sdk/protocol-http": "3.267.0", + "@aws-sdk/smithy-client": "3.267.0", + "@aws-sdk/types": "3.267.0", + "@aws-sdk/url-parser": "3.267.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.267.0", + "@aws-sdk/util-defaults-mode-node": "3.267.0", + "@aws-sdk/util-endpoints": "3.267.0", + "@aws-sdk/util-retry": "3.267.0", + "@aws-sdk/util-user-agent-browser": "3.267.0", + "@aws-sdk/util-user-agent-node": "3.267.0", + "@aws-sdk/util-utf8": "3.254.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/client-sts": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.267.0.tgz", + "integrity": "sha512-bJ+SwJZAP3DuDUgToDV89HsB80IhSfB1rhzLG9csqs6h7uMLO8H1/fymElYKT4VMMAA+rpWJ3pznyGiCK7w28A==", + "optional": true, + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.267.0", + "@aws-sdk/credential-provider-node": "3.267.0", + "@aws-sdk/fetch-http-handler": "3.267.0", + "@aws-sdk/hash-node": "3.267.0", + "@aws-sdk/invalid-dependency": "3.267.0", + "@aws-sdk/middleware-content-length": "3.267.0", + "@aws-sdk/middleware-endpoint": "3.267.0", + "@aws-sdk/middleware-host-header": "3.267.0", + "@aws-sdk/middleware-logger": "3.267.0", + "@aws-sdk/middleware-recursion-detection": "3.267.0", + "@aws-sdk/middleware-retry": "3.267.0", + "@aws-sdk/middleware-sdk-sts": "3.267.0", + "@aws-sdk/middleware-serde": "3.267.0", + "@aws-sdk/middleware-signing": "3.267.0", + "@aws-sdk/middleware-stack": "3.267.0", + "@aws-sdk/middleware-user-agent": "3.267.0", + "@aws-sdk/node-config-provider": "3.267.0", + "@aws-sdk/node-http-handler": "3.267.0", + "@aws-sdk/protocol-http": "3.267.0", + "@aws-sdk/smithy-client": "3.267.0", + "@aws-sdk/types": "3.267.0", + "@aws-sdk/url-parser": "3.267.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.267.0", + "@aws-sdk/util-defaults-mode-node": "3.267.0", + "@aws-sdk/util-endpoints": "3.267.0", + "@aws-sdk/util-retry": "3.267.0", + "@aws-sdk/util-user-agent-browser": "3.267.0", + "@aws-sdk/util-user-agent-node": "3.267.0", + "@aws-sdk/util-utf8": "3.254.0", + "fast-xml-parser": "4.0.11", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/config-resolver": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.267.0.tgz", + "integrity": "sha512-UMvJY548xOkamU9ZuZk336VX9r3035CAbttagiPJ/FXy9S8jcQ7N722PAovtxs69nNBQf56cmWsnOHphLCGG9w==", + "optional": true, + "requires": { + "@aws-sdk/signature-v4": "3.267.0", + "@aws-sdk/types": "3.267.0", + "@aws-sdk/util-config-provider": "3.208.0", + "@aws-sdk/util-middleware": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-cognito-identity": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.267.0.tgz", + "integrity": "sha512-H97VsbiTcb4tbY/LQMZNglJIHt7CHso7RtGgctmdsEA7Rha79fV/egF0Vqo2OQHDgEEpgQDWCeHbXO1P5ibR/A==", + "optional": true, + "requires": { + "@aws-sdk/client-cognito-identity": "3.267.0", + "@aws-sdk/property-provider": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-env": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.267.0.tgz", + "integrity": "sha512-oiem2UtaFe4CQHscUCImJjPhYWd4iF8fqXhlq6BqHs1wsO6A0vnIUGh+Srut/2q7Xeegl/SRU34HK0hh8JCbxg==", + "optional": true, + "requires": { + "@aws-sdk/property-provider": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-imds": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.267.0.tgz", + "integrity": "sha512-Afd5+LdJ9QyeI5L4iyVmI4MLV+0JBtRLmRy0LdinwJaP0DyKyv9+uaIaorKfWihQpe8hwjEfQWTlTz2A3JMJtw==", + "optional": true, + "requires": { + "@aws-sdk/node-config-provider": "3.267.0", + "@aws-sdk/property-provider": "3.267.0", + "@aws-sdk/types": "3.267.0", + "@aws-sdk/url-parser": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-ini": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.267.0.tgz", + "integrity": "sha512-pHHlqZqZXA4cTssTyRmbYtrjxS2BEy2KFYHEEHNUrd82pUHnj70n+lrpVnT5pRhPPDacpNzxq0KZGeNgmETpbw==", + "optional": true, + "requires": { + "@aws-sdk/credential-provider-env": "3.267.0", + "@aws-sdk/credential-provider-imds": "3.267.0", + "@aws-sdk/credential-provider-process": "3.267.0", + "@aws-sdk/credential-provider-sso": "3.267.0", + "@aws-sdk/credential-provider-web-identity": "3.267.0", + "@aws-sdk/property-provider": "3.267.0", + "@aws-sdk/shared-ini-file-loader": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-node": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.267.0.tgz", + "integrity": "sha512-uo8VyZ/L8HBXskYZC65bR1ZUJ5mBn8JarrGHt6vMG2A+uM7AuryTsKn2wdhPfuCUGKuQLXmix5K4VW/wzq11kQ==", + "optional": true, + "requires": { + "@aws-sdk/credential-provider-env": "3.267.0", + "@aws-sdk/credential-provider-imds": "3.267.0", + "@aws-sdk/credential-provider-ini": "3.267.0", + "@aws-sdk/credential-provider-process": "3.267.0", + "@aws-sdk/credential-provider-sso": "3.267.0", + "@aws-sdk/credential-provider-web-identity": "3.267.0", + "@aws-sdk/property-provider": "3.267.0", + "@aws-sdk/shared-ini-file-loader": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-process": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.267.0.tgz", + "integrity": "sha512-pd1OOB1Mm+QdPv3sPfO+1G8HBaPAAYXxjLcOK5z/myBeZAsLR12Xcaft4RR1XWwXXKEQqq42cbAINWQdyVykqQ==", + "optional": true, + "requires": { + "@aws-sdk/property-provider": "3.267.0", + "@aws-sdk/shared-ini-file-loader": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-sso": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.267.0.tgz", + "integrity": "sha512-JqwxelzeRhVdloNi+VUUXhJdziTtNrrwMuhds9wj4KPfl1S2EIzkRxHSjwDz1wtSyuIPOOo6pPJiaVbwvLpkVg==", + "optional": true, + "requires": { + "@aws-sdk/client-sso": "3.267.0", + "@aws-sdk/property-provider": "3.267.0", + "@aws-sdk/shared-ini-file-loader": "3.267.0", + "@aws-sdk/token-providers": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-web-identity": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.267.0.tgz", + "integrity": "sha512-za5UsQmj3sYRhd4h5eStj3GCHHfAAjfx2x5FmgQ9ldOp+s0wHEqSL1g+OL9v6o8otf9JnWha+wfUYq3yVGfufQ==", + "optional": true, + "requires": { + "@aws-sdk/property-provider": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-providers": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.267.0.tgz", + "integrity": "sha512-Og70E1eHGcxShMbrmm8lOepF82Hg5Fe7WXv0pnUKFFUxr+pf89bCjxGwktZIDM7ZMMXGIyladeIgTjsJkhpjRQ==", + "optional": true, + "requires": { + "@aws-sdk/client-cognito-identity": "3.267.0", + "@aws-sdk/client-sso": "3.267.0", + "@aws-sdk/client-sts": "3.267.0", + "@aws-sdk/credential-provider-cognito-identity": "3.267.0", + "@aws-sdk/credential-provider-env": "3.267.0", + "@aws-sdk/credential-provider-imds": "3.267.0", + "@aws-sdk/credential-provider-ini": "3.267.0", + "@aws-sdk/credential-provider-node": "3.267.0", + "@aws-sdk/credential-provider-process": "3.267.0", + "@aws-sdk/credential-provider-sso": "3.267.0", + "@aws-sdk/credential-provider-web-identity": "3.267.0", + "@aws-sdk/property-provider": "3.267.0", + "@aws-sdk/shared-ini-file-loader": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/fetch-http-handler": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.267.0.tgz", + "integrity": "sha512-u8v8OvWvLVfifmETCAj+DCTot900AsdO1b+N+O8nXiTm2v99rtEoNRJW+no/5vJKNqR+95OAz4NWjFep8nzseg==", + "optional": true, + "requires": { + "@aws-sdk/protocol-http": "3.267.0", + "@aws-sdk/querystring-builder": "3.267.0", + "@aws-sdk/types": "3.267.0", + "@aws-sdk/util-base64": "3.208.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/hash-node": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.267.0.tgz", + "integrity": "sha512-N3xeChdJg4V4jh2vrRN521EMJYxjUOo/LpvpisFyQHE/p31AfcOLb05upYFoYLvyeder9RHBIyNsvvnMYYoCsA==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.267.0", + "@aws-sdk/util-buffer-from": "3.208.0", + "@aws-sdk/util-utf8": "3.254.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/invalid-dependency": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.267.0.tgz", + "integrity": "sha512-I95IR/eDLC54+9qrL6uh64nhpLVHwxxbBhhEUZKDACp86eXulO8T/DOwUX31ps4+2lI7tbEhQT7f9WDOO3fN8Q==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/is-array-buffer": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz", + "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-content-length": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.267.0.tgz", + "integrity": "sha512-b6MBIK12iwcATKnWIhsh50xWVMmZOXZFIo9D4io6D+JM6j/U+GZrSWqxhHzb3SjavuwVgA2hwq4mUCh2WJPJKA==", + "optional": true, + "requires": { + "@aws-sdk/protocol-http": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-endpoint": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.267.0.tgz", + "integrity": "sha512-pGICM/qlQVfixtfKZt8zHq54KvLG2MmOAgNWj2MXB7oirPs/3rC9Kz9ITFXJgjlRFyfssgP/feKhs2yZkI8lhw==", + "optional": true, + "requires": { + "@aws-sdk/middleware-serde": "3.267.0", + "@aws-sdk/protocol-http": "3.267.0", + "@aws-sdk/signature-v4": "3.267.0", + "@aws-sdk/types": "3.267.0", + "@aws-sdk/url-parser": "3.267.0", + "@aws-sdk/util-config-provider": "3.208.0", + "@aws-sdk/util-middleware": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-host-header": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.267.0.tgz", + "integrity": "sha512-D8TfjMeuQXTsB7Ni8liMmNqb3wz+T6t/tYUHtsMo0j++94KAPPj1rhkkTAjR4Rc+IYGCS4YyyCuCXjGB6gkjnA==", + "optional": true, + "requires": { + "@aws-sdk/protocol-http": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-logger": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.267.0.tgz", + "integrity": "sha512-wnLeZYWbgGCuNmRl0Pmky0cSXBWmMTaQBgq90WfwyM0V8wzcoeaovTWA5/qe8oJzusOgUMFoVia4Ew20k3lu8w==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-recursion-detection": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.267.0.tgz", + "integrity": "sha512-NCBkTLxaW7XtfQoVBqQCaQZqec5XDtEylkw7g0tGjYDcl934fzu3ciH9MsJ34QFe9slYM6g4v+eC9f1w9K/19g==", + "optional": true, + "requires": { + "@aws-sdk/protocol-http": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-retry": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.267.0.tgz", + "integrity": "sha512-MiiNtddZXVhtSAnJFyChwNxnhzMYmv6qWl8qgSjuIOw9SczkHPCoANTfUdRlzG6RfPYhgYtzMGqqnrficJ6mVg==", + "optional": true, + "requires": { + "@aws-sdk/protocol-http": "3.267.0", + "@aws-sdk/service-error-classification": "3.267.0", + "@aws-sdk/types": "3.267.0", + "@aws-sdk/util-middleware": "3.267.0", + "@aws-sdk/util-retry": "3.267.0", + "tslib": "^2.3.1", + "uuid": "^8.3.2" + } + }, + "@aws-sdk/middleware-sdk-sts": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.267.0.tgz", + "integrity": "sha512-JLDNNvV7Hr0CQrf1vSmflvPbfDFIx5lFf8tY7DZwYWEE920ZzbJTfUsTW9iZHJGeIe8dAQX1tmfYL68+++nvEQ==", + "optional": true, + "requires": { + "@aws-sdk/middleware-signing": "3.267.0", + "@aws-sdk/property-provider": "3.267.0", + "@aws-sdk/protocol-http": "3.267.0", + "@aws-sdk/signature-v4": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-serde": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.267.0.tgz", + "integrity": "sha512-9qspxiZs+JShukzKMAameBSubfvtUOGZviu9GT5OfRekY2dBbwWcfchP2WvlwxZ/CcC+GwO1HcPqKDCMGsNoow==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-signing": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.267.0.tgz", + "integrity": "sha512-thkFEBiFW0M/73dIzl7hQmyAONb8zyD2ZYUFyGm7cIM60sRDUKejPHV6Izonll+HbBZgiBdwUi42uu8O+LfFGQ==", + "optional": true, + "requires": { + "@aws-sdk/property-provider": "3.267.0", + "@aws-sdk/protocol-http": "3.267.0", + "@aws-sdk/signature-v4": "3.267.0", + "@aws-sdk/types": "3.267.0", + "@aws-sdk/util-middleware": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-stack": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.267.0.tgz", + "integrity": "sha512-52uH3JO3ceI15dgzt8gU7lpJf59qbRUQYJ7pAmTMiHtyEawZ39Puv6sGheY3fAffhqd/aQvup6wn18Q1fRIQUA==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-user-agent": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.267.0.tgz", + "integrity": "sha512-eaReMnoB1Cx3OY8WDSiUMNDz/EkdAo4w/m3d5CizckKQNmB29gUrgyFs7g7sHTcShQAduZzlsfRPzc6NmKYaWQ==", + "optional": true, + "requires": { + "@aws-sdk/protocol-http": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/node-config-provider": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.267.0.tgz", + "integrity": "sha512-wNX+Cu0x+kllng253j5dvmLm4opDRr7YehJ0rNGAV24X+UPJPluN9HrBFly+z4+bH16TpJEPKx7AayiWZGFE1w==", + "optional": true, + "requires": { + "@aws-sdk/property-provider": "3.267.0", + "@aws-sdk/shared-ini-file-loader": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/node-http-handler": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.267.0.tgz", + "integrity": "sha512-wtt3O+e8JEKaLFtmQd74HSZj2TyiApPkwMJ3R50hyboVswt8RcdMWdFbzLnPVpT1AqskG3fMECSKbu8AC/xvBQ==", + "optional": true, + "requires": { + "@aws-sdk/abort-controller": "3.267.0", + "@aws-sdk/protocol-http": "3.267.0", + "@aws-sdk/querystring-builder": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/property-provider": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.267.0.tgz", + "integrity": "sha512-/BD1Zar9PCQSV8VZTAWOJmtojAeMIl16ljZX3Kix84r45qqNNxuPST2AhNVN+p97Js4x9kBFCHkdFOpW94wr4Q==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/protocol-http": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.267.0.tgz", + "integrity": "sha512-8HhOZXMCZ0nsJC/FoifX7YrTYGP91tCpSxIHkr7HxQcTdBMI7QakMtIIWK9Qjsy6tUI98aAdEo5PNCbzdpozmQ==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/querystring-builder": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.267.0.tgz", + "integrity": "sha512-SKo8V3oPV1wZy4r4lccH7R2LT0PUK/WGaXkKR30wyrtDjJRWVJDYef9ysOpRP+adCTt3G5XO0SzyPQUW5dXYVA==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.267.0", + "@aws-sdk/util-uri-escape": "3.201.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/querystring-parser": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.267.0.tgz", + "integrity": "sha512-Krq36GXqEfRfzJ9wOzkkzpbb4SWjgSYydTIgK6KtKapme0HPcB24kmmsjsUVuHzKuQMCHHDRWm+b47iBmHGpSQ==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/service-error-classification": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.267.0.tgz", + "integrity": "sha512-fOWg7bcItmJqD/YQbGvN9o03ucoBzvWNTQEB81mLKMSKr1Cf/ms0f8oa94LlImgqjjfjvAqHh6rUBTpSmSEyaw==", + "optional": true + }, + "@aws-sdk/shared-ini-file-loader": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.267.0.tgz", + "integrity": "sha512-Jz9R5hXKSk+aRoBKi4Bnf6T/FZUBYrIibbLnhiNxpQ1FY9mTggJR/rxuIdOE23LtfW+CRqqEYOtAtmC1oYE6tw==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/signature-v4": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.267.0.tgz", + "integrity": "sha512-Je1e7rum2zvxa3jWfwq4E+fyBdFJmSJAwGtWYz3+/rWipwXFlSAPeSVqtNjHdfzakgabvzLp7aesG4yQTrO2YQ==", + "optional": true, + "requires": { + "@aws-sdk/is-array-buffer": "3.201.0", + "@aws-sdk/types": "3.267.0", + "@aws-sdk/util-hex-encoding": "3.201.0", + "@aws-sdk/util-middleware": "3.267.0", + "@aws-sdk/util-uri-escape": "3.201.0", + "@aws-sdk/util-utf8": "3.254.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/smithy-client": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.267.0.tgz", + "integrity": "sha512-WdgXHqKmFQIkAWETO/I5boX9u6QbMLC4X74OVSBaBLhRjqYmvolMFtNrQzvSKGB3FaxAN9Do41amC0mGoeLC8A==", + "optional": true, + "requires": { + "@aws-sdk/middleware-stack": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/token-providers": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.267.0.tgz", + "integrity": "sha512-CGayGrPl4ONG4RuGbNv+QS4oVuItx4hK2FCbFS7d6V7h53rkDrcFd34NsvbicQ2KVFobE7fKs6ZaripJbJbLHA==", + "optional": true, + "requires": { + "@aws-sdk/client-sso-oidc": "3.267.0", + "@aws-sdk/property-provider": "3.267.0", + "@aws-sdk/shared-ini-file-loader": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/types": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.267.0.tgz", + "integrity": "sha512-fICTbSeIfXlTHnciQgDt37R0kXoKxgh0a3prnLWVvTcmf7NFujdZmg5YTAZT3KJJ7SuKsIgnI8azBYioVY8BVQ==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/url-parser": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.267.0.tgz", + "integrity": "sha512-xoQ5Fd11moiE82QTL9GGE6e73SFuD0Wi73tA75TAwKuY12OP5vDJ4oBC86A1G2T+OzeHJQmYyqiA5j48CzqB6A==", + "optional": true, + "requires": { + "@aws-sdk/querystring-parser": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-base64": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz", + "integrity": "sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg==", + "optional": true, + "requires": { + "@aws-sdk/util-buffer-from": "3.208.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-body-length-browser": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz", + "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-body-length-node": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz", + "integrity": "sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-buffer-from": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz", + "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==", + "optional": true, + "requires": { + "@aws-sdk/is-array-buffer": "3.201.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-config-provider": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz", + "integrity": "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-defaults-mode-browser": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.267.0.tgz", + "integrity": "sha512-MgrqpedA58HVR8RpT2A42//5Lb3M0JwEiYlDaA7EvIVsMx1NzO+cng4MDJi03YBAP5hwCVQmO9Sf5Au4dm+m0g==", + "optional": true, + "requires": { + "@aws-sdk/property-provider": "3.267.0", + "@aws-sdk/types": "3.267.0", + "bowser": "^2.11.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-defaults-mode-node": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.267.0.tgz", + "integrity": "sha512-JyFk95T77sGM4q386id/mDt9/7HvoQySAygPyv/lj//WEJJIRKiefB277CKKJPT8nRAsO4mIyAT+YO/xGCxkQA==", + "optional": true, + "requires": { + "@aws-sdk/config-resolver": "3.267.0", + "@aws-sdk/credential-provider-imds": "3.267.0", + "@aws-sdk/node-config-provider": "3.267.0", + "@aws-sdk/property-provider": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-endpoints": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.267.0.tgz", + "integrity": "sha512-c6miY83Eo0erqXY+YiS2sOg3izURqvaWHd9przJzBQea9XRCN4ANT2P8AhoC0BPIORutaaOSoCSp/crHG0XLLg==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-hex-encoding": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz", + "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-locate-window": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.208.0.tgz", + "integrity": "sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-middleware": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.267.0.tgz", + "integrity": "sha512-7nvqBZVz3RdwYv6lU958g6sWI2Qt8lzxDVn0uwfnPH+fAiX7Ln1Hen2A0XeW5cL5uYUJy6wNM5cyfTzFZosE0A==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-retry": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.267.0.tgz", + "integrity": "sha512-ZXo1ICG2HgxkIZWlnPteh2R90kwmhRwvbP282CwrrYgTKuMZmW2R/+o6vqhWyPkjoNFN/pno0FxuDA3IYau3Sw==", + "optional": true, + "requires": { + "@aws-sdk/service-error-classification": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-uri-escape": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz", + "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-user-agent-browser": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.267.0.tgz", + "integrity": "sha512-SmI6xInnPPa0gFhCqhtWOUMTxLeRbm7X5HXzeprhK1d8aNNlUVyALAV7K8ovIjnv3a97lIJSekyb78oTuYITCA==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.267.0", + "bowser": "^2.11.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-user-agent-node": { + "version": "3.267.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.267.0.tgz", + "integrity": "sha512-nfmyffA1yIypJ30CIMO6Tc16t8dFJzdztzoowjmnfb8/LzTZECERM3GICq0DvZDPfSo+jbuz634VtS2K7tVZjA==", + "optional": true, + "requires": { + "@aws-sdk/node-config-provider": "3.267.0", + "@aws-sdk/types": "3.267.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-utf8": { + "version": "3.254.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.254.0.tgz", + "integrity": "sha512-14Kso/eIt5/qfIBmhEL9L1IfyUqswjSTqO2mY7KOzUZ9SZbwn3rpxmtkhmATkRjD7XIlLKaxBkI7tU9Zjzj8Kw==", + "optional": true, + "requires": { + "@aws-sdk/util-buffer-from": "3.208.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", + "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "optional": true + }, + "@types/node": { + "version": "18.13.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz", + "integrity": "sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==" + }, + "@types/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" + }, + "@types/whatwg-url": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", + "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", + "requires": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "optional": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "optional": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "optional": true, + "requires": { + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "optional": true + } + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "optional": true, + "requires": { + "tslib": "^2.0.1" + } + }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "base64url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + } + }, + "bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "bson": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz", + "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==", + "requires": { + "buffer": "^5.6.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "cloudinary": { + "version": "1.34.0", + "resolved": "https://registry.npmjs.org/cloudinary/-/cloudinary-1.34.0.tgz", + "integrity": "sha512-pY0TF+SVEgBZU1FmJ1z/G+c4qEO46TYz5PvbB07U5s1G7bMmKqkwTWEhvP8gO7cpqk1AewPLr2dLl+j7kI5alQ==", + "requires": { + "cloudinary-core": "^2.10.2", + "core-js": "^3.6.5", + "lodash": "^4.17.21", + "proxy-agent": "^5.0.0", + "q": "^1.5.1" + } + }, + "cloudinary-core": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/cloudinary-core/-/cloudinary-core-2.13.0.tgz", + "integrity": "sha512-Nt0Q5I2FtenmJghtC4YZ3MZZbGg1wLm84SsxcuVwZ83OyJqG9CNIGp86CiI6iDv3QobaqBUpOT7vg+HqY5HxEA==", + "requires": {} + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "connect-flash": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/connect-flash/-/connect-flash-0.1.1.tgz", + "integrity": "sha512-2rcfELQt/ZMP+SM/pG8PyhJRaLKp+6Hk2IUBNkEit09X+vwn3QsAL3ZbYtxUn7NVPzbMTSLRDhqe0B/eh30RYA==" + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "core-js": { + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.28.0.tgz", + "integrity": "sha512-GiZn9D4Z/rSYvTeg1ljAIsEqFm0LaN9gVtwDCrKL80zHtS31p9BAjmTxVqTQDMpwlMolJZOFntUG2uwyj7DAqw==" + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "optional": true + }, + "data-uri-to-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", + "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", + "optional": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "optional": true + }, + "degenerator": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.2.tgz", + "integrity": "sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==", + "optional": true, + "requires": { + "ast-types": "^0.13.2", + "escodegen": "^1.8.1", + "esprima": "^4.0.0", + "vm2": "^3.9.8" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "ejs": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", + "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", + "requires": { + "jake": "^10.8.5" + } + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "optional": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "optional": true + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "optional": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "optional": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "express-session": { + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz", + "integrity": "sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==", + "requires": { + "cookie": "0.4.2", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.0.2", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.1", + "uid-safe": "~2.1.5" + }, + "dependencies": { + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + } + } + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "optional": true + }, + "fast-xml-parser": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", + "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==", + "optional": true, + "requires": { + "strnum": "^1.0.5" + } + }, + "file-uri-to-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", + "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", + "optional": true + }, + "filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "requires": { + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "optional": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", + "optional": true, + "requires": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "generaterr": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/generaterr/-/generaterr-1.5.0.tgz", + "integrity": "sha512-JgcGRv2yUKeboLvvNrq9Bm90P4iJBu7/vd5wSLYqMG5GJ6SxZT46LAAkMfNhQ+EK3jzC+cRBm7P8aUWYyphgcQ==" + }, + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-uri": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", + "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", + "optional": true, + "requires": { + "@tootallnate/once": "1", + "data-uri-to-buffer": "3", + "debug": "4", + "file-uri-to-path": "2", + "fs-extra": "^8.1.0", + "ftp": "^0.3.10" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "optional": true + } + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "optional": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "optional": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "optional": true + } + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "optional": true, + "requires": { + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "optional": true + } + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "optional": true + }, + "jake": { + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "requires": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optional": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "kareem": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", + "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==" + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "optional": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, + "memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mongodb": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.13.0.tgz", + "integrity": "sha512-+taZ/bV8d1pYuHL4U+gSwkhmDrwkWbH1l4aah4YpmpscMwgFBkufIKxgP/G7m87/NUuQzc2Z75ZTI7ZOyqZLbw==", + "requires": { + "@aws-sdk/credential-providers": "^3.186.0", + "bson": "^4.7.0", + "mongodb-connection-string-url": "^2.5.4", + "saslprep": "^1.0.3", + "socks": "^2.7.1" + } + }, + "mongodb-connection-string-url": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", + "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", + "requires": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + } + }, + "mongoose": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.9.1.tgz", + "integrity": "sha512-hOz1ZWV0w6WEVLrj89Wpk7PXDYtDDF6k7/NX79lY5iKqeFtZsceBXW8xW59YFNcW5O3cH32hQ8IbDlhgyBsDMA==", + "requires": { + "bson": "^4.7.0", + "kareem": "2.5.1", + "mongodb": "4.13.0", + "mpath": "0.9.0", + "mquery": "4.0.3", + "ms": "2.1.3", + "sift": "16.0.1" + } + }, + "mongoose-findorcreate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mongoose-findorcreate/-/mongoose-findorcreate-3.0.0.tgz", + "integrity": "sha512-kQhDe5XDj6tMv8kq1wjK+hITGIGUl60rj8oGLupF9poNsqIDkAJBXudZKcCdSyBZ7p6DLK2+0jSBthrb26tSYQ==" + }, + "mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==" + }, + "mquery": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz", + "integrity": "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==", + "requires": { + "debug": "4.x" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "optional": true + }, + "nodemon": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", + "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", + "dev": true, + "requires": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "oauth": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", + "integrity": "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "optional": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "pac-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", + "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", + "optional": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4", + "get-uri": "3", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "5", + "pac-resolver": "^5.0.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "5" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "optional": true + } + } + }, + "pac-resolver": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz", + "integrity": "sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==", + "optional": true, + "requires": { + "degenerator": "^3.0.2", + "ip": "^1.1.5", + "netmask": "^2.0.2" + }, + "dependencies": { + "ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "optional": true + } + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "passport": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz", + "integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==", + "requires": { + "passport-strategy": "1.x.x", + "pause": "0.0.1", + "utils-merge": "^1.0.1" + } + }, + "passport-google-oauth20": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/passport-google-oauth20/-/passport-google-oauth20-2.0.0.tgz", + "integrity": "sha512-KSk6IJ15RoxuGq7D1UKK/8qKhNfzbLeLrG3gkLZ7p4A6DBCcv7xpyQwuXtWdpyR0+E0mwkpjY1VfPOhxQrKzdQ==", + "requires": { + "passport-oauth2": "1.x.x" + } + }, + "passport-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", + "integrity": "sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow==", + "requires": { + "passport-strategy": "1.x.x" + } + }, + "passport-local-mongoose": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/passport-local-mongoose/-/passport-local-mongoose-7.1.2.tgz", + "integrity": "sha512-hNLIKi/6IhElr/PhOze8wLDh7T4+ZYhc8GFWYApLgG7FrjI55tuGZELPtsUBqODz77OwlUUf+ngPgHN09zxGLg==", + "requires": { + "generaterr": "^1.5.0", + "passport-local": "^1.0.0", + "scmp": "^2.1.0" + } + }, + "passport-oauth2": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.6.1.tgz", + "integrity": "sha512-ZbV43Hq9d/SBSYQ22GOiglFsjsD1YY/qdiptA+8ej+9C1dL1TVB+mBE5kDH/D4AJo50+2i8f4bx0vg4/yDDZCQ==", + "requires": { + "base64url": "3.x.x", + "oauth": "0.9.x", + "passport-strategy": "1.x.x", + "uid2": "0.0.x", + "utils-merge": "1.x.x" + } + }, + "passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "optional": true + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", + "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", + "optional": true, + "requires": { + "agent-base": "^6.0.0", + "debug": "4", + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "lru-cache": "^5.1.1", + "pac-proxy-agent": "^5.0.0", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^5.0.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, + "requires": { + "ms": "2.1.2" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "optional": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "optional": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "optional": true + } + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "optional": true + }, + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "requires": { + "sparse-bitfield": "^3.0.3" + } + }, + "scmp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/scmp/-/scmp-2.1.0.tgz", + "integrity": "sha512-o/mRQGk9Rcer/jEEw/yw4mwo3EU/NvYvp577/Btqrym9Qy5/MdWGBqipbALgd2lrdWTJ5/gqDusxfnQBxOxT2Q==" + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "sift": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", + "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" + }, + "simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dev": true, + "requires": { + "semver": "~7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" + }, + "socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "requires": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + } + }, + "socks-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", + "optional": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "4", + "socks": "^2.3.3" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "optional": true + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + }, + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "optional": true, + "requires": { + "memory-pager": "^1.0.2" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "optional": true + }, + "strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "optional": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "~1.0.10" + } + }, + "tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "requires": { + "punycode": "^2.1.1" + } + }, + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "optional": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "requires": { + "random-bytes": "~1.0.0" + } + }, + "uid2": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.4.tgz", + "integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==" + }, + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "optional": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "optional": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "vm2": { + "version": "3.9.14", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.14.tgz", + "integrity": "sha512-HgvPHYHeQy8+QhzlFryvSteA4uQLBCOub02mgqdR+0bN/akRZ48TGB1v0aCv7ksyc0HXx16AZtMHKS38alc6TA==", + "optional": true, + "requires": { + "acorn": "^8.7.0", + "acorn-walk": "^8.2.0" + } + }, + "webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" + }, + "whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "optional": true + }, + "xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==", + "optional": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..4fcc039 --- /dev/null +++ b/package.json @@ -0,0 +1,36 @@ +{ + "name": "knot", + "version": "1.0.0", + "description": "Maybe the best place you are looking for!", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "nodemon ./backend/index.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/TuhinBar/Knot.git" + }, + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/TuhinBar/Knot/issues" + }, + "homepage": "https://github.com/TuhinBar/Knot#readme", + "dependencies": { + "cloudinary": "^1.34.0", + "connect-flash": "^0.1.1", + "dotenv": "^16.0.3", + "ejs": "^3.1.8", + "express": "^4.18.2", + "express-session": "^1.17.3", + "mongoose": "^6.9.1", + "mongoose-findorcreate": "^3.0.0", + "passport": "^0.6.0", + "passport-google-oauth20": "^2.0.0", + "passport-local-mongoose": "^7.1.2" + }, + "devDependencies": { + "nodemon": "^2.0.20" + } +}