diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..497fb78 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,9 @@ +{ + "semi": false, + "arrowParens": "avoid", + "printWidth": 80, + "tabWidth": 4, + "useTabs": true, + "bracketSameLine": true, + "htmlWhitespaceSensitivity": "ignore" +} diff --git a/Back/README.md b/Back/README.md index e971927..7ab4ad2 100644 --- a/Back/README.md +++ b/Back/README.md @@ -1,4 +1,5 @@ # SushiBlox-Website + Website for sushiblox I guess. ~~Private for now might open source.~~ @@ -8,13 +9,15 @@ The setup is ~~easy install required node modules and setup a nginx reverse prox Uses MongoDB for datastorage. Redis for special things # Advice + ~~This uses hardcoded domain names in the code~~ and relies on cloudflare headers for IP configs. so yeahhhhhhhhhhhhhhhhhhhhhhhhhh - # Redis + idk set it up nerd # setup + easy enough # Example diff --git a/Back/middleware/authmiddleware.js b/Back/middleware/authmiddleware.js index adf8c78..0f485a7 100644 --- a/Back/middleware/authmiddleware.js +++ b/Back/middleware/authmiddleware.js @@ -1,65 +1,86 @@ -const jwt = require('jsonwebtoken') -require('dotenv').config() +const jwt = require("jsonwebtoken") +require("dotenv").config() const JWT_SECRET = process.env.JWT_SECRET -const atob = require("atob"); +const atob = require("atob") const model = require("./../model/user.js") -const requireAuth = (req,res,next) => { - if (!req.cookies && req.headers['authorization']) { - return res.json({status: "error", error: "Unauthorized"}) - } - let token = req.cookies.jwt??req.cookies['.ROBLOSECURITY']??req.headers['authorization']??req.headers['roblox-session-id'] +const requireAuth = (req, res, next) => { + if (!req.cookies && req.headers["authorization"]) { + return res.json({ status: "error", error: "Unauthorized" }) + } + let token = + req.cookies.jwt ?? + req.cookies[".ROBLOSECURITY"] ?? + req.headers["authorization"] ?? + req.headers["roblox-session-id"] - if (!token) { - return res.status(401).json({status: "error", error: "Unauthorized"}) - } + if (!token) { + return res.status(401).json({ status: "error", error: "Unauthorized" }) + } + jwt.verify(token, JWT_SECRET, (err, decodedtoken) => { + if (err) { + res.cookie("jwt", "", { SameSite: "Strict", maxAge: 1 }) + return res + .status(401) + .json({ status: "error", error: "Unauthorized" }) + } else { + var tokendata = decodedtoken + var name = tokendata.userid + try { + model.findOne({ userid: name }, async function (err, doc) { + req.numberofcoins = doc.coins + req.tokenData = tokendata + req.userdocument = doc + moderationstatus = JSON.parse(doc.moderation) + const actualTimeMilliseconds = new Date().getTime() + if ( + actualTimeMilliseconds - doc.timesincelastrequest >= + 60000 * 1 || + !doc.timesincelastrequest /*2 minutes make sure to update*/ + ) { + doc.timesincelastrequest = actualTimeMilliseconds + doc.markModified("timesincelastrequest") + await doc.save() + } + // check if they are eligble for daily login reward + if ( + actualTimeMilliseconds - + req.userdocument.lastclaimofcurrency > + 86400000 + ) { + // 24 hours + req.userdocument.lastclaimofcurrency = + actualTimeMilliseconds + if ( + req.userdocument.membership === "TurboBuildersClub" + ) { + req.userdocument.coins += 90 + } else if ( + req.userdocument.membership === "BuildersClub" + ) { + req.userdocument.coins += 60 + } else if ( + req.userdocument.membership === + "OutrageousBuildersClub" + ) { + req.userdocument.coins += 150 + } else { + req.userdocument.coins += 35 + } + req.userdocument.markModified("coins") + req.userdocument.markModified("lastclaimofcurrency") + await req.userdocument.save() + } - jwt.verify(token,JWT_SECRET, (err,decodedtoken) => { - if (err){ - res.cookie('jwt', "", {SameSite: "Strict",maxAge: 1 }) - return res.status(401).json({status: "error", error: "Unauthorized"}) - }else{ - var tokendata = decodedtoken - var name = tokendata.userid - try { - model.findOne({userid: name},async function(err, doc) { - req.numberofcoins = doc.coins - req.tokenData = tokendata - req.userdocument = doc - moderationstatus = JSON.parse(doc.moderation) - const actualTimeMilliseconds = new Date().getTime() - if (actualTimeMilliseconds - doc.timesincelastrequest >= 60000 * 1 || !doc.timesincelastrequest /*2 minutes make sure to update*/){ - doc.timesincelastrequest = actualTimeMilliseconds - doc.markModified('timesincelastrequest') - await doc.save() - } - // check if they are eligble for daily login reward - if (actualTimeMilliseconds - req.userdocument.lastclaimofcurrency > 86400000){ // 24 hours - req.userdocument.lastclaimofcurrency = actualTimeMilliseconds - if (req.userdocument.membership === "TurboBuildersClub"){ - req.userdocument.coins += 90 - }else if (req.userdocument.membership === "BuildersClub"){ - req.userdocument.coins += 60 - }else if (req.userdocument.membership === "OutrageousBuildersClub"){ - req.userdocument.coins += 150 - } - else{ - req.userdocument.coins += 35 - } - req.userdocument.markModified('coins') - req.userdocument.markModified('lastclaimofcurrency') - await req.userdocument.save() - } - - if (moderationstatus.status !== "ok") { - // if they are moderated then we invalidate the cookie and proceed - //res.cookie('jwt', "", {SameSite: "Strict",maxAge: 1 }) - //return res.send("You have been moderated for "+moderationstatus.Reason+" expires at"+moderationstatus.ExpiresIn+" Moderated by "+moderationstatus.BannedBy ) - var date = Date.parse(moderationstatus.ExpiresIn) - var datetime = new Date(); - var datetime2 = Date.parse(datetime) - /*if (date <= datetime2){ + if (moderationstatus.status !== "ok") { + // if they are moderated then we invalidate the cookie and proceed + //res.cookie('jwt', "", {SameSite: "Strict",maxAge: 1 }) + //return res.send("You have been moderated for "+moderationstatus.Reason+" expires at"+moderationstatus.ExpiresIn+" Moderated by "+moderationstatus.BannedBy ) + var date = Date.parse(moderationstatus.ExpiresIn) + var datetime = new Date() + var datetime2 = Date.parse(datetime) + /*if (date <= datetime2){ // they have served there time model.updateOne({userid: doc.userid}, { @@ -73,17 +94,19 @@ const requireAuth = (req,res,next) => { return next() }*/ - return res.json({status: "error", error:"Moderated", moderationstatus}) - } - next() - })/*.lean() rip*/} - catch (error) { - console.error(error); - } - - } - - }) + return res.json({ + status: "error", + error: "Moderated", + moderationstatus, + }) + } + next() + }) /*.lean() rip*/ + } catch (error) { + console.error(error) + } + } + }) } -module.exports = {requireAuth} \ No newline at end of file +module.exports = { requireAuth } diff --git a/Back/middleware/authmiddlewaregame.js b/Back/middleware/authmiddlewaregame.js index bacb7f5..df9d44d 100644 --- a/Back/middleware/authmiddlewaregame.js +++ b/Back/middleware/authmiddlewaregame.js @@ -1,55 +1,55 @@ -const jwt = require('jsonwebtoken') -require('dotenv').config() +const jwt = require("jsonwebtoken") +require("dotenv").config() const JWT_SECRET = process.env.JWT_SECRET -const atob = require("atob"); +const atob = require("atob") const model = require("./../model/user.js") // exactly the same as normal authimddleware but uses req.query instead of cookies for our client -const requireAuth = (req,res,next) => { - let token = req.query.auth - if (req.cookies && req.headers?.['user-agent'] != "Roblox/WinInet") { // Mobile - if (req.cookies.jwt) { - token = req.cookies.jwt - } - } - if (req.headers['roblox-session-id']) { // TeleportService - token = req.headers['roblox-session-id'] - } - if (req.headers?.['user-agent']?.includes("Android") === true || req.headers?.['user-agent']?.includes("iPhone") === true){ - console.log(token) - console.log(req.headers) - } - //console.log(req.headers) +const requireAuth = (req, res, next) => { + let token = req.query.auth + if (req.cookies && req.headers?.["user-agent"] != "Roblox/WinInet") { + // Mobile + if (req.cookies.jwt) { + token = req.cookies.jwt + } + } + if (req.headers["roblox-session-id"]) { + // TeleportService + token = req.headers["roblox-session-id"] + } + if ( + req.headers?.["user-agent"]?.includes("Android") === true || + req.headers?.["user-agent"]?.includes("iPhone") === true + ) { + console.log(token) + console.log(req.headers) + } + //console.log(req.headers) - - + if (!token) { + return res.status(405).end() + } - - if (!token) { - return res.status(405).end() - } - - - jwt.verify(token,JWT_SECRET, (err,decodedtoken) => { - if (err){ - res.cookie('jwt', "", {SameSite: "Strict",maxAge: 1 }) - return res.status(405) - }else{ - var tokendata = decodedtoken - var name = tokendata.userid - try { - model.findOne({userid: name}, function(err, doc) { - req.numberofcoins = doc.coins - req.tokenData = tokendata - req.userdocument = doc - moderationstatus = JSON.parse(doc.moderation) - if (moderationstatus.status !== "ok") { - // if they are moderated then we invalidate the cookie and proceed - //res.cookie('jwt', "", {SameSite: "Strict",maxAge: 1 }) - //return res.send("You have been moderated for "+moderationstatus.Reason+" expires at"+moderationstatus.ExpiresIn+" Moderated by "+moderationstatus.BannedBy ) - var date = Date.parse(moderationstatus.ExpiresIn) - var datetime = new Date(); - var datetime2 = Date.parse(datetime) - /*if (date <= datetime2){ + jwt.verify(token, JWT_SECRET, (err, decodedtoken) => { + if (err) { + res.cookie("jwt", "", { SameSite: "Strict", maxAge: 1 }) + return res.status(405) + } else { + var tokendata = decodedtoken + var name = tokendata.userid + try { + model.findOne({ userid: name }, function (err, doc) { + req.numberofcoins = doc.coins + req.tokenData = tokendata + req.userdocument = doc + moderationstatus = JSON.parse(doc.moderation) + if (moderationstatus.status !== "ok") { + // if they are moderated then we invalidate the cookie and proceed + //res.cookie('jwt', "", {SameSite: "Strict",maxAge: 1 }) + //return res.send("You have been moderated for "+moderationstatus.Reason+" expires at"+moderationstatus.ExpiresIn+" Moderated by "+moderationstatus.BannedBy ) + var date = Date.parse(moderationstatus.ExpiresIn) + var datetime = new Date() + var datetime2 = Date.parse(datetime) + /*if (date <= datetime2){ // they have served there time model.updateOne({userid: doc.userid}, { @@ -63,17 +63,19 @@ const requireAuth = (req,res,next) => { }*/ - return res.json({status: "error", error:"Moderated", moderationstatus}) - } - next() - })/*.lean() rip*/} - catch (error) { - console.error(error); - } - - } - - }) + return res.json({ + status: "error", + error: "Moderated", + moderationstatus, + }) + } + next() + }) /*.lean() rip*/ + } catch (error) { + console.error(error) + } + } + }) } -module.exports = {requireAuth} \ No newline at end of file +module.exports = { requireAuth } diff --git a/Back/middleware/grabauth.js b/Back/middleware/grabauth.js index 7a0a564..cfd0bca 100644 --- a/Back/middleware/grabauth.js +++ b/Back/middleware/grabauth.js @@ -1,64 +1,78 @@ -const jwt = require('jsonwebtoken') -require('dotenv').config() +const jwt = require("jsonwebtoken") +require("dotenv").config() const JWT_SECRET = process.env.JWT_SECRET -const atob = require("atob"); +const atob = require("atob") const model = require("./../model/user.js") -const grabAuth = (req,res,next) => { - if (!req.cookies && req.headers['authorization']) { - return next() - } - const token = req.cookies.jwt??req.cookies['.ROBLOSECURITY']??req.headers['authorization'] +const grabAuth = (req, res, next) => { + if (!req.cookies && req.headers["authorization"]) { + return next() + } + const token = + req.cookies.jwt ?? + req.cookies[".ROBLOSECURITY"] ?? + req.headers["authorization"] - if (!token) { - return next() - } + if (!token) { + return next() + } - jwt.verify(token,JWT_SECRET, (err,decodedtoken) => { - if (err){ - next() - }else{ - var tokendata = decodedtoken - var name = tokendata.username - try { - model.findOne({username: new RegExp('^'+name+'$', "i")}, function(err, doc) { - req.numberofcoins = doc.coins - req.admin = doc.admin - req.tokenData = tokendata - req.userdocument = doc - moderationstatus = JSON.parse(doc.moderation) - if (moderationstatus.status !== "ok") { - // if they are moderated then we invalidate the cookie and proceed - //res.cookie('jwt', "", {SameSite: "Strict",maxAge: 1 }) - //return res.send("You have been moderated for "+moderationstatus.Reason+" expires at"+moderationstatus.ExpiresIn+" Moderated by "+moderationstatus.BannedBy ) - var date = Date.parse(moderationstatus.ExpiresIn) - var datetime = new Date(); - var datetime2 = Date.parse(datetime) - if (date <= datetime2){ - // they have served there time + jwt.verify(token, JWT_SECRET, (err, decodedtoken) => { + if (err) { + next() + } else { + var tokendata = decodedtoken + var name = tokendata.username + try { + model.findOne( + { username: new RegExp("^" + name + "$", "i") }, + function (err, doc) { + req.numberofcoins = doc.coins + req.admin = doc.admin + req.tokenData = tokendata + req.userdocument = doc + moderationstatus = JSON.parse(doc.moderation) + if (moderationstatus.status !== "ok") { + // if they are moderated then we invalidate the cookie and proceed + //res.cookie('jwt', "", {SameSite: "Strict",maxAge: 1 }) + //return res.send("You have been moderated for "+moderationstatus.Reason+" expires at"+moderationstatus.ExpiresIn+" Moderated by "+moderationstatus.BannedBy ) + var date = Date.parse(moderationstatus.ExpiresIn) + var datetime = new Date() + var datetime2 = Date.parse(datetime) + if (date <= datetime2) { + // they have served there time - model.updateOne({userid: doc.userid}, { - $set: { - moderation: JSON.stringify({"status":"ok","Reason":"none","ExpiresIn":"none", "BannedBy": "none"}) - } - }, - function(err, doc) { - //console.log(err) - }) - - - } - return res.json({status: "error", error:"Moderated", moderationstatus}) - } - next() - })/*.lean() rip*/} - catch (error) { - console.error(error); - } - - } - - }) + model.updateOne( + { userid: doc.userid }, + { + $set: { + moderation: JSON.stringify({ + status: "ok", + Reason: "none", + ExpiresIn: "none", + BannedBy: "none", + }), + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + } + return res.json({ + status: "error", + error: "Moderated", + moderationstatus, + }) + } + next() + }, + ) /*.lean() rip*/ + } catch (error) { + console.error(error) + } + } + }) } -module.exports = {grabAuth} \ No newline at end of file +module.exports = { grabAuth } diff --git a/Back/middleware/requirediscord.js b/Back/middleware/requirediscord.js index 604f733..86eab32 100644 --- a/Back/middleware/requirediscord.js +++ b/Back/middleware/requirediscord.js @@ -1,11 +1,13 @@ -const requirediscord = (req,res,next) => { - const discordid = req.userdocument.discordid - if (!discordid) { - return res.json({status: "error", error: "Discord link required for develop. Link your discord in the settings panel."}) - }else{ - next(); - } - -}; +const requirediscord = (req, res, next) => { + const discordid = req.userdocument.discordid + if (!discordid) { + return res.json({ + status: "error", + error: "Discord link required for develop. Link your discord in the settings panel.", + }) + } else { + next() + } +} -module.exports = {requirediscord} \ No newline at end of file +module.exports = { requirediscord } diff --git a/Back/model/bank.js b/Back/model/bank.js index 882b470..b687bd0 100644 --- a/Back/model/bank.js +++ b/Back/model/bank.js @@ -1,9 +1,10 @@ -const mongoose = require('mongoose') -const bankSchema = new mongoose.Schema({ - balance: {type: Number, required: true}, -}, -{collection: 'bank'} +const mongoose = require("mongoose") +const bankSchema = new mongoose.Schema( + { + balance: { type: Number, required: true }, + }, + { collection: "bank" }, ) -const model = mongoose.model('bank', bankSchema) +const model = mongoose.model("bank", bankSchema) -module.exports = model \ No newline at end of file +module.exports = model diff --git a/Back/model/comment.js b/Back/model/comment.js index ce95fb5..0dc3848 100644 --- a/Back/model/comment.js +++ b/Back/model/comment.js @@ -1,22 +1,23 @@ -const mongoose = require('mongoose') -const CommentSchema = new mongoose.Schema({ - associatedassetid: {type: Number, required: true, index: true}, - associatedassettype: {type: String, required: true, index: true}, - posterid: {type: Number, required: true}, - content: {type: String, required: true}, - date: {type: Number, required: true}, - moderated: {type: Boolean, required: true} -}, -{collection: 'comments'} +const mongoose = require("mongoose") +const CommentSchema = new mongoose.Schema( + { + associatedassetid: { type: Number, required: true, index: true }, + associatedassettype: { type: String, required: true, index: true }, + posterid: { type: Number, required: true }, + content: { type: String, required: true }, + date: { type: Number, required: true }, + moderated: { type: Boolean, required: true }, + }, + { collection: "comments" }, ) -CommentSchema.virtual('poster', { - ref: 'UserSchema', - localField: 'posterid', - foreignField: 'userid', - justOne: true +CommentSchema.virtual("poster", { + ref: "UserSchema", + localField: "posterid", + foreignField: "userid", + justOne: true, }) -const model = mongoose.model('CommentSchema', CommentSchema) +const model = mongoose.model("CommentSchema", CommentSchema) -module.exports = model \ No newline at end of file +module.exports = model diff --git a/Back/model/config.js b/Back/model/config.js index 973fd82..5252183 100644 --- a/Back/model/config.js +++ b/Back/model/config.js @@ -1,13 +1,14 @@ -const mongoose = require('mongoose') -const ConfigSchema = new mongoose.Schema({ - RegistrationEnabled: {type: Boolean, required: true}, - MaintenanceEnabled: {type: Boolean, required: true}, - KeysEnabled: {type: Boolean, required: true}, - GamesEnabled: {type: Boolean, required: true} -}, -{collection: 'config'} +const mongoose = require("mongoose") +const ConfigSchema = new mongoose.Schema( + { + RegistrationEnabled: { type: Boolean, required: true }, + MaintenanceEnabled: { type: Boolean, required: true }, + KeysEnabled: { type: Boolean, required: true }, + GamesEnabled: { type: Boolean, required: true }, + }, + { collection: "config" }, ) -const model = mongoose.model('ConfigSchema', ConfigSchema) +const model = mongoose.model("ConfigSchema", ConfigSchema) -module.exports = model \ No newline at end of file +module.exports = model diff --git a/Back/model/games.js b/Back/model/games.js index c69becb..8606241 100644 --- a/Back/model/games.js +++ b/Back/model/games.js @@ -1,29 +1,30 @@ -const mongoose = require('mongoose') -const GamesSchema = new mongoose.Schema({ - useridofowner: {type: Number, required: true}, - idofgame: {type: Number, required: true, index: true}, - nameofgame: {type: String, required: true}, - numberofplayers: {type: String, required: true}, - descrption: {type: String, required: true}, - datastore: {type: String, required: false}, - visits: {type: Number, required: false}, - version: {type: String, required: true}, - featured: {type: Boolean, required: false}, - players: {type: Object, required: false}, - avatartype: {type: Object, required: false}, - gearallowed: {type: Boolean, required: false}, - comments: {type: Object, required: false} -}, -{collection: 'games'} +const mongoose = require("mongoose") +const GamesSchema = new mongoose.Schema( + { + useridofowner: { type: Number, required: true }, + idofgame: { type: Number, required: true, index: true }, + nameofgame: { type: String, required: true }, + numberofplayers: { type: String, required: true }, + descrption: { type: String, required: true }, + datastore: { type: String, required: false }, + visits: { type: Number, required: false }, + version: { type: String, required: true }, + featured: { type: Boolean, required: false }, + players: { type: Object, required: false }, + avatartype: { type: Object, required: false }, + gearallowed: { type: Boolean, required: false }, + comments: { type: Object, required: false }, + }, + { collection: "games" }, ) -GamesSchema.virtual('owner', { - ref: 'UserSchema', - localField: 'useridofowner', - foreignField: 'userid', - justOne: true +GamesSchema.virtual("owner", { + ref: "UserSchema", + localField: "useridofowner", + foreignField: "userid", + justOne: true, }) -const model = mongoose.model('GamesSchema', GamesSchema) +const model = mongoose.model("GamesSchema", GamesSchema) -module.exports = model \ No newline at end of file +module.exports = model diff --git a/Back/model/groups.js b/Back/model/groups.js index eadf619..d43591d 100644 --- a/Back/model/groups.js +++ b/Back/model/groups.js @@ -1,33 +1,53 @@ -const mongoose = require('mongoose') -const GroupSchema = new mongoose.Schema({ - Name: {type: String, required: true}, - Description: {type: String, required: true}, - Public: {type: Boolean, required: true}, - IconApproved: {type: Boolean, required: true}, - denied: {type: Boolean, required: false}, - Hidden: {type: Boolean, required: false}, - groupid: {type: Number, required: true}, - ownerid : {type: Number, required: true}, - memberscount: {type: Number, required: true}, - members: {type: [{userId: Number, rank: Number}], required: true}, - currentshout: {type: {content: String, shouter: Number}, required: false}, - Roles: {type: [{RoleName: String, Permissions: {Shout: Boolean, Kick: Boolean, ChangeRoles: Boolean, ModerateWall: Boolean, ManageAllies: Boolean, All: Boolean}, Rank: Number}], required: true}, // default {} -}, -{collection: 'groups'} +const mongoose = require("mongoose") +const GroupSchema = new mongoose.Schema( + { + Name: { type: String, required: true }, + Description: { type: String, required: true }, + Public: { type: Boolean, required: true }, + IconApproved: { type: Boolean, required: true }, + denied: { type: Boolean, required: false }, + Hidden: { type: Boolean, required: false }, + groupid: { type: Number, required: true }, + ownerid: { type: Number, required: true }, + memberscount: { type: Number, required: true }, + members: { type: [{ userId: Number, rank: Number }], required: true }, + currentshout: { + type: { content: String, shouter: Number }, + required: false, + }, + Roles: { + type: [ + { + RoleName: String, + Permissions: { + Shout: Boolean, + Kick: Boolean, + ChangeRoles: Boolean, + ModerateWall: Boolean, + ManageAllies: Boolean, + All: Boolean, + }, + Rank: Number, + }, + ], + required: true, + }, // default {} + }, + { collection: "groups" }, ) -const model = mongoose.model('GroupSchema', GroupSchema) +const model = mongoose.model("GroupSchema", GroupSchema) -GroupSchema.virtual('owner', { - ref: 'UserSchema', - localField: 'ownerid', - foreignField: 'userid', - justOne: true +GroupSchema.virtual("owner", { + ref: "UserSchema", + localField: "ownerid", + foreignField: "userid", + justOne: true, }) -GroupSchema.virtual('memberspoly', { - ref: 'UserSchema', - localField: 'members.userId', - foreignField: 'userid' +GroupSchema.virtual("memberspoly", { + ref: "UserSchema", + localField: "members.userId", + foreignField: "userid", }) -module.exports = model \ No newline at end of file +module.exports = model diff --git a/Back/model/ipWhitelist.mjs b/Back/model/ipWhitelist.mjs index a4f0234..17949d1 100644 --- a/Back/model/ipWhitelist.mjs +++ b/Back/model/ipWhitelist.mjs @@ -1,7 +1,7 @@ -import { Schema } from 'redis-om' +import { Schema } from "redis-om" -const ipWhiteListSchema = new Schema('ipWhiteListSchema', { - ip: { type: 'string' }, +const ipWhiteListSchema = new Schema("ipWhiteListSchema", { + ip: { type: "string" }, }) -export default ipWhiteListSchema \ No newline at end of file +export default ipWhiteListSchema diff --git a/Back/model/item.js b/Back/model/item.js index cf8982c..b0c9b74 100644 --- a/Back/model/item.js +++ b/Back/model/item.js @@ -1,23 +1,24 @@ -const mongoose = require('mongoose') -const CatalogSchema = new mongoose.Schema({ - Name: {type: String, required: true}, - Description: {type: String, required: false}, - Price: {type: String, required: true}, - Type: {type: String, required: true}, - Creator: {type: Number, required: false}, - Hidden: {type: Boolean, required: false}, - ItemId: {type: String, required: true}, - Sales: {type: Number, required: false}, - ActiveAd: {type: Boolean, required: false}, // these 4 are for user generated ads - adtype: {type: String, required: false}, - adredirectid: {type: String, required: false}, - adstartedtime: {type: Number, required: false}, - approved: {type: Boolean, required: true}, - denied: {type: Boolean, required: false}, - associatedgameid: {type: Number, required: false}, -}, -{collection: 'catalog'} +const mongoose = require("mongoose") +const CatalogSchema = new mongoose.Schema( + { + Name: { type: String, required: true }, + Description: { type: String, required: false }, + Price: { type: String, required: true }, + Type: { type: String, required: true }, + Creator: { type: Number, required: false }, + Hidden: { type: Boolean, required: false }, + ItemId: { type: String, required: true }, + Sales: { type: Number, required: false }, + ActiveAd: { type: Boolean, required: false }, // these 4 are for user generated ads + adtype: { type: String, required: false }, + adredirectid: { type: String, required: false }, + adstartedtime: { type: Number, required: false }, + approved: { type: Boolean, required: true }, + denied: { type: Boolean, required: false }, + associatedgameid: { type: Number, required: false }, + }, + { collection: "catalog" }, ) -const model = mongoose.model('CatalogSchema', CatalogSchema) +const model = mongoose.model("CatalogSchema", CatalogSchema) -module.exports = model \ No newline at end of file +module.exports = model diff --git a/Back/model/keys.js b/Back/model/keys.js index 906a089..58c086c 100644 --- a/Back/model/keys.js +++ b/Back/model/keys.js @@ -1,13 +1,14 @@ -const mongoose = require('mongoose') -const KeysSchema = new mongoose.Schema({ - Creator: {type: String, required: true}, - Key: {type: String, required: true}, - Used: {type: Boolean, required: true}, - UsedBy: {type: String, required: false} -}, -{collection: 'keys'} +const mongoose = require("mongoose") +const KeysSchema = new mongoose.Schema( + { + Creator: { type: String, required: true }, + Key: { type: String, required: true }, + Used: { type: Boolean, required: true }, + UsedBy: { type: String, required: false }, + }, + { collection: "keys" }, ) -const model = mongoose.model('KeysSchema', KeysSchema) +const model = mongoose.model("KeysSchema", KeysSchema) -module.exports = model \ No newline at end of file +module.exports = model diff --git a/Back/model/rcc.js b/Back/model/rcc.js index 72d6a1f..16812f5 100644 --- a/Back/model/rcc.js +++ b/Back/model/rcc.js @@ -1,11 +1,12 @@ -const mongoose = require('mongoose') -const RccSchema = new mongoose.Schema({ - PlaceId: {type: Number, required: true}, - Port: {type: Number, required: true}, - Status: {type: Number, required: true}, -}, -{collection: 'RCC'} +const mongoose = require("mongoose") +const RccSchema = new mongoose.Schema( + { + PlaceId: { type: Number, required: true }, + Port: { type: Number, required: true }, + Status: { type: Number, required: true }, + }, + { collection: "RCC" }, ) -const model = mongoose.model('RccSchema', RccSchema) +const model = mongoose.model("RccSchema", RccSchema) -module.exports = model \ No newline at end of file +module.exports = model diff --git a/Back/model/rcc2014.js b/Back/model/rcc2014.js index cf4cbec..2d2c1d4 100644 --- a/Back/model/rcc2014.js +++ b/Back/model/rcc2014.js @@ -1,10 +1,11 @@ -const mongoose = require('mongoose') -const Rcc2014Schema = new mongoose.Schema({ - PlaceId: {type: Number, required: true}, - Port: {type: Number, required: true} -}, -{collection: 'RCC2014'} +const mongoose = require("mongoose") +const Rcc2014Schema = new mongoose.Schema( + { + PlaceId: { type: Number, required: true }, + Port: { type: Number, required: true }, + }, + { collection: "RCC2014" }, ) -const model = mongoose.model('Rcc2014Schema', Rcc2014Schema) +const model = mongoose.model("Rcc2014Schema", Rcc2014Schema) -module.exports = model \ No newline at end of file +module.exports = model diff --git a/Back/model/rcc2018.js b/Back/model/rcc2018.js index cda04c5..e6f8987 100644 --- a/Back/model/rcc2018.js +++ b/Back/model/rcc2018.js @@ -1,11 +1,12 @@ -const mongoose = require('mongoose') -const Rcc2018Schema = new mongoose.Schema({ - PlaceId: {type: Number, required: true}, - Port: {type: Number, required: true}, - Status: {type: Number, required: true}, -}, -{collection: 'RCC2018'} +const mongoose = require("mongoose") +const Rcc2018Schema = new mongoose.Schema( + { + PlaceId: { type: Number, required: true }, + Port: { type: Number, required: true }, + Status: { type: Number, required: true }, + }, + { collection: "RCC2018" }, ) -const model = mongoose.model('Rcc2018Schema', Rcc2018Schema) +const model = mongoose.model("Rcc2018Schema", Rcc2018Schema) -module.exports = model \ No newline at end of file +module.exports = model diff --git a/Back/model/rcc2020.js b/Back/model/rcc2020.js index 3cebd7c..469b160 100644 --- a/Back/model/rcc2020.js +++ b/Back/model/rcc2020.js @@ -1,11 +1,12 @@ -const mongoose = require('mongoose') -const Rcc2020Schema = new mongoose.Schema({ - PlaceId: {type: Number, required: true}, - Port: {type: Number, required: true}, - Status: {type: Number, required: true}, -}, -{collection: 'RCC2020'} +const mongoose = require("mongoose") +const Rcc2020Schema = new mongoose.Schema( + { + PlaceId: { type: Number, required: true }, + Port: { type: Number, required: true }, + Status: { type: Number, required: true }, + }, + { collection: "RCC2020" }, ) -const model = mongoose.model('Rcc2020Schema', Rcc2020Schema) +const model = mongoose.model("Rcc2020Schema", Rcc2020Schema) -module.exports = model \ No newline at end of file +module.exports = model diff --git a/Back/model/user.js b/Back/model/user.js index 699a4ae..d0aa275 100644 --- a/Back/model/user.js +++ b/Back/model/user.js @@ -1,62 +1,76 @@ -const mongoose = require('mongoose') -var uniqueValidator = require('mongoose-unique-validator'); -const UserSchema = new mongoose.Schema({ - username: {type: String, required: true, unique: true,uniqueCaseInsensitive: true}, - password: {type: String, required: true}, - coins: {type: Number, required: true}, - admin: {type: Boolean, required: true}, - ugcpermission: {type: Boolean, required: false}, - userid: {type: Number, required: true, index: true}, - moderation: {type: String, required: true}, - moderationhistory: {type: Object, required: false}, - inventory: {type: Object, required: false}, - colors: {type: Object, required: false}, - joindate: {type: String, required: true}, - lastclaimofcurrency: {type: Number, required: true}, - discordid: {type: String, required: false}, - gamejoin: {type: String, required: false}, - gamejoin2018: {type: String, required: false}, - gamejoin2020: {type: String, required: false}, - twofasecrets: {type: String, required: false}, - followers: {type: Object, required: false}, - friends: {type: Object, required: false}, - friendrequests: {type: Object, required: false}, - membership: {type: String, required: true}, - badges: {type: Object, required: false}, - status: {type: String, required: false}, - timesincelastrequest: {type: Number, required: true}, - avatartype: {type: String, required: false}, - bio: {type: String, required: false}, - recentlyplayed: {type: [{id: Number}], required: false}, - css: {type: String, required: false}, - aboutme: {type: String, required: false}, - lastfeedsharetime: {type: Number, required: false}, - feed: [{posterid: Number, content: String, date: Number, moderated: Boolean}], required: false}, - -{collection: 'users'} +const mongoose = require("mongoose") +var uniqueValidator = require("mongoose-unique-validator") +const UserSchema = new mongoose.Schema( + { + username: { + type: String, + required: true, + unique: true, + uniqueCaseInsensitive: true, + }, + password: { type: String, required: true }, + coins: { type: Number, required: true }, + admin: { type: Boolean, required: true }, + ugcpermission: { type: Boolean, required: false }, + userid: { type: Number, required: true, index: true }, + moderation: { type: String, required: true }, + moderationhistory: { type: Object, required: false }, + inventory: { type: Object, required: false }, + colors: { type: Object, required: false }, + joindate: { type: String, required: true }, + lastclaimofcurrency: { type: Number, required: true }, + discordid: { type: String, required: false }, + gamejoin: { type: String, required: false }, + gamejoin2018: { type: String, required: false }, + gamejoin2020: { type: String, required: false }, + twofasecrets: { type: String, required: false }, + followers: { type: Object, required: false }, + friends: { type: Object, required: false }, + friendrequests: { type: Object, required: false }, + membership: { type: String, required: true }, + badges: { type: Object, required: false }, + status: { type: String, required: false }, + timesincelastrequest: { type: Number, required: true }, + avatartype: { type: String, required: false }, + bio: { type: String, required: false }, + recentlyplayed: { type: [{ id: Number }], required: false }, + css: { type: String, required: false }, + aboutme: { type: String, required: false }, + lastfeedsharetime: { type: Number, required: false }, + feed: [ + { + posterid: Number, + content: String, + date: Number, + moderated: Boolean, + }, + ], + required: false, + }, + + { collection: "users" }, ) UserSchema.plugin(uniqueValidator) -UserSchema.virtual('recentlyplayedgames', { - ref: 'GamesSchema', - localField: 'recentlyplayed.id', - foreignField: 'idofgame' +UserSchema.virtual("recentlyplayedgames", { + ref: "GamesSchema", + localField: "recentlyplayed.id", + foreignField: "idofgame", }) -UserSchema.virtual('friendsdata', { - ref: 'UserSchema', - localField: 'friends.userid', - foreignField: 'userid' +UserSchema.virtual("friendsdata", { + ref: "UserSchema", + localField: "friends.userid", + foreignField: "userid", }) -UserSchema.virtual('feed.userdata', { - ref: 'UserSchema', - localField: 'feed.posterid', - foreignField: 'userid', - justOne: true +UserSchema.virtual("feed.userdata", { + ref: "UserSchema", + localField: "feed.posterid", + foreignField: "userid", + justOne: true, }) +const model = mongoose.model("UserSchema", UserSchema) -const model = mongoose.model('UserSchema', UserSchema) - -module.exports = model \ No newline at end of file +module.exports = model diff --git a/Back/package-lock.json b/Back/package-lock.json index c805eb2..613897f 100644 --- a/Back/package-lock.json +++ b/Back/package-lock.json @@ -1,8812 +1,8812 @@ { - "name": "datastoreservice", - "version": "1.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "datastoreservice", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "@mfd/rbxdatastoreservice": "^2.3.10", - "@yaireo/relative-time": "^1.0.3", - "atob": "^2.1.2", - "bcrypt": "^5.0.1", - "body-parser": "^1.20.0", - "connect-flash": "^0.1.1", - "cookie-parser": "^1.4.6", - "cors": "^2.8.5", - "daisyui": "^2.24.2", - "dotenv": "^16.0.1", - "easy-soap-request": "^4.8.0", - "esbuild": "0.17.4", - "express": "^4.18.1", - "express-flash-message": "^2.1.0", - "express-prom-bundle": "^6.5.0", - "express-rate-limit": "^6.7.0", - "express-session": "^1.17.3", - "file-type-checker": "^1.0.4", - "get-port": "^6.1.2", - "get-port-please": "^2.6.1", - "helmet": "^5.1.1", - "jsonwebtoken": "^9.0.0", - "mongo-sanitize": "^1.1.0", - "mongoose": "^6.5.2", - "mongoose-unique-validator": "^3.1.0", - "multer": "^1.4.5-lts.1", - "node-fetch": "^3.2.10", - "png-validator": "^1.1.0", - "prom-client": "^14.1.0", - "qrcode": "^1.5.1", - "redis": "^4.6.5", - "redis-om": "^0.4.0-beta.3", - "req-flash": "^0.0.3", - "speakeasy": "^2.0.0", - "xml-js": "^1.6.11", - "xss": "^1.0.13" - }, - "devDependencies": { - "cross-env": "^7.0.3", - "nodemon": "^2.0.19" - } - }, - "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.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.272.0.tgz", - "integrity": "sha512-s2TV3phapcTwZNr4qLxbfuQuE9ZMP4RoJdkvRRCkKdm6jslsWLJf2Zlcxti/23hOlINUMYv2iXE2pftIgWGdpg==", - "optional": true, - "dependencies": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.272.0.tgz", - "integrity": "sha512-uMjRWcNvX7SoGaVn0mXWD43+Z1awPahQwGW3riDLfXHZdOgw2oFDhD3Jg5jQ8OzQLUfDvArhE3WyZwlS4muMuQ==", - "optional": true, - "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.272.0", - "@aws-sdk/config-resolver": "3.272.0", - "@aws-sdk/credential-provider-node": "3.272.0", - "@aws-sdk/fetch-http-handler": "3.272.0", - "@aws-sdk/hash-node": "3.272.0", - "@aws-sdk/invalid-dependency": "3.272.0", - "@aws-sdk/middleware-content-length": "3.272.0", - "@aws-sdk/middleware-endpoint": "3.272.0", - "@aws-sdk/middleware-host-header": "3.272.0", - "@aws-sdk/middleware-logger": "3.272.0", - "@aws-sdk/middleware-recursion-detection": "3.272.0", - "@aws-sdk/middleware-retry": "3.272.0", - "@aws-sdk/middleware-serde": "3.272.0", - "@aws-sdk/middleware-signing": "3.272.0", - "@aws-sdk/middleware-stack": "3.272.0", - "@aws-sdk/middleware-user-agent": "3.272.0", - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/node-http-handler": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/smithy-client": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/url-parser": "3.272.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.272.0", - "@aws-sdk/util-defaults-mode-node": "3.272.0", - "@aws-sdk/util-endpoints": "3.272.0", - "@aws-sdk/util-retry": "3.272.0", - "@aws-sdk/util-user-agent-browser": "3.272.0", - "@aws-sdk/util-user-agent-node": "3.272.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.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.272.0.tgz", - "integrity": "sha512-xn9a0IGONwQIARmngThoRhF1lLGjHAD67sUaShgIMaIMc6ipVYN6alWG1VuUpoUQ6iiwMEt0CHdfCyLyUV/fTA==", - "optional": true, - "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.272.0", - "@aws-sdk/fetch-http-handler": "3.272.0", - "@aws-sdk/hash-node": "3.272.0", - "@aws-sdk/invalid-dependency": "3.272.0", - "@aws-sdk/middleware-content-length": "3.272.0", - "@aws-sdk/middleware-endpoint": "3.272.0", - "@aws-sdk/middleware-host-header": "3.272.0", - "@aws-sdk/middleware-logger": "3.272.0", - "@aws-sdk/middleware-recursion-detection": "3.272.0", - "@aws-sdk/middleware-retry": "3.272.0", - "@aws-sdk/middleware-serde": "3.272.0", - "@aws-sdk/middleware-stack": "3.272.0", - "@aws-sdk/middleware-user-agent": "3.272.0", - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/node-http-handler": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/smithy-client": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/url-parser": "3.272.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.272.0", - "@aws-sdk/util-defaults-mode-node": "3.272.0", - "@aws-sdk/util-endpoints": "3.272.0", - "@aws-sdk/util-retry": "3.272.0", - "@aws-sdk/util-user-agent-browser": "3.272.0", - "@aws-sdk/util-user-agent-node": "3.272.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.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.272.0.tgz", - "integrity": "sha512-ECcXu3xoa1yggnGKMTh29eWNHiF/wC6r5Uqbla22eOOosyh0+Z6lkJ3JUSLOUKCkBXA4Cs/tJL9UDFBrKbSlvA==", - "optional": true, - "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.272.0", - "@aws-sdk/fetch-http-handler": "3.272.0", - "@aws-sdk/hash-node": "3.272.0", - "@aws-sdk/invalid-dependency": "3.272.0", - "@aws-sdk/middleware-content-length": "3.272.0", - "@aws-sdk/middleware-endpoint": "3.272.0", - "@aws-sdk/middleware-host-header": "3.272.0", - "@aws-sdk/middleware-logger": "3.272.0", - "@aws-sdk/middleware-recursion-detection": "3.272.0", - "@aws-sdk/middleware-retry": "3.272.0", - "@aws-sdk/middleware-serde": "3.272.0", - "@aws-sdk/middleware-stack": "3.272.0", - "@aws-sdk/middleware-user-agent": "3.272.0", - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/node-http-handler": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/smithy-client": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/url-parser": "3.272.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.272.0", - "@aws-sdk/util-defaults-mode-node": "3.272.0", - "@aws-sdk/util-endpoints": "3.272.0", - "@aws-sdk/util-retry": "3.272.0", - "@aws-sdk/util-user-agent-browser": "3.272.0", - "@aws-sdk/util-user-agent-node": "3.272.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.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.272.0.tgz", - "integrity": "sha512-kigxCxURp3WupufGaL/LABMb7UQfzAQkKcj9royizL3ItJ0vw5kW/JFrPje5IW1mfLgdPF7PI9ShOjE0fCLTqA==", - "optional": true, - "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.272.0", - "@aws-sdk/credential-provider-node": "3.272.0", - "@aws-sdk/fetch-http-handler": "3.272.0", - "@aws-sdk/hash-node": "3.272.0", - "@aws-sdk/invalid-dependency": "3.272.0", - "@aws-sdk/middleware-content-length": "3.272.0", - "@aws-sdk/middleware-endpoint": "3.272.0", - "@aws-sdk/middleware-host-header": "3.272.0", - "@aws-sdk/middleware-logger": "3.272.0", - "@aws-sdk/middleware-recursion-detection": "3.272.0", - "@aws-sdk/middleware-retry": "3.272.0", - "@aws-sdk/middleware-sdk-sts": "3.272.0", - "@aws-sdk/middleware-serde": "3.272.0", - "@aws-sdk/middleware-signing": "3.272.0", - "@aws-sdk/middleware-stack": "3.272.0", - "@aws-sdk/middleware-user-agent": "3.272.0", - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/node-http-handler": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/smithy-client": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/url-parser": "3.272.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.272.0", - "@aws-sdk/util-defaults-mode-node": "3.272.0", - "@aws-sdk/util-endpoints": "3.272.0", - "@aws-sdk/util-retry": "3.272.0", - "@aws-sdk/util-user-agent-browser": "3.272.0", - "@aws-sdk/util-user-agent-node": "3.272.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.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.272.0.tgz", - "integrity": "sha512-Dr4CffRVNsOp3LRNdpvcH6XuSgXOSLblWliCy/5I86cNl567KVMxujVx6uPrdTXYs2h1rt3MNl6jQGnAiJeTbw==", - "optional": true, - "dependencies": { - "@aws-sdk/signature-v4": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/util-config-provider": "3.208.0", - "@aws-sdk/util-middleware": "3.272.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.272.0.tgz", - "integrity": "sha512-rVx0rtQjbiYCM0nah2rB/2ut2YJYPpRr1AbW/Hd4r/PI+yiusrmXAwuT4HIW2yr34zsQMPi1jZ3WHN9Rn9mzlg==", - "optional": true, - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.272.0.tgz", - "integrity": "sha512-QI65NbLnKLYHyTYhXaaUrq6eVsCCrMUb05WDA7+TJkWkjXesovpjc8vUKgFiLSxmgKmb2uOhHNcDyObKMrYQFw==", - "optional": true, - "dependencies": { - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-imds": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.272.0.tgz", - "integrity": "sha512-wwAfVY1jTFQEfxVfdYD5r5ieYGl+0g4nhekVxNMqE8E1JeRDd18OqiwAflzpgBIqxfqvCUkf+vl5JYyacMkNAQ==", - "optional": true, - "dependencies": { - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/url-parser": "3.272.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.272.0.tgz", - "integrity": "sha512-iE3CDzK5NcupHYjfYjBdY1JCy8NLEoRUsboEjG0i0gy3S3jVpDeVHX1dLVcL/slBFj6GiM7SoNV/UfKnJf3Gaw==", - "optional": true, - "dependencies": { - "@aws-sdk/credential-provider-env": "3.272.0", - "@aws-sdk/credential-provider-imds": "3.272.0", - "@aws-sdk/credential-provider-process": "3.272.0", - "@aws-sdk/credential-provider-sso": "3.272.0", - "@aws-sdk/credential-provider-web-identity": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.272.0.tgz", - "integrity": "sha512-FI8uvwM1IxiRSvbkdKv8DZG5vxU3ezaseTaB1fHWTxEUFb0pWIoHX9oeOKer9Fj31SOZTCNAaYFURbSRuZlm/w==", - "optional": true, - "dependencies": { - "@aws-sdk/credential-provider-env": "3.272.0", - "@aws-sdk/credential-provider-imds": "3.272.0", - "@aws-sdk/credential-provider-ini": "3.272.0", - "@aws-sdk/credential-provider-process": "3.272.0", - "@aws-sdk/credential-provider-sso": "3.272.0", - "@aws-sdk/credential-provider-web-identity": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.272.0.tgz", - "integrity": "sha512-hiCAjWWm2PeBFp5cjkxqyam/XADjiS+e7GzwC34TbZn3LisS0uoweLojj9tD11NnnUhyhbLteUvu5+rotOLwrg==", - "optional": true, - "dependencies": { - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.272.0.tgz", - "integrity": "sha512-hwYaulyiU/7chKKFecxCeo0ls6Dxs7h+5EtoYcJJGvfpvCncyOZF35t00OAsCd3Wo7HkhhgfpGdb6dmvCNQAZQ==", - "optional": true, - "dependencies": { - "@aws-sdk/client-sso": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/token-providers": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.272.0.tgz", - "integrity": "sha512-ImrHMkcgneGa/HadHAQXPwOrX26sAKuB8qlMxZF/ZCM2B55u8deY+ZVkVuraeKb7YsahMGehPFOfRAF6mvFI5Q==", - "optional": true, - "dependencies": { - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/credential-providers": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.272.0.tgz", - "integrity": "sha512-ucd6Xq6aBMf+nM4uz5zkjL11mwaE5BV1Q4hkulaGu2v1dRA8n6zhLJk/sb4hOJ7leelqMJMErlbQ2T3MkYvlJQ==", - "optional": true, - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.272.0", - "@aws-sdk/client-sso": "3.272.0", - "@aws-sdk/client-sts": "3.272.0", - "@aws-sdk/credential-provider-cognito-identity": "3.272.0", - "@aws-sdk/credential-provider-env": "3.272.0", - "@aws-sdk/credential-provider-imds": "3.272.0", - "@aws-sdk/credential-provider-ini": "3.272.0", - "@aws-sdk/credential-provider-node": "3.272.0", - "@aws-sdk/credential-provider-process": "3.272.0", - "@aws-sdk/credential-provider-sso": "3.272.0", - "@aws-sdk/credential-provider-web-identity": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/fetch-http-handler": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.272.0.tgz", - "integrity": "sha512-1Qhm9e0RbS1Xf4CZqUbQyUMkDLd7GrsRXWIvm9b86/vgeV8/WnjO3CMue9D51nYgcyQORhYXv6uVjAYCWbUExA==", - "optional": true, - "dependencies": { - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/querystring-builder": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/util-base64": "3.208.0", - "tslib": "^2.3.1" - } - }, - "node_modules/@aws-sdk/hash-node": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.272.0.tgz", - "integrity": "sha512-40dwND+iAm3VtPHPZu7/+CIdVJFk2s0cWZt1lOiMPMSXycSYJ45wMk7Lly3uoqRx0uWfFK5iT2OCv+fJi5jTng==", - "optional": true, - "dependencies": { - "@aws-sdk/types": "3.272.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.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.272.0.tgz", - "integrity": "sha512-ysW6wbjl1Y78txHUQ/Tldj2Rg1BI7rpMO9B9xAF6yAX3mQ7t6SUPQG/ewOGvH2208NBIl3qP5e/hDf0Q6r/1iw==", - "optional": true, - "dependencies": { - "@aws-sdk/types": "3.272.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.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.272.0.tgz", - "integrity": "sha512-sAbDZSTNmLX+UTGwlUHJBWy0QGQkiClpHwVFXACon+aG0ySLNeRKEVYs6NCPYldw4cj6hveLUn50cX44ukHErw==", - "optional": true, - "dependencies": { - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-endpoint": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.272.0.tgz", - "integrity": "sha512-Dk3JVjj7SxxoUKv3xGiOeBksvPtFhTDrVW75XJ98Ymv8gJH5L1sq4hIeJAHRKogGiRFq2J73mnZSlM9FVXEylg==", - "optional": true, - "dependencies": { - "@aws-sdk/middleware-serde": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/signature-v4": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/url-parser": "3.272.0", - "@aws-sdk/util-config-provider": "3.208.0", - "@aws-sdk/util-middleware": "3.272.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.272.0.tgz", - "integrity": "sha512-Q8K7bMMFZnioUXpxn57HIt4p+I63XaNAawMLIZ5B4F2piyukbQeM9q2XVKMGwqLvijHR8CyP5nHrtKqVuINogQ==", - "optional": true, - "dependencies": { - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-logger": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.272.0.tgz", - "integrity": "sha512-u2SQ0hWrFwxbxxYMG5uMEgf01pQY5jauK/LYWgGIvuCmFgiyRQQP3oN7kkmsxnS9MWmNmhbyQguX2NY02s5e9w==", - "optional": true, - "dependencies": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.272.0.tgz", - "integrity": "sha512-Gp/eKWeUWVNiiBdmUM2qLkBv+VLSJKoWAO+aKmyxxwjjmWhE0FrfA1NQ1a3g+NGMhRbAfQdaYswRAKsul70ISg==", - "optional": true, - "dependencies": { - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-retry": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.272.0.tgz", - "integrity": "sha512-pCGvHM7C76VbO/dFerH+Vwf7tGv7j+e+eGrvhQ35mRghCtfIou/WMfTZlD1TNee93crrAQQVZKjtW3dMB3WCzg==", - "optional": true, - "dependencies": { - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/service-error-classification": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/util-middleware": "3.272.0", - "@aws-sdk/util-retry": "3.272.0", - "tslib": "^2.3.1", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-sdk-sts": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.272.0.tgz", - "integrity": "sha512-VvYPg7LrDIjUOWueSzo2wBzcNG7dw+cmzV6zAKaLxf0RC5jeAP4hE0OzDiiZfDrjNghEzgq/V+0NO+LewqYL9Q==", - "optional": true, - "dependencies": { - "@aws-sdk/middleware-signing": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/signature-v4": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-serde": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.272.0.tgz", - "integrity": "sha512-kW1uOxgPSwtXPB5rm3QLdWomu42lkYpQL94tM1BjyFOWmBLO2lQhk5a7Dw6HkTozT9a+vxtscLChRa6KZe61Hw==", - "optional": true, - "dependencies": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-signing": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.272.0.tgz", - "integrity": "sha512-4LChFK4VAR91X+dupqM8fQqYhFGE0G4Bf9rQlVTgGSbi2KUOmpqXzH0/WKE228nKuEhmH8+Qd2VPSAE2JcyAUA==", - "optional": true, - "dependencies": { - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/signature-v4": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/util-middleware": "3.272.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-stack": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.272.0.tgz", - "integrity": "sha512-jhwhknnPBGhfXAGV5GXUWfEhDFoP/DN8MPCO2yC5OAxyp6oVJ8lTPLkZYMTW5VL0c0eG44dXpF4Ib01V+PlDrQ==", - "optional": true, - "dependencies": { - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.272.0.tgz", - "integrity": "sha512-Qy7/0fsDJxY5l0bEk7WKDfqb4Os/sCAgFR2zEvrhDtbkhYPf72ysvg/nRUTncmCbo8tOok4SJii2myk8KMfjjw==", - "optional": true, - "dependencies": { - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/node-config-provider": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.272.0.tgz", - "integrity": "sha512-YYCIBh9g1EQo7hm2l22HX5Yr9RoPQ2RCvhzKvF1n1e8t1QH4iObQrYUtqHG4khcm64Cft8C5MwZmgzHbya5Z6Q==", - "optional": true, - "dependencies": { - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/node-http-handler": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.272.0.tgz", - "integrity": "sha512-VrW9PjhhngeyYp4yGYPe5S0vgZH6NwU3Po9xAgayUeE37Inr7LS1YteFMHdpgsUUeNXnh7d06CXqHo1XjtqOKA==", - "optional": true, - "dependencies": { - "@aws-sdk/abort-controller": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/querystring-builder": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/property-provider": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.272.0.tgz", - "integrity": "sha512-V1pZTaH5eqpAt8O8CzbItHhOtzIfFuWymvwZFkAtwKuaHpnl7jjrTouV482zoq8AD/fF+VVSshwBKYA7bhidIw==", - "optional": true, - "dependencies": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/protocol-http": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.272.0.tgz", - "integrity": "sha512-4JQ54v5Yn08jspNDeHo45CaSn1CvTJqS1Ywgr79eU6jBExtguOWv6LNtwVSBD9X37v88iqaxt8iu1Z3pZZAJeg==", - "optional": true, - "dependencies": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/querystring-builder": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.272.0.tgz", - "integrity": "sha512-ndo++7GkdCj5tBXE6rGcITpSpZS4PfyV38wntGYAlj9liL1omk3bLZRY6uzqqkJpVHqbg2fD7O2qHNItzZgqhw==", - "optional": true, - "dependencies": { - "@aws-sdk/types": "3.272.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.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.272.0.tgz", - "integrity": "sha512-5oS4/9n6N1LZW9tI3qq/0GnCuWoOXRgcHVB+AJLRBvDbEe+GI+C/xK1tKLsfpDNgsQJHc4IPQoIt4megyZ/1+A==", - "optional": true, - "dependencies": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/service-error-classification": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.272.0.tgz", - "integrity": "sha512-REoltM1LK9byyIufLqx9znhSolPcHQgVHIA2S0zu5sdt5qER4OubkLAXuo4MBbisUTmh8VOOvIyUb5ijZCXq1w==", - "optional": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/shared-ini-file-loader": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.272.0.tgz", - "integrity": "sha512-lzFPohp5sy2XvwFjZIzLVCRpC0i5cwBiaXmFzXYQZJm6FSCszHO4ax+m9yrtlyVFF/2YPWl+/bzNthy4aJtseA==", - "optional": true, - "dependencies": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.272.0.tgz", - "integrity": "sha512-pWxnHG1NqJWMwlhJ6NHNiUikOL00DHROmxah6krJPMPq4I3am2KY2Rs/8ouWhnEXKaHAv4EQhSALJ+7Mq5S4/A==", - "optional": true, - "dependencies": { - "@aws-sdk/is-array-buffer": "3.201.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/util-hex-encoding": "3.201.0", - "@aws-sdk/util-middleware": "3.272.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.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.272.0.tgz", - "integrity": "sha512-pvdleJ3kaRvyRw2pIZnqL85ZlWBOZrPKmR9I69GCvlyrfdjRBhbSjIEZ+sdhZudw0vdHxq25AGoLUXhofVLf5Q==", - "optional": true, - "dependencies": { - "@aws-sdk/middleware-stack": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/token-providers": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.272.0.tgz", - "integrity": "sha512-0GISJ4IKN2rXvbSddB775VjBGSKhYIGQnAdMqbvxi9LB6pSvVxcH9aIL28G0spiuL+dy3yGQZ8RlJPAyP9JW9A==", - "optional": true, - "dependencies": { - "@aws-sdk/client-sso-oidc": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/types": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.272.0.tgz", - "integrity": "sha512-MmmL6vxMGP5Bsi+4wRx4mxYlU/LX6M0noOXrDh/x5FfG7/4ZOar/nDxqDadhJtNM88cuWVHZWY59P54JzkGWmA==", - "optional": true, - "dependencies": { - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/url-parser": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.272.0.tgz", - "integrity": "sha512-vX/Tx02PlnQ/Kgtf5TnrNDHPNbY+amLZjW0Z1d9vzAvSZhQ4i9Y18yxoRDIaDTCNVRDjdhV8iuctW+05PB5JtQ==", - "optional": true, - "dependencies": { - "@aws-sdk/querystring-parser": "3.272.0", - "@aws-sdk/types": "3.272.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.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.272.0.tgz", - "integrity": "sha512-W8ZVJSZRuUBg8l0JEZzUc+9fKlthVp/cdE+pFeF8ArhZelOLCiaeCrMaZAeJusaFzIpa6cmOYQAjtSMVyrwRtg==", - "optional": true, - "dependencies": { - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/types": "3.272.0", - "bowser": "^2.11.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@aws-sdk/util-defaults-mode-node": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.272.0.tgz", - "integrity": "sha512-U0NTcbMw6KFk7uz/avBmfxQSTREEiX6JDMH68oN/3ux4AICd2I4jHyxnloSWGuiER1FxZf1dEJ8ZTwy8Ibl21Q==", - "optional": true, - "dependencies": { - "@aws-sdk/config-resolver": "3.272.0", - "@aws-sdk/credential-provider-imds": "3.272.0", - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@aws-sdk/util-endpoints": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.272.0.tgz", - "integrity": "sha512-c4MPUaJt2G6gGpoiwIOqDfUa98c1J63RpYvf/spQEKOtC/tF5Gfqlxuq8FnAl5lHnrqj1B9ZXLLxFhHtDR0IiQ==", - "optional": true, - "dependencies": { - "@aws-sdk/types": "3.272.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.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.272.0.tgz", - "integrity": "sha512-Abw8m30arbwxqmeMMha5J11ESpHUNmCeSqSzE8/C4B8jZQtHY4kq7f+upzcNIQ11lsd+uzBEzNG3+dDRi0XOJQ==", - "optional": true, - "dependencies": { - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/util-retry": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.272.0.tgz", - "integrity": "sha512-Ngha5414LR4gRHURVKC9ZYXsEJhMkm+SJ+44wlzOhavglfdcKKPUsibz5cKY1jpUV7oKECwaxHWpBB8r6h+hOg==", - "optional": true, - "dependencies": { - "@aws-sdk/service-error-classification": "3.272.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.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.272.0.tgz", - "integrity": "sha512-Lp5QX5bH6uuwBlIdr7w7OAcAI50ttyskb++yUr9i+SPvj6RI2dsfIBaK4mDg1qUdM5LeUdvIyqwj3XHjFKAAvA==", - "optional": true, - "dependencies": { - "@aws-sdk/types": "3.272.0", - "bowser": "^2.11.0", - "tslib": "^2.3.1" - } - }, - "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.272.0.tgz", - "integrity": "sha512-ljK+R3l+Q1LIHrcR+Knhk0rmcSkfFadZ8V+crEGpABf/QUQRg7NkZMsoe814tfBO5F7tMxo8wwwSdaVNNHtoRA==", - "optional": true, - "dependencies": { - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/types": "3.272.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/@esbuild/android-arm": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.4.tgz", - "integrity": "sha512-R9GCe2xl2XDSc2XbQB63mFiFXHIVkOP+ltIxICKXqUPrFX97z6Z7vONCLQM1pSOLGqfLrGi3B7nbhxmFY/fomg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.4.tgz", - "integrity": "sha512-91VwDrl4EpxBCiG6h2LZZEkuNvVZYJkv2T9gyLG/mhGG1qrM7i5SwUcg/hlSPnL/4hDT0TFcF35/XMGSn0bemg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.4.tgz", - "integrity": "sha512-mGSqhEPL7029XL7QHNPxPs15JVa02hvZvysUcyMP9UXdGFwncl2WU0bqx+Ysgzd+WAbv8rfNa73QveOxAnAM2w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.4.tgz", - "integrity": "sha512-tTyJRM9dHvlMPt1KrBFVB5OW1kXOsRNvAPtbzoKazd5RhD5/wKlXk1qR2MpaZRYwf4WDMadt0Pv0GwxB41CVow==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.4.tgz", - "integrity": "sha512-phQuC2Imrb3TjOJwLN8EO50nb2FHe8Ew0OwgZDH1SV6asIPGudnwTQtighDF2EAYlXChLoMJwqjAp4vAaACq6w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.4.tgz", - "integrity": "sha512-oH6JUZkocgmjzzYaP5juERLpJQSwazdjZrTPgLRmAU2bzJ688x0vfMB/WTv4r58RiecdHvXOPC46VtsMy/mepg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.4.tgz", - "integrity": "sha512-U4iWGn/9TrAfpAdfd56eO0pRxIgb0a8Wj9jClrhT8hvZnOnS4dfMPW7o4fn15D/KqoiVYHRm43jjBaTt3g/2KA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.4.tgz", - "integrity": "sha512-S2s9xWTGMTa/fG5EyMGDeL0wrWVgOSQcNddJWgu6rG1NCSXJHs76ZP9AsxjB3f2nZow9fWOyApklIgiTGZKhiw==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.4.tgz", - "integrity": "sha512-UkGfQvYlwOaeYJzZG4cLV0hCASzQZnKNktRXUo3/BMZvdau40AOz9GzmGA063n1piq6VrFFh43apRDQx8hMP2w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.4.tgz", - "integrity": "sha512-3lqFi4VFo/Vwvn77FZXeLd0ctolIJH/uXkH3yNgEk89Eh6D3XXAC9/iTPEzeEpsNE5IqGIsFa5Z0iPeOh25IyA==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.4.tgz", - "integrity": "sha512-HqpWZkVslDHIwdQ9D+gk7NuAulgQvRxF9no54ut/M55KEb3mi7sQS3GwpPJzSyzzP0UkjQVN7/tbk88/CaX4EQ==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.4.tgz", - "integrity": "sha512-d/nMCKKh/SVDbqR9ju+b78vOr0tNXtfBjcp5vfHONCCOAL9ad8gN9dC/u+UnH939pz7wO+0u/x9y1MaZcb/lKA==", - "cpu": [ - "mips64el" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.4.tgz", - "integrity": "sha512-lOD9p2dmjZcNiTU+sGe9Nn6G3aYw3k0HBJies1PU0j5IGfp6tdKOQ6mzfACRFCqXjnBuTqK7eTYpwx09O5LLfg==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.4.tgz", - "integrity": "sha512-mTGnwWwVshAjGsd8rP+K6583cPDgxOunsqqldEYij7T5/ysluMHKqUIT4TJHfrDFadUwrghAL6QjER4FeqQXoA==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.4.tgz", - "integrity": "sha512-AQYuUGp50XM29/N/dehADxvc2bUqDcoqrVuijop1Wv72SyxT6dDB9wjUxuPZm2HwIM876UoNNBMVd+iX/UTKVQ==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.4.tgz", - "integrity": "sha512-+AsFBwKgQuhV2shfGgA9YloxLDVjXgUEWZum7glR5lLmV94IThu/u2JZGxTgjYby6kyXEx8lKOqP5rTEVBR0Rw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.4.tgz", - "integrity": "sha512-zD1TKYX9553OiLS/qkXPMlWoELYkH/VkzRYNKEU+GwFiqkq0SuxsKnsCg5UCdxN3cqd+1KZ8SS3R+WG/Hxy2jQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.4.tgz", - "integrity": "sha512-PY1NjEsLRhPEFFg1AV0/4Or/gR+q2dOb9s5rXcPuCjyHRzbt8vnHJl3vYj+641TgWZzTFmSUnZbzs1zwTzjeqw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.4.tgz", - "integrity": "sha512-B3Z7s8QZQW9tKGleMRXvVmwwLPAUoDCHs4WZ2ElVMWiortLJFowU1NjAhXOKjDgC7o9ByeVcwyOlJ+F2r6ZgmQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.4.tgz", - "integrity": "sha512-0HCu8R3mY/H5V7N6kdlsJkvrT591bO/oRZy8ztF1dhgNU5xD5tAh5bKByT1UjTGjp/VVBsl1PDQ3L18SfvtnBQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.4.tgz", - "integrity": "sha512-VUjhVDQycse1gLbe06pC/uaA0M+piQXJpdpNdhg8sPmeIZZqu5xPoGWVCmcsOO2gaM2cywuTYTHkXRozo3/Nkg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.4.tgz", - "integrity": "sha512-0kLAjs+xN5OjhTt/aUA6t48SfENSCKgGPfExADYTOo/UCn0ivxos9/anUVeSfg+L+2O9xkFxvJXIJfG+Q4sYSg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", - "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/@mfd/rbxdatastoreservice": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/@mfd/rbxdatastoreservice/-/rbxdatastoreservice-2.3.11.tgz", - "integrity": "sha512-sZkBwBolSwHT2RDz4//7K0Vkxdjo2Zg1RSdSaUasTUKWj+BMeANgyLv/baMFHcJFE/Z+3kCcCkU/VHqfiQAHgA==", - "hasInstallScript": true, - "dependencies": { - "axios": "^0.27.2", - "crypto-js": "^4.0.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@redis/bloom": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", - "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==", - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, - "node_modules/@redis/client": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.6.tgz", - "integrity": "sha512-dFD1S6je+A47Lj22jN/upVU2fj4huR7S9APd7/ziUXsIXDL+11GPYti4Suv5y8FuXaN+0ZG4JF+y1houEJ7ToA==", - "dependencies": { - "cluster-key-slot": "1.1.2", - "generic-pool": "3.9.0", - "yallist": "4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@redis/graph": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz", - "integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==", - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, - "node_modules/@redis/json": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz", - "integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==", - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, - "node_modules/@redis/search": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.2.tgz", - "integrity": "sha512-/cMfstG/fOh/SsE+4/BQGeuH/JJloeWuH+qJzM8dbxuWvdWibWAOAHHCZTMPhV3xIlH4/cUEIA8OV5QnYpaVoA==", - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, - "node_modules/@redis/time-series": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz", - "integrity": "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==", - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, - "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/@yaireo/relative-time": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@yaireo/relative-time/-/relative-time-1.0.3.tgz", - "integrity": "sha512-CJGxyWjb4SnkqubyfiPNQeg0YrJKnVu+11DOP65ltXFxDsjjnm3IByXS9O1Ny9AU9Oxqg0a7Gt26tzXtcijicg==" - }, - "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==" - }, - "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": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dependencies": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - } - }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "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==", - "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==", - "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==" - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "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==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "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/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.13", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", - "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - ], - "peer": true, - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001426", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/axios": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", - "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", - "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" - } - }, - "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/base32.js": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/base32.js/-/base32.js-0.0.1.tgz", - "integrity": "sha512-EGHIRiegFa62/SsA1J+Xs2tIzludPdzM064N9wjbiEgHnGnJ1V0WEpA4pEwCYT5nDvZk3ubf0shqaCS7k6xeUQ==" - }, - "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/bcrypt": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.0.tgz", - "integrity": "sha512-RHBS7HI5N5tEnGTmtR/pppX0mmDSBpQ4aCBsj7CEQfYXDcO74A8sIBYcJMuCsis2E81zDxeENYhv66oZwLiA+Q==", - "hasInstallScript": true, - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.10", - "node-addon-api": "^5.0.0" - }, - "engines": { - "node": ">= 10.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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/bintrees": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz", - "integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==" - }, - "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/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "peer": true, - "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "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/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "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/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001441", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz", - "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ], - "peer": true - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "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/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/cluster-key-slot": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", - "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.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/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "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/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "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/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" - }, - "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.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-parser": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", - "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", - "dependencies": { - "cookie": "0.4.1", - "cookie-signature": "1.0.6" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "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-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-js": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", - "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" - }, - "node_modules/css-selector-tokenizer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz", - "integrity": "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==", - "dependencies": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssfilter": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", - "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==" - }, - "node_modules/daisyui": { - "version": "2.46.1", - "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-2.46.1.tgz", - "integrity": "sha512-i59+nLuzzPAVOhNhot3KLtt6stfYeCIPXs9uiLcpXjykpqxHfBA3W6hQWOUWPMwfqhyQd0WKub3sydtPGjzLtA==", - "dependencies": { - "color": "^4.2", - "css-selector-tokenizer": "^0.8.0", - "postcss-js": "^4.0.0", - "tailwindcss": "^3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/daisyui" - }, - "peerDependencies": { - "autoprefixer": "^10.0.2", - "postcss": "^8.1.6" - } - }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", - "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==", - "engines": { - "node": ">= 12" - } - }, - "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/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/defined": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", - "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" - }, - "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/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/detective": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", - "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", - "dependencies": { - "acorn-node": "^1.8.2", - "defined": "^1.0.0", - "minimist": "^1.2.6" - }, - "bin": { - "detective": "bin/detective.js" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" - }, - "node_modules/dijkstrajs": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.2.tgz", - "integrity": "sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg==" - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" - }, - "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/easy-soap-request": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/easy-soap-request/-/easy-soap-request-4.8.0.tgz", - "integrity": "sha512-fD1NXRv14P4IdAoyYpGJ2kB+292vYfvU7qLbmUw2x2HA+U74LWVyErjyNf2Jxn1mUAwp+sRdMlkmrUrPY0/wAg==", - "dependencies": { - "axios": "^0.27.2" - } - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "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/electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", - "peer": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/encode-utf8": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", - "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==" - }, - "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/esbuild": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.4.tgz", - "integrity": "sha512-zBn9MeCwT7W5F1a3lXClD61ip6vQM+H8Msb0w8zMT4ZKBpDg+rFAraNyWCDelB/2L6M3g6AXHPnsyvjMFnxtFw==", - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.17.4", - "@esbuild/android-arm64": "0.17.4", - "@esbuild/android-x64": "0.17.4", - "@esbuild/darwin-arm64": "0.17.4", - "@esbuild/darwin-x64": "0.17.4", - "@esbuild/freebsd-arm64": "0.17.4", - "@esbuild/freebsd-x64": "0.17.4", - "@esbuild/linux-arm": "0.17.4", - "@esbuild/linux-arm64": "0.17.4", - "@esbuild/linux-ia32": "0.17.4", - "@esbuild/linux-loong64": "0.17.4", - "@esbuild/linux-mips64el": "0.17.4", - "@esbuild/linux-ppc64": "0.17.4", - "@esbuild/linux-riscv64": "0.17.4", - "@esbuild/linux-s390x": "0.17.4", - "@esbuild/linux-x64": "0.17.4", - "@esbuild/netbsd-x64": "0.17.4", - "@esbuild/openbsd-x64": "0.17.4", - "@esbuild/sunos-x64": "0.17.4", - "@esbuild/win32-arm64": "0.17.4", - "@esbuild/win32-ia32": "0.17.4", - "@esbuild/win32-x64": "0.17.4" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "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/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-flash-message": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/express-flash-message/-/express-flash-message-2.1.0.tgz", - "integrity": "sha512-oR/cwzt7CfjSUt7XwEZCCyOegylHuTF8/by6+jAshZh2TzREqDIjfU0JU5M6usurSk/ep3lUxxyaCbujyERyTQ==" - }, - "node_modules/express-prom-bundle": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/express-prom-bundle/-/express-prom-bundle-6.6.0.tgz", - "integrity": "sha512-tZh2P2p5a8/yxQ5VbRav011Poa4R0mHqdFwn9Swe/obXDe5F0jY9wtRAfNYnqk4LXY7akyvR/nrvAHxQPWUjsQ==", - "dependencies": { - "on-finished": "^2.3.0", - "url-value-parser": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "prom-client": ">=12.0.0" - } - }, - "node_modules/express-rate-limit": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.7.0.tgz", - "integrity": "sha512-vhwIdRoqcYB/72TK3tRZI+0ttS8Ytrk24GfmsxDXK9o9IhHNO5bXRiXQSExPQ4GbaE5tvIS7j1SGrxsuWs+sGA==", - "engines": { - "node": ">= 12.9.0" - }, - "peerDependencies": { - "express": "^4 || ^5" - } - }, - "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/express/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/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "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/fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } - }, - "node_modules/file-type-checker": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/file-type-checker/-/file-type-checker-1.0.4.tgz", - "integrity": "sha512-hhleilG34kfSjlSfAAj8DVvqXxMwEIVY/pkWnkMVbqdmly6jUv7jjNw/dmvdcbMt6joXlQgavCJCtNDRzODOsQ==" - }, - "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==", - "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/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "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/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", - "peer": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/infusion" - } - }, - "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-memo": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fs-memo/-/fs-memo-1.2.0.tgz", - "integrity": "sha512-YEexkCpL4j03jn5SxaMHqcO6IuWuqm8JFUYhyCep7Ao89JIYmB8xoKhK7zXXJ9cCaNXpyNH5L3QtAmoxjoHW2w==" - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.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/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/generic-pool": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", - "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "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-port": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-6.1.2.tgz", - "integrity": "sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-port-please": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-2.6.1.tgz", - "integrity": "sha512-4PDSrL6+cuMM1xs6w36ZIkaKzzE0xzfVBCfebHIJ3FE8iB9oic/ECwPw3iNiD4h1AoJ5XLLBhEviFAVrZsDC5A==", - "dependencies": { - "fs-memo": "^1.2.0" - } - }, - "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==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "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": "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/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/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" - }, - "node_modules/helmet": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/helmet/-/helmet-5.1.1.tgz", - "integrity": "sha512-/yX0oVZBggA9cLJh8aw3PPCfedBnbd7J2aowjzsaWwZh7/UFY0nccn/aHAggIgWUFfnykX8GKd3a1pSbrmlcVQ==", - "engines": { - "node": ">=12.0.0" - } - }, - "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/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==", - "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==", - "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==" - }, - "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/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "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-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "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==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "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==", - "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==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/jsonpath-plus": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz", - "integrity": "sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/jsonwebtoken": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", - "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", - "dependencies": { - "jws": "^3.2.2", - "lodash": "^4.17.21", - "ms": "^2.1.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jsonwebtoken/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/just-clone": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/just-clone/-/just-clone-6.2.0.tgz", - "integrity": "sha512-1IynUYEc/HAwxhi3WDpIpxJbZpMCvvrrmZVqvj9EhpvbH8lls7HhdhiByjL7DkAaWlLIzpC0Xc/VPvy/UxLNjA==" - }, - "node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "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/lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", - "engines": { - "node": ">=10" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.foreach": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==" - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "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/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "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/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.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/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz", - "integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mongo-sanitize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mongo-sanitize/-/mongo-sanitize-1.1.0.tgz", - "integrity": "sha512-6gB9AiJD+om2eZLxaPKIP5Q8P3Fr+s+17rVWso7hU0+MAzmIvIMlgTYuyvalDLTtE/p0gczcvJ8A3pbN1XmQ/A==" - }, - "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-unique-validator": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mongoose-unique-validator/-/mongoose-unique-validator-3.1.0.tgz", - "integrity": "sha512-UsBBlFapip8gc8x1h+nLWnkOy+GTy9Z+zmTyZ35icLV3EoLIVz180vJzepfMM9yBy2AJh+maeuoM8CWtqejGUg==", - "dependencies": { - "lodash.foreach": "^4.1.0", - "lodash.get": "^4.0.2", - "lodash.merge": "^4.6.2" - }, - "peerDependencies": { - "mongoose": "^6.0.0" - } - }, - "node_modules/mongoose/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/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.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/multer": { - "version": "1.4.5-lts.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", - "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", - "dependencies": { - "append-field": "^1.0.0", - "busboy": "^1.0.0", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.4", - "object-assign": "^4.1.1", - "type-is": "^1.6.4", - "xtend": "^4.0.0" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "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/node-addon-api": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz", - "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==" - }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "engines": { - "node": ">=10.5.0" - } - }, - "node_modules/node-fetch": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.0.tgz", - "integrity": "sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==", - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, - "node_modules/node-releases": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", - "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", - "peer": true - }, - "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/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "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/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/nodemon/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==", - "dev": true - }, - "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/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "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==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "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/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "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/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "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/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/png-validator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/png-validator/-/png-validator-1.1.0.tgz", - "integrity": "sha512-MlRLyPI1p3/dJbsjVH+4xOPucycrz8T3EvO0BzCXaNtrUhZkZROtzib9J6mnC81AJO8eBIwiDZwTFel2cMmSuQ==" - }, - "node_modules/pngjs": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", - "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/postcss": { - "version": "8.4.20", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.20.tgz", - "integrity": "sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], - "dependencies": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", - "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", - "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.3.3" - } - }, - "node_modules/postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - }, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", - "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/prom-client": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-14.1.1.tgz", - "integrity": "sha512-hFU32q7UZQ59bVJQGUtm3I2PrJ3gWvoCkilX9sF165ks1qflhugVCeK+S1JjJYHvyt3o5kj68+q3bchormjnzw==", - "dependencies": { - "tdigest": "^0.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "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/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/qrcode": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.1.tgz", - "integrity": "sha512-nS8NJ1Z3md8uTjKtP+SGGhfqmTCs5flU/xR623oI0JX+Wepz9R8UrRVCTBTJm3qGw3rH6jJ6MUHjkDx15cxSSg==", - "dependencies": { - "dijkstrajs": "^1.0.1", - "encode-utf8": "^1.0.3", - "pngjs": "^5.0.0", - "yargs": "^15.3.1" - }, - "bin": { - "qrcode": "bin/qrcode" - }, - "engines": { - "node": ">=10.13.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/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "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/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/redis": { - "version": "4.6.5", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.5.tgz", - "integrity": "sha512-O0OWA36gDQbswOdUuAhRL6mTZpHFN525HlgZgDaVNgCJIAZR3ya06NTESb0R+TUZ+BFaDpz6NnnVvoMx9meUFg==", - "dependencies": { - "@redis/bloom": "1.2.0", - "@redis/client": "1.5.6", - "@redis/graph": "1.1.0", - "@redis/json": "1.0.4", - "@redis/search": "1.1.2", - "@redis/time-series": "1.0.4" - } - }, - "node_modules/redis-om": { - "version": "0.4.0-beta.3", - "resolved": "https://registry.npmjs.org/redis-om/-/redis-om-0.4.0-beta.3.tgz", - "integrity": "sha512-zGWBMGoe3exrvkbFjWqAFG8UJL3tdby5UkfPKiZLvA67d7FsR0ScEpsBaaWGL33y5EQUWnYL+pI8jzZaQ6brtA==", - "dependencies": { - "jsonpath-plus": "^7.2.0", - "just-clone": "^6.1.1", - "redis": "^4.6.4", - "ulid": "^2.3.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/req-flash": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/req-flash/-/req-flash-0.0.3.tgz", - "integrity": "sha512-c5ouPRJ6OVc4ecL5cgdwd51nYOFQiOTfl7UWk+VlgUHgfsh7TMRFPN/OJ5ETnOYFyswprT8C2a6ctMvJgms9ng==" - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/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/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/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/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "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": { - "queue-microtask": "^1.2.2" - } - }, - "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/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "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/send/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/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/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "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/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "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/speakeasy": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/speakeasy/-/speakeasy-2.0.0.tgz", - "integrity": "sha512-lW2A2s5LKi8rwu77ewisuUOtlCydF/hmQSOJjpTqTj1gZLkNgTaYnyvfxy2WBr4T/h+9c4g8HIITfj83OkFQFw==", - "dependencies": { - "base32.js": "0.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "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/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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": "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/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tailwindcss": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz", - "integrity": "sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==", - "dependencies": { - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "color-name": "^1.1.4", - "detective": "^5.2.1", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.12", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "lilconfig": "^2.0.6", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.18", - "postcss-import": "^14.1.0", - "postcss-js": "^4.0.0", - "postcss-load-config": "^3.1.4", - "postcss-nested": "6.0.0", - "postcss-selector-parser": "^6.0.10", - "postcss-value-parser": "^4.2.0", - "quick-lru": "^5.1.1", - "resolve": "^1.22.1" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/tailwindcss/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/tar": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", - "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tdigest": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz", - "integrity": "sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==", - "dependencies": { - "bintrees": "1.0.2" - } - }, - "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==", - "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/touch/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/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-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/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" - }, - "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/ulid": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ulid/-/ulid-2.3.0.tgz", - "integrity": "sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw==", - "bin": { - "ulid": "bin/cli.js" - } - }, - "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/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/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "peer": true, - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/url-value-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/url-value-parser/-/url-value-parser-2.2.0.tgz", - "integrity": "sha512-yIQdxJpgkPamPPAPuGdS7Q548rLhny42tg8d4vyTNzFqvOnwqrgHXvgehT09U7fwrzxi3RxCiXjoNUNnNOlQ8A==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "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/web-streams-polyfill": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", - "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", - "engines": { - "node": ">= 8" - } - }, - "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/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/xml-js": { - "version": "1.6.11", - "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", - "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", - "dependencies": { - "sax": "^1.2.4" - }, - "bin": { - "xml-js": "bin/cli.js" - } - }, - "node_modules/xss": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.14.tgz", - "integrity": "sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw==", - "dependencies": { - "commander": "^2.20.3", - "cssfilter": "0.0.10" - }, - "bin": { - "xss": "bin/xss" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - } - }, - "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.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.272.0.tgz", - "integrity": "sha512-s2TV3phapcTwZNr4qLxbfuQuE9ZMP4RoJdkvRRCkKdm6jslsWLJf2Zlcxti/23hOlINUMYv2iXE2pftIgWGdpg==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/client-cognito-identity": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.272.0.tgz", - "integrity": "sha512-uMjRWcNvX7SoGaVn0mXWD43+Z1awPahQwGW3riDLfXHZdOgw2oFDhD3Jg5jQ8OzQLUfDvArhE3WyZwlS4muMuQ==", - "optional": true, - "requires": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.272.0", - "@aws-sdk/config-resolver": "3.272.0", - "@aws-sdk/credential-provider-node": "3.272.0", - "@aws-sdk/fetch-http-handler": "3.272.0", - "@aws-sdk/hash-node": "3.272.0", - "@aws-sdk/invalid-dependency": "3.272.0", - "@aws-sdk/middleware-content-length": "3.272.0", - "@aws-sdk/middleware-endpoint": "3.272.0", - "@aws-sdk/middleware-host-header": "3.272.0", - "@aws-sdk/middleware-logger": "3.272.0", - "@aws-sdk/middleware-recursion-detection": "3.272.0", - "@aws-sdk/middleware-retry": "3.272.0", - "@aws-sdk/middleware-serde": "3.272.0", - "@aws-sdk/middleware-signing": "3.272.0", - "@aws-sdk/middleware-stack": "3.272.0", - "@aws-sdk/middleware-user-agent": "3.272.0", - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/node-http-handler": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/smithy-client": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/url-parser": "3.272.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.272.0", - "@aws-sdk/util-defaults-mode-node": "3.272.0", - "@aws-sdk/util-endpoints": "3.272.0", - "@aws-sdk/util-retry": "3.272.0", - "@aws-sdk/util-user-agent-browser": "3.272.0", - "@aws-sdk/util-user-agent-node": "3.272.0", - "@aws-sdk/util-utf8": "3.254.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/client-sso": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.272.0.tgz", - "integrity": "sha512-xn9a0IGONwQIARmngThoRhF1lLGjHAD67sUaShgIMaIMc6ipVYN6alWG1VuUpoUQ6iiwMEt0CHdfCyLyUV/fTA==", - "optional": true, - "requires": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.272.0", - "@aws-sdk/fetch-http-handler": "3.272.0", - "@aws-sdk/hash-node": "3.272.0", - "@aws-sdk/invalid-dependency": "3.272.0", - "@aws-sdk/middleware-content-length": "3.272.0", - "@aws-sdk/middleware-endpoint": "3.272.0", - "@aws-sdk/middleware-host-header": "3.272.0", - "@aws-sdk/middleware-logger": "3.272.0", - "@aws-sdk/middleware-recursion-detection": "3.272.0", - "@aws-sdk/middleware-retry": "3.272.0", - "@aws-sdk/middleware-serde": "3.272.0", - "@aws-sdk/middleware-stack": "3.272.0", - "@aws-sdk/middleware-user-agent": "3.272.0", - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/node-http-handler": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/smithy-client": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/url-parser": "3.272.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.272.0", - "@aws-sdk/util-defaults-mode-node": "3.272.0", - "@aws-sdk/util-endpoints": "3.272.0", - "@aws-sdk/util-retry": "3.272.0", - "@aws-sdk/util-user-agent-browser": "3.272.0", - "@aws-sdk/util-user-agent-node": "3.272.0", - "@aws-sdk/util-utf8": "3.254.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/client-sso-oidc": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.272.0.tgz", - "integrity": "sha512-ECcXu3xoa1yggnGKMTh29eWNHiF/wC6r5Uqbla22eOOosyh0+Z6lkJ3JUSLOUKCkBXA4Cs/tJL9UDFBrKbSlvA==", - "optional": true, - "requires": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.272.0", - "@aws-sdk/fetch-http-handler": "3.272.0", - "@aws-sdk/hash-node": "3.272.0", - "@aws-sdk/invalid-dependency": "3.272.0", - "@aws-sdk/middleware-content-length": "3.272.0", - "@aws-sdk/middleware-endpoint": "3.272.0", - "@aws-sdk/middleware-host-header": "3.272.0", - "@aws-sdk/middleware-logger": "3.272.0", - "@aws-sdk/middleware-recursion-detection": "3.272.0", - "@aws-sdk/middleware-retry": "3.272.0", - "@aws-sdk/middleware-serde": "3.272.0", - "@aws-sdk/middleware-stack": "3.272.0", - "@aws-sdk/middleware-user-agent": "3.272.0", - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/node-http-handler": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/smithy-client": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/url-parser": "3.272.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.272.0", - "@aws-sdk/util-defaults-mode-node": "3.272.0", - "@aws-sdk/util-endpoints": "3.272.0", - "@aws-sdk/util-retry": "3.272.0", - "@aws-sdk/util-user-agent-browser": "3.272.0", - "@aws-sdk/util-user-agent-node": "3.272.0", - "@aws-sdk/util-utf8": "3.254.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/client-sts": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.272.0.tgz", - "integrity": "sha512-kigxCxURp3WupufGaL/LABMb7UQfzAQkKcj9royizL3ItJ0vw5kW/JFrPje5IW1mfLgdPF7PI9ShOjE0fCLTqA==", - "optional": true, - "requires": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.272.0", - "@aws-sdk/credential-provider-node": "3.272.0", - "@aws-sdk/fetch-http-handler": "3.272.0", - "@aws-sdk/hash-node": "3.272.0", - "@aws-sdk/invalid-dependency": "3.272.0", - "@aws-sdk/middleware-content-length": "3.272.0", - "@aws-sdk/middleware-endpoint": "3.272.0", - "@aws-sdk/middleware-host-header": "3.272.0", - "@aws-sdk/middleware-logger": "3.272.0", - "@aws-sdk/middleware-recursion-detection": "3.272.0", - "@aws-sdk/middleware-retry": "3.272.0", - "@aws-sdk/middleware-sdk-sts": "3.272.0", - "@aws-sdk/middleware-serde": "3.272.0", - "@aws-sdk/middleware-signing": "3.272.0", - "@aws-sdk/middleware-stack": "3.272.0", - "@aws-sdk/middleware-user-agent": "3.272.0", - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/node-http-handler": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/smithy-client": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/url-parser": "3.272.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.272.0", - "@aws-sdk/util-defaults-mode-node": "3.272.0", - "@aws-sdk/util-endpoints": "3.272.0", - "@aws-sdk/util-retry": "3.272.0", - "@aws-sdk/util-user-agent-browser": "3.272.0", - "@aws-sdk/util-user-agent-node": "3.272.0", - "@aws-sdk/util-utf8": "3.254.0", - "fast-xml-parser": "4.0.11", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/config-resolver": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.272.0.tgz", - "integrity": "sha512-Dr4CffRVNsOp3LRNdpvcH6XuSgXOSLblWliCy/5I86cNl567KVMxujVx6uPrdTXYs2h1rt3MNl6jQGnAiJeTbw==", - "optional": true, - "requires": { - "@aws-sdk/signature-v4": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/util-config-provider": "3.208.0", - "@aws-sdk/util-middleware": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/credential-provider-cognito-identity": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.272.0.tgz", - "integrity": "sha512-rVx0rtQjbiYCM0nah2rB/2ut2YJYPpRr1AbW/Hd4r/PI+yiusrmXAwuT4HIW2yr34zsQMPi1jZ3WHN9Rn9mzlg==", - "optional": true, - "requires": { - "@aws-sdk/client-cognito-identity": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/credential-provider-env": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.272.0.tgz", - "integrity": "sha512-QI65NbLnKLYHyTYhXaaUrq6eVsCCrMUb05WDA7+TJkWkjXesovpjc8vUKgFiLSxmgKmb2uOhHNcDyObKMrYQFw==", - "optional": true, - "requires": { - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/credential-provider-imds": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.272.0.tgz", - "integrity": "sha512-wwAfVY1jTFQEfxVfdYD5r5ieYGl+0g4nhekVxNMqE8E1JeRDd18OqiwAflzpgBIqxfqvCUkf+vl5JYyacMkNAQ==", - "optional": true, - "requires": { - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/url-parser": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/credential-provider-ini": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.272.0.tgz", - "integrity": "sha512-iE3CDzK5NcupHYjfYjBdY1JCy8NLEoRUsboEjG0i0gy3S3jVpDeVHX1dLVcL/slBFj6GiM7SoNV/UfKnJf3Gaw==", - "optional": true, - "requires": { - "@aws-sdk/credential-provider-env": "3.272.0", - "@aws-sdk/credential-provider-imds": "3.272.0", - "@aws-sdk/credential-provider-process": "3.272.0", - "@aws-sdk/credential-provider-sso": "3.272.0", - "@aws-sdk/credential-provider-web-identity": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/credential-provider-node": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.272.0.tgz", - "integrity": "sha512-FI8uvwM1IxiRSvbkdKv8DZG5vxU3ezaseTaB1fHWTxEUFb0pWIoHX9oeOKer9Fj31SOZTCNAaYFURbSRuZlm/w==", - "optional": true, - "requires": { - "@aws-sdk/credential-provider-env": "3.272.0", - "@aws-sdk/credential-provider-imds": "3.272.0", - "@aws-sdk/credential-provider-ini": "3.272.0", - "@aws-sdk/credential-provider-process": "3.272.0", - "@aws-sdk/credential-provider-sso": "3.272.0", - "@aws-sdk/credential-provider-web-identity": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/credential-provider-process": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.272.0.tgz", - "integrity": "sha512-hiCAjWWm2PeBFp5cjkxqyam/XADjiS+e7GzwC34TbZn3LisS0uoweLojj9tD11NnnUhyhbLteUvu5+rotOLwrg==", - "optional": true, - "requires": { - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/credential-provider-sso": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.272.0.tgz", - "integrity": "sha512-hwYaulyiU/7chKKFecxCeo0ls6Dxs7h+5EtoYcJJGvfpvCncyOZF35t00OAsCd3Wo7HkhhgfpGdb6dmvCNQAZQ==", - "optional": true, - "requires": { - "@aws-sdk/client-sso": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/token-providers": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/credential-provider-web-identity": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.272.0.tgz", - "integrity": "sha512-ImrHMkcgneGa/HadHAQXPwOrX26sAKuB8qlMxZF/ZCM2B55u8deY+ZVkVuraeKb7YsahMGehPFOfRAF6mvFI5Q==", - "optional": true, - "requires": { - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/credential-providers": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.272.0.tgz", - "integrity": "sha512-ucd6Xq6aBMf+nM4uz5zkjL11mwaE5BV1Q4hkulaGu2v1dRA8n6zhLJk/sb4hOJ7leelqMJMErlbQ2T3MkYvlJQ==", - "optional": true, - "requires": { - "@aws-sdk/client-cognito-identity": "3.272.0", - "@aws-sdk/client-sso": "3.272.0", - "@aws-sdk/client-sts": "3.272.0", - "@aws-sdk/credential-provider-cognito-identity": "3.272.0", - "@aws-sdk/credential-provider-env": "3.272.0", - "@aws-sdk/credential-provider-imds": "3.272.0", - "@aws-sdk/credential-provider-ini": "3.272.0", - "@aws-sdk/credential-provider-node": "3.272.0", - "@aws-sdk/credential-provider-process": "3.272.0", - "@aws-sdk/credential-provider-sso": "3.272.0", - "@aws-sdk/credential-provider-web-identity": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/fetch-http-handler": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.272.0.tgz", - "integrity": "sha512-1Qhm9e0RbS1Xf4CZqUbQyUMkDLd7GrsRXWIvm9b86/vgeV8/WnjO3CMue9D51nYgcyQORhYXv6uVjAYCWbUExA==", - "optional": true, - "requires": { - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/querystring-builder": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/util-base64": "3.208.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/hash-node": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.272.0.tgz", - "integrity": "sha512-40dwND+iAm3VtPHPZu7/+CIdVJFk2s0cWZt1lOiMPMSXycSYJ45wMk7Lly3uoqRx0uWfFK5iT2OCv+fJi5jTng==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.272.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.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.272.0.tgz", - "integrity": "sha512-ysW6wbjl1Y78txHUQ/Tldj2Rg1BI7rpMO9B9xAF6yAX3mQ7t6SUPQG/ewOGvH2208NBIl3qP5e/hDf0Q6r/1iw==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.272.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.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.272.0.tgz", - "integrity": "sha512-sAbDZSTNmLX+UTGwlUHJBWy0QGQkiClpHwVFXACon+aG0ySLNeRKEVYs6NCPYldw4cj6hveLUn50cX44ukHErw==", - "optional": true, - "requires": { - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/middleware-endpoint": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.272.0.tgz", - "integrity": "sha512-Dk3JVjj7SxxoUKv3xGiOeBksvPtFhTDrVW75XJ98Ymv8gJH5L1sq4hIeJAHRKogGiRFq2J73mnZSlM9FVXEylg==", - "optional": true, - "requires": { - "@aws-sdk/middleware-serde": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/signature-v4": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/url-parser": "3.272.0", - "@aws-sdk/util-config-provider": "3.208.0", - "@aws-sdk/util-middleware": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/middleware-host-header": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.272.0.tgz", - "integrity": "sha512-Q8K7bMMFZnioUXpxn57HIt4p+I63XaNAawMLIZ5B4F2piyukbQeM9q2XVKMGwqLvijHR8CyP5nHrtKqVuINogQ==", - "optional": true, - "requires": { - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/middleware-logger": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.272.0.tgz", - "integrity": "sha512-u2SQ0hWrFwxbxxYMG5uMEgf01pQY5jauK/LYWgGIvuCmFgiyRQQP3oN7kkmsxnS9MWmNmhbyQguX2NY02s5e9w==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/middleware-recursion-detection": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.272.0.tgz", - "integrity": "sha512-Gp/eKWeUWVNiiBdmUM2qLkBv+VLSJKoWAO+aKmyxxwjjmWhE0FrfA1NQ1a3g+NGMhRbAfQdaYswRAKsul70ISg==", - "optional": true, - "requires": { - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/middleware-retry": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.272.0.tgz", - "integrity": "sha512-pCGvHM7C76VbO/dFerH+Vwf7tGv7j+e+eGrvhQ35mRghCtfIou/WMfTZlD1TNee93crrAQQVZKjtW3dMB3WCzg==", - "optional": true, - "requires": { - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/service-error-classification": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/util-middleware": "3.272.0", - "@aws-sdk/util-retry": "3.272.0", - "tslib": "^2.3.1", - "uuid": "^8.3.2" - } - }, - "@aws-sdk/middleware-sdk-sts": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.272.0.tgz", - "integrity": "sha512-VvYPg7LrDIjUOWueSzo2wBzcNG7dw+cmzV6zAKaLxf0RC5jeAP4hE0OzDiiZfDrjNghEzgq/V+0NO+LewqYL9Q==", - "optional": true, - "requires": { - "@aws-sdk/middleware-signing": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/signature-v4": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/middleware-serde": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.272.0.tgz", - "integrity": "sha512-kW1uOxgPSwtXPB5rm3QLdWomu42lkYpQL94tM1BjyFOWmBLO2lQhk5a7Dw6HkTozT9a+vxtscLChRa6KZe61Hw==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/middleware-signing": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.272.0.tgz", - "integrity": "sha512-4LChFK4VAR91X+dupqM8fQqYhFGE0G4Bf9rQlVTgGSbi2KUOmpqXzH0/WKE228nKuEhmH8+Qd2VPSAE2JcyAUA==", - "optional": true, - "requires": { - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/signature-v4": "3.272.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/util-middleware": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/middleware-stack": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.272.0.tgz", - "integrity": "sha512-jhwhknnPBGhfXAGV5GXUWfEhDFoP/DN8MPCO2yC5OAxyp6oVJ8lTPLkZYMTW5VL0c0eG44dXpF4Ib01V+PlDrQ==", - "optional": true, - "requires": { - "tslib": "^2.3.1" - } - }, - "@aws-sdk/middleware-user-agent": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.272.0.tgz", - "integrity": "sha512-Qy7/0fsDJxY5l0bEk7WKDfqb4Os/sCAgFR2zEvrhDtbkhYPf72ysvg/nRUTncmCbo8tOok4SJii2myk8KMfjjw==", - "optional": true, - "requires": { - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/node-config-provider": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.272.0.tgz", - "integrity": "sha512-YYCIBh9g1EQo7hm2l22HX5Yr9RoPQ2RCvhzKvF1n1e8t1QH4iObQrYUtqHG4khcm64Cft8C5MwZmgzHbya5Z6Q==", - "optional": true, - "requires": { - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/node-http-handler": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.272.0.tgz", - "integrity": "sha512-VrW9PjhhngeyYp4yGYPe5S0vgZH6NwU3Po9xAgayUeE37Inr7LS1YteFMHdpgsUUeNXnh7d06CXqHo1XjtqOKA==", - "optional": true, - "requires": { - "@aws-sdk/abort-controller": "3.272.0", - "@aws-sdk/protocol-http": "3.272.0", - "@aws-sdk/querystring-builder": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/property-provider": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.272.0.tgz", - "integrity": "sha512-V1pZTaH5eqpAt8O8CzbItHhOtzIfFuWymvwZFkAtwKuaHpnl7jjrTouV482zoq8AD/fF+VVSshwBKYA7bhidIw==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/protocol-http": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.272.0.tgz", - "integrity": "sha512-4JQ54v5Yn08jspNDeHo45CaSn1CvTJqS1Ywgr79eU6jBExtguOWv6LNtwVSBD9X37v88iqaxt8iu1Z3pZZAJeg==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/querystring-builder": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.272.0.tgz", - "integrity": "sha512-ndo++7GkdCj5tBXE6rGcITpSpZS4PfyV38wntGYAlj9liL1omk3bLZRY6uzqqkJpVHqbg2fD7O2qHNItzZgqhw==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.272.0", - "@aws-sdk/util-uri-escape": "3.201.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/querystring-parser": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.272.0.tgz", - "integrity": "sha512-5oS4/9n6N1LZW9tI3qq/0GnCuWoOXRgcHVB+AJLRBvDbEe+GI+C/xK1tKLsfpDNgsQJHc4IPQoIt4megyZ/1+A==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/service-error-classification": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.272.0.tgz", - "integrity": "sha512-REoltM1LK9byyIufLqx9znhSolPcHQgVHIA2S0zu5sdt5qER4OubkLAXuo4MBbisUTmh8VOOvIyUb5ijZCXq1w==", - "optional": true - }, - "@aws-sdk/shared-ini-file-loader": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.272.0.tgz", - "integrity": "sha512-lzFPohp5sy2XvwFjZIzLVCRpC0i5cwBiaXmFzXYQZJm6FSCszHO4ax+m9yrtlyVFF/2YPWl+/bzNthy4aJtseA==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/signature-v4": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.272.0.tgz", - "integrity": "sha512-pWxnHG1NqJWMwlhJ6NHNiUikOL00DHROmxah6krJPMPq4I3am2KY2Rs/8ouWhnEXKaHAv4EQhSALJ+7Mq5S4/A==", - "optional": true, - "requires": { - "@aws-sdk/is-array-buffer": "3.201.0", - "@aws-sdk/types": "3.272.0", - "@aws-sdk/util-hex-encoding": "3.201.0", - "@aws-sdk/util-middleware": "3.272.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.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.272.0.tgz", - "integrity": "sha512-pvdleJ3kaRvyRw2pIZnqL85ZlWBOZrPKmR9I69GCvlyrfdjRBhbSjIEZ+sdhZudw0vdHxq25AGoLUXhofVLf5Q==", - "optional": true, - "requires": { - "@aws-sdk/middleware-stack": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/token-providers": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.272.0.tgz", - "integrity": "sha512-0GISJ4IKN2rXvbSddB775VjBGSKhYIGQnAdMqbvxi9LB6pSvVxcH9aIL28G0spiuL+dy3yGQZ8RlJPAyP9JW9A==", - "optional": true, - "requires": { - "@aws-sdk/client-sso-oidc": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/shared-ini-file-loader": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/types": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.272.0.tgz", - "integrity": "sha512-MmmL6vxMGP5Bsi+4wRx4mxYlU/LX6M0noOXrDh/x5FfG7/4ZOar/nDxqDadhJtNM88cuWVHZWY59P54JzkGWmA==", - "optional": true, - "requires": { - "tslib": "^2.3.1" - } - }, - "@aws-sdk/url-parser": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.272.0.tgz", - "integrity": "sha512-vX/Tx02PlnQ/Kgtf5TnrNDHPNbY+amLZjW0Z1d9vzAvSZhQ4i9Y18yxoRDIaDTCNVRDjdhV8iuctW+05PB5JtQ==", - "optional": true, - "requires": { - "@aws-sdk/querystring-parser": "3.272.0", - "@aws-sdk/types": "3.272.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.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.272.0.tgz", - "integrity": "sha512-W8ZVJSZRuUBg8l0JEZzUc+9fKlthVp/cdE+pFeF8ArhZelOLCiaeCrMaZAeJusaFzIpa6cmOYQAjtSMVyrwRtg==", - "optional": true, - "requires": { - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/types": "3.272.0", - "bowser": "^2.11.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/util-defaults-mode-node": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.272.0.tgz", - "integrity": "sha512-U0NTcbMw6KFk7uz/avBmfxQSTREEiX6JDMH68oN/3ux4AICd2I4jHyxnloSWGuiER1FxZf1dEJ8ZTwy8Ibl21Q==", - "optional": true, - "requires": { - "@aws-sdk/config-resolver": "3.272.0", - "@aws-sdk/credential-provider-imds": "3.272.0", - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/property-provider": "3.272.0", - "@aws-sdk/types": "3.272.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/util-endpoints": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.272.0.tgz", - "integrity": "sha512-c4MPUaJt2G6gGpoiwIOqDfUa98c1J63RpYvf/spQEKOtC/tF5Gfqlxuq8FnAl5lHnrqj1B9ZXLLxFhHtDR0IiQ==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.272.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.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.272.0.tgz", - "integrity": "sha512-Abw8m30arbwxqmeMMha5J11ESpHUNmCeSqSzE8/C4B8jZQtHY4kq7f+upzcNIQ11lsd+uzBEzNG3+dDRi0XOJQ==", - "optional": true, - "requires": { - "tslib": "^2.3.1" - } - }, - "@aws-sdk/util-retry": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.272.0.tgz", - "integrity": "sha512-Ngha5414LR4gRHURVKC9ZYXsEJhMkm+SJ+44wlzOhavglfdcKKPUsibz5cKY1jpUV7oKECwaxHWpBB8r6h+hOg==", - "optional": true, - "requires": { - "@aws-sdk/service-error-classification": "3.272.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.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.272.0.tgz", - "integrity": "sha512-Lp5QX5bH6uuwBlIdr7w7OAcAI50ttyskb++yUr9i+SPvj6RI2dsfIBaK4mDg1qUdM5LeUdvIyqwj3XHjFKAAvA==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.272.0", - "bowser": "^2.11.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/util-user-agent-node": { - "version": "3.272.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.272.0.tgz", - "integrity": "sha512-ljK+R3l+Q1LIHrcR+Knhk0rmcSkfFadZ8V+crEGpABf/QUQRg7NkZMsoe814tfBO5F7tMxo8wwwSdaVNNHtoRA==", - "optional": true, - "requires": { - "@aws-sdk/node-config-provider": "3.272.0", - "@aws-sdk/types": "3.272.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" - } - }, - "@esbuild/android-arm": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.4.tgz", - "integrity": "sha512-R9GCe2xl2XDSc2XbQB63mFiFXHIVkOP+ltIxICKXqUPrFX97z6Z7vONCLQM1pSOLGqfLrGi3B7nbhxmFY/fomg==", - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.4.tgz", - "integrity": "sha512-91VwDrl4EpxBCiG6h2LZZEkuNvVZYJkv2T9gyLG/mhGG1qrM7i5SwUcg/hlSPnL/4hDT0TFcF35/XMGSn0bemg==", - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.4.tgz", - "integrity": "sha512-mGSqhEPL7029XL7QHNPxPs15JVa02hvZvysUcyMP9UXdGFwncl2WU0bqx+Ysgzd+WAbv8rfNa73QveOxAnAM2w==", - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.4.tgz", - "integrity": "sha512-tTyJRM9dHvlMPt1KrBFVB5OW1kXOsRNvAPtbzoKazd5RhD5/wKlXk1qR2MpaZRYwf4WDMadt0Pv0GwxB41CVow==", - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.4.tgz", - "integrity": "sha512-phQuC2Imrb3TjOJwLN8EO50nb2FHe8Ew0OwgZDH1SV6asIPGudnwTQtighDF2EAYlXChLoMJwqjAp4vAaACq6w==", - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.4.tgz", - "integrity": "sha512-oH6JUZkocgmjzzYaP5juERLpJQSwazdjZrTPgLRmAU2bzJ688x0vfMB/WTv4r58RiecdHvXOPC46VtsMy/mepg==", - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.4.tgz", - "integrity": "sha512-U4iWGn/9TrAfpAdfd56eO0pRxIgb0a8Wj9jClrhT8hvZnOnS4dfMPW7o4fn15D/KqoiVYHRm43jjBaTt3g/2KA==", - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.4.tgz", - "integrity": "sha512-S2s9xWTGMTa/fG5EyMGDeL0wrWVgOSQcNddJWgu6rG1NCSXJHs76ZP9AsxjB3f2nZow9fWOyApklIgiTGZKhiw==", - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.4.tgz", - "integrity": "sha512-UkGfQvYlwOaeYJzZG4cLV0hCASzQZnKNktRXUo3/BMZvdau40AOz9GzmGA063n1piq6VrFFh43apRDQx8hMP2w==", - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.4.tgz", - "integrity": "sha512-3lqFi4VFo/Vwvn77FZXeLd0ctolIJH/uXkH3yNgEk89Eh6D3XXAC9/iTPEzeEpsNE5IqGIsFa5Z0iPeOh25IyA==", - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.4.tgz", - "integrity": "sha512-HqpWZkVslDHIwdQ9D+gk7NuAulgQvRxF9no54ut/M55KEb3mi7sQS3GwpPJzSyzzP0UkjQVN7/tbk88/CaX4EQ==", - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.4.tgz", - "integrity": "sha512-d/nMCKKh/SVDbqR9ju+b78vOr0tNXtfBjcp5vfHONCCOAL9ad8gN9dC/u+UnH939pz7wO+0u/x9y1MaZcb/lKA==", - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.4.tgz", - "integrity": "sha512-lOD9p2dmjZcNiTU+sGe9Nn6G3aYw3k0HBJies1PU0j5IGfp6tdKOQ6mzfACRFCqXjnBuTqK7eTYpwx09O5LLfg==", - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.4.tgz", - "integrity": "sha512-mTGnwWwVshAjGsd8rP+K6583cPDgxOunsqqldEYij7T5/ysluMHKqUIT4TJHfrDFadUwrghAL6QjER4FeqQXoA==", - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.4.tgz", - "integrity": "sha512-AQYuUGp50XM29/N/dehADxvc2bUqDcoqrVuijop1Wv72SyxT6dDB9wjUxuPZm2HwIM876UoNNBMVd+iX/UTKVQ==", - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.4.tgz", - "integrity": "sha512-+AsFBwKgQuhV2shfGgA9YloxLDVjXgUEWZum7glR5lLmV94IThu/u2JZGxTgjYby6kyXEx8lKOqP5rTEVBR0Rw==", - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.4.tgz", - "integrity": "sha512-zD1TKYX9553OiLS/qkXPMlWoELYkH/VkzRYNKEU+GwFiqkq0SuxsKnsCg5UCdxN3cqd+1KZ8SS3R+WG/Hxy2jQ==", - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.4.tgz", - "integrity": "sha512-PY1NjEsLRhPEFFg1AV0/4Or/gR+q2dOb9s5rXcPuCjyHRzbt8vnHJl3vYj+641TgWZzTFmSUnZbzs1zwTzjeqw==", - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.4.tgz", - "integrity": "sha512-B3Z7s8QZQW9tKGleMRXvVmwwLPAUoDCHs4WZ2ElVMWiortLJFowU1NjAhXOKjDgC7o9ByeVcwyOlJ+F2r6ZgmQ==", - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.4.tgz", - "integrity": "sha512-0HCu8R3mY/H5V7N6kdlsJkvrT591bO/oRZy8ztF1dhgNU5xD5tAh5bKByT1UjTGjp/VVBsl1PDQ3L18SfvtnBQ==", - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.4.tgz", - "integrity": "sha512-VUjhVDQycse1gLbe06pC/uaA0M+piQXJpdpNdhg8sPmeIZZqu5xPoGWVCmcsOO2gaM2cywuTYTHkXRozo3/Nkg==", - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.4.tgz", - "integrity": "sha512-0kLAjs+xN5OjhTt/aUA6t48SfENSCKgGPfExADYTOo/UCn0ivxos9/anUVeSfg+L+2O9xkFxvJXIJfG+Q4sYSg==", - "optional": true - }, - "@mapbox/node-pre-gyp": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", - "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", - "requires": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "dependencies": { - "node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } - } - }, - "@mfd/rbxdatastoreservice": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/@mfd/rbxdatastoreservice/-/rbxdatastoreservice-2.3.11.tgz", - "integrity": "sha512-sZkBwBolSwHT2RDz4//7K0Vkxdjo2Zg1RSdSaUasTUKWj+BMeANgyLv/baMFHcJFE/Z+3kCcCkU/VHqfiQAHgA==", - "requires": { - "axios": "^0.27.2", - "crypto-js": "^4.0.0" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@redis/bloom": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", - "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==", - "requires": {} - }, - "@redis/client": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.6.tgz", - "integrity": "sha512-dFD1S6je+A47Lj22jN/upVU2fj4huR7S9APd7/ziUXsIXDL+11GPYti4Suv5y8FuXaN+0ZG4JF+y1houEJ7ToA==", - "requires": { - "cluster-key-slot": "1.1.2", - "generic-pool": "3.9.0", - "yallist": "4.0.0" - } - }, - "@redis/graph": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz", - "integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==", - "requires": {} - }, - "@redis/json": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz", - "integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==", - "requires": {} - }, - "@redis/search": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.2.tgz", - "integrity": "sha512-/cMfstG/fOh/SsE+4/BQGeuH/JJloeWuH+qJzM8dbxuWvdWibWAOAHHCZTMPhV3xIlH4/cUEIA8OV5QnYpaVoA==", - "requires": {} - }, - "@redis/time-series": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz", - "integrity": "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==", - "requires": {} - }, - "@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": "*" - } - }, - "@yaireo/relative-time": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@yaireo/relative-time/-/relative-time-1.0.3.tgz", - "integrity": "sha512-CJGxyWjb4SnkqubyfiPNQeg0YrJKnVu+11DOP65ltXFxDsjjnm3IByXS9O1Ny9AU9Oxqg0a7Gt26tzXtcijicg==" - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "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": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" - }, - "acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "requires": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - } - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" - }, - "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==", - "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==", - "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==" - } - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "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==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" - }, - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" - }, - "are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - }, - "autoprefixer": { - "version": "10.4.13", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", - "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", - "peer": true, - "requires": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001426", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "axios": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", - "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", - "requires": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "base32.js": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/base32.js/-/base32.js-0.0.1.tgz", - "integrity": "sha512-EGHIRiegFa62/SsA1J+Xs2tIzludPdzM064N9wjbiEgHnGnJ1V0WEpA4pEwCYT5nDvZk3ubf0shqaCS7k6xeUQ==" - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "bcrypt": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.0.tgz", - "integrity": "sha512-RHBS7HI5N5tEnGTmtR/pppX0mmDSBpQ4aCBsj7CEQfYXDcO74A8sIBYcJMuCsis2E81zDxeENYhv66oZwLiA+Q==", - "requires": { - "@mapbox/node-pre-gyp": "^1.0.10", - "node-addon-api": "^5.0.0" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" - }, - "bintrees": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz", - "integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==" - }, - "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 - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "peer": true, - "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - } - }, - "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" - } - }, - "buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "requires": { - "streamsearch": "^1.1.0" - } - }, - "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" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" - }, - "caniuse-lite": { - "version": "1.0.30001441", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz", - "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==", - "peer": true - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "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" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "cluster-key-slot": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", - "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==" - }, - "color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "requires": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "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==" - }, - "color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "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==" - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" - }, - "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.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" - }, - "cookie-parser": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", - "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", - "requires": { - "cookie": "0.4.1", - "cookie-signature": "1.0.6" - } - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "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==" - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.1" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypto-js": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", - "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" - }, - "css-selector-tokenizer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz", - "integrity": "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==", - "requires": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2" - } - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" - }, - "cssfilter": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", - "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==" - }, - "daisyui": { - "version": "2.46.1", - "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-2.46.1.tgz", - "integrity": "sha512-i59+nLuzzPAVOhNhot3KLtt6stfYeCIPXs9uiLcpXjykpqxHfBA3W6hQWOUWPMwfqhyQd0WKub3sydtPGjzLtA==", - "requires": { - "color": "^4.2", - "css-selector-tokenizer": "^0.8.0", - "postcss-js": "^4.0.0", - "tailwindcss": "^3" - } - }, - "data-uri-to-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", - "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==" - }, - "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" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" - }, - "defined": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", - "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==" - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" - }, - "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==" - }, - "detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" - }, - "detective": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", - "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", - "requires": { - "acorn-node": "^1.8.2", - "defined": "^1.0.0", - "minimist": "^1.2.6" - } - }, - "didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" - }, - "dijkstrajs": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.2.tgz", - "integrity": "sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg==" - }, - "dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" - }, - "dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" - }, - "easy-soap-request": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/easy-soap-request/-/easy-soap-request-4.8.0.tgz", - "integrity": "sha512-fD1NXRv14P4IdAoyYpGJ2kB+292vYfvU7qLbmUw2x2HA+U74LWVyErjyNf2Jxn1mUAwp+sRdMlkmrUrPY0/wAg==", - "requires": { - "axios": "^0.27.2" - } - }, - "ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "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==" - }, - "electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", - "peer": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "encode-utf8": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", - "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" - }, - "esbuild": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.4.tgz", - "integrity": "sha512-zBn9MeCwT7W5F1a3lXClD61ip6vQM+H8Msb0w8zMT4ZKBpDg+rFAraNyWCDelB/2L6M3g6AXHPnsyvjMFnxtFw==", - "requires": { - "@esbuild/android-arm": "0.17.4", - "@esbuild/android-arm64": "0.17.4", - "@esbuild/android-x64": "0.17.4", - "@esbuild/darwin-arm64": "0.17.4", - "@esbuild/darwin-x64": "0.17.4", - "@esbuild/freebsd-arm64": "0.17.4", - "@esbuild/freebsd-x64": "0.17.4", - "@esbuild/linux-arm": "0.17.4", - "@esbuild/linux-arm64": "0.17.4", - "@esbuild/linux-ia32": "0.17.4", - "@esbuild/linux-loong64": "0.17.4", - "@esbuild/linux-mips64el": "0.17.4", - "@esbuild/linux-ppc64": "0.17.4", - "@esbuild/linux-riscv64": "0.17.4", - "@esbuild/linux-s390x": "0.17.4", - "@esbuild/linux-x64": "0.17.4", - "@esbuild/netbsd-x64": "0.17.4", - "@esbuild/openbsd-x64": "0.17.4", - "@esbuild/sunos-x64": "0.17.4", - "@esbuild/win32-arm64": "0.17.4", - "@esbuild/win32-ia32": "0.17.4", - "@esbuild/win32-x64": "0.17.4" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "peer": true - }, - "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==" - }, - "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" - }, - "dependencies": { - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" - } - } - }, - "express-flash-message": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/express-flash-message/-/express-flash-message-2.1.0.tgz", - "integrity": "sha512-oR/cwzt7CfjSUt7XwEZCCyOegylHuTF8/by6+jAshZh2TzREqDIjfU0JU5M6usurSk/ep3lUxxyaCbujyERyTQ==" - }, - "express-prom-bundle": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/express-prom-bundle/-/express-prom-bundle-6.6.0.tgz", - "integrity": "sha512-tZh2P2p5a8/yxQ5VbRav011Poa4R0mHqdFwn9Swe/obXDe5F0jY9wtRAfNYnqk4LXY7akyvR/nrvAHxQPWUjsQ==", - "requires": { - "on-finished": "^2.3.0", - "url-value-parser": "^2.0.0" - } - }, - "express-rate-limit": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.7.0.tgz", - "integrity": "sha512-vhwIdRoqcYB/72TK3tRZI+0ttS8Ytrk24GfmsxDXK9o9IhHNO5bXRiXQSExPQ4GbaE5tvIS7j1SGrxsuWs+sGA==", - "requires": {} - }, - "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-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "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" - } - }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" - }, - "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "requires": { - "reusify": "^1.0.4" - } - }, - "fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "requires": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - } - }, - "file-type-checker": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/file-type-checker/-/file-type-checker-1.0.4.tgz", - "integrity": "sha512-hhleilG34kfSjlSfAAj8DVvqXxMwEIVY/pkWnkMVbqdmly6jUv7jjNw/dmvdcbMt6joXlQgavCJCtNDRzODOsQ==" - }, - "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==", - "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" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" - }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "requires": { - "fetch-blob": "^3.1.2" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", - "peer": true - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" - }, - "fs-memo": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fs-memo/-/fs-memo-1.2.0.tgz", - "integrity": "sha512-YEexkCpL4j03jn5SxaMHqcO6IuWuqm8JFUYhyCep7Ao89JIYmB8xoKhK7zXXJ9cCaNXpyNH5L3QtAmoxjoHW2w==" - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - } - }, - "generic-pool": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", - "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==" - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-port": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-6.1.2.tgz", - "integrity": "sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==" - }, - "get-port-please": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-2.6.1.tgz", - "integrity": "sha512-4PDSrL6+cuMM1xs6w36ZIkaKzzE0xzfVBCfebHIJ3FE8iB9oic/ECwPw3iNiD4h1AoJ5XLLBhEviFAVrZsDC5A==", - "requires": { - "fs-memo": "^1.2.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" - }, - "helmet": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/helmet/-/helmet-5.1.1.tgz", - "integrity": "sha512-/yX0oVZBggA9cLJh8aw3PPCfedBnbd7J2aowjzsaWwZh7/UFY0nccn/aHAggIgWUFfnykX8GKd3a1pSbrmlcVQ==" - }, - "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" - } - }, - "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==", - "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==", - "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==" - } - } - }, - "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 - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "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-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "jsonpath-plus": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz", - "integrity": "sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==" - }, - "jsonwebtoken": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", - "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", - "requires": { - "jws": "^3.2.2", - "lodash": "^4.17.21", - "ms": "^2.1.1", - "semver": "^7.3.8" - }, - "dependencies": { - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "just-clone": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/just-clone/-/just-clone-6.2.0.tgz", - "integrity": "sha512-1IynUYEc/HAwxhi3WDpIpxJbZpMCvvrrmZVqvj9EhpvbH8lls7HhdhiByjL7DkAaWlLIzpC0Xc/VPvy/UxLNjA==" - }, - "jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "requires": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "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==" - }, - "lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==" - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.foreach": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==" - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "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==" - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "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" - } - }, - "minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" - }, - "minipass": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz", - "integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==", - "requires": { - "yallist": "^4.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "requires": { - "minimist": "^1.2.6" - } - }, - "mongo-sanitize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mongo-sanitize/-/mongo-sanitize-1.1.0.tgz", - "integrity": "sha512-6gB9AiJD+om2eZLxaPKIP5Q8P3Fr+s+17rVWso7hU0+MAzmIvIMlgTYuyvalDLTtE/p0gczcvJ8A3pbN1XmQ/A==" - }, - "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" - }, - "dependencies": { - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "mongoose-unique-validator": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mongoose-unique-validator/-/mongoose-unique-validator-3.1.0.tgz", - "integrity": "sha512-UsBBlFapip8gc8x1h+nLWnkOy+GTy9Z+zmTyZ35icLV3EoLIVz180vJzepfMM9yBy2AJh+maeuoM8CWtqejGUg==", - "requires": { - "lodash.foreach": "^4.1.0", - "lodash.get": "^4.0.2", - "lodash.merge": "^4.6.2" - } - }, - "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.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "multer": { - "version": "1.4.5-lts.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", - "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", - "requires": { - "append-field": "^1.0.0", - "busboy": "^1.0.0", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.4", - "object-assign": "^4.1.1", - "type-is": "^1.6.4", - "xtend": "^4.0.0" - } - }, - "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" - }, - "node-addon-api": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz", - "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==" - }, - "node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==" - }, - "node-fetch": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.0.tgz", - "integrity": "sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==", - "requires": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - } - }, - "node-releases": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", - "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", - "peer": 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": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "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" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "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==" - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "peer": true - }, - "npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "requires": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - }, - "object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" - }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" - }, - "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==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "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==" - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" - }, - "png-validator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/png-validator/-/png-validator-1.1.0.tgz", - "integrity": "sha512-MlRLyPI1p3/dJbsjVH+4xOPucycrz8T3EvO0BzCXaNtrUhZkZROtzib9J6mnC81AJO8eBIwiDZwTFel2cMmSuQ==" - }, - "pngjs": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", - "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==" - }, - "postcss": { - "version": "8.4.20", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.20.tgz", - "integrity": "sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==", - "requires": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-import": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", - "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", - "requires": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - } - }, - "postcss-js": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", - "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", - "requires": { - "camelcase-css": "^2.0.1" - } - }, - "postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "requires": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - } - }, - "postcss-nested": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", - "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "prom-client": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-14.1.1.tgz", - "integrity": "sha512-hFU32q7UZQ59bVJQGUtm3I2PrJ3gWvoCkilX9sF165ks1qflhugVCeK+S1JjJYHvyt3o5kj68+q3bchormjnzw==", - "requires": { - "tdigest": "^0.1.1" - } - }, - "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" - } - }, - "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==" - }, - "qrcode": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.1.tgz", - "integrity": "sha512-nS8NJ1Z3md8uTjKtP+SGGhfqmTCs5flU/xR623oI0JX+Wepz9R8UrRVCTBTJm3qGw3rH6jJ6MUHjkDx15cxSSg==", - "requires": { - "dijkstrajs": "^1.0.1", - "encode-utf8": "^1.0.3", - "pngjs": "^5.0.0", - "yargs": "^15.3.1" - } - }, - "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" - } - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" - }, - "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" - } - }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "requires": { - "pify": "^2.3.0" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "requires": { - "picomatch": "^2.2.1" - } - }, - "redis": { - "version": "4.6.5", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.5.tgz", - "integrity": "sha512-O0OWA36gDQbswOdUuAhRL6mTZpHFN525HlgZgDaVNgCJIAZR3ya06NTESb0R+TUZ+BFaDpz6NnnVvoMx9meUFg==", - "requires": { - "@redis/bloom": "1.2.0", - "@redis/client": "1.5.6", - "@redis/graph": "1.1.0", - "@redis/json": "1.0.4", - "@redis/search": "1.1.2", - "@redis/time-series": "1.0.4" - } - }, - "redis-om": { - "version": "0.4.0-beta.3", - "resolved": "https://registry.npmjs.org/redis-om/-/redis-om-0.4.0-beta.3.tgz", - "integrity": "sha512-zGWBMGoe3exrvkbFjWqAFG8UJL3tdby5UkfPKiZLvA67d7FsR0ScEpsBaaWGL33y5EQUWnYL+pI8jzZaQ6brtA==", - "requires": { - "jsonpath-plus": "^7.2.0", - "just-clone": "^6.1.1", - "redis": "^4.6.4", - "ulid": "^2.3.0" - } - }, - "req-flash": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/req-flash/-/req-flash-0.0.3.tgz", - "integrity": "sha512-c5ouPRJ6OVc4ecL5cgdwd51nYOFQiOTfl7UWk+VlgUHgfsh7TMRFPN/OJ5ETnOYFyswprT8C2a6ctMvJgms9ng==" - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - }, - "dependencies": { - "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" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.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" - } - } - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "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" - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "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" - }, - "dependencies": { - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "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" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "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==" - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "requires": { - "is-arrayish": "^0.3.1" - } - }, - "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" - } - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" - }, - "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" - } - }, - "speakeasy": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/speakeasy/-/speakeasy-2.0.0.tgz", - "integrity": "sha512-lW2A2s5LKi8rwu77ewisuUOtlCydF/hmQSOJjpTqTj1gZLkNgTaYnyvfxy2WBr4T/h+9c4g8HIITfj83OkFQFw==", - "requires": { - "base32.js": "0.0.1" - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" - }, - "streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "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": "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" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" - }, - "tailwindcss": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz", - "integrity": "sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==", - "requires": { - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "color-name": "^1.1.4", - "detective": "^5.2.1", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.12", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "lilconfig": "^2.0.6", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.18", - "postcss-import": "^14.1.0", - "postcss-js": "^4.0.0", - "postcss-load-config": "^3.1.4", - "postcss-nested": "6.0.0", - "postcss-selector-parser": "^6.0.10", - "postcss-value-parser": "^4.2.0", - "quick-lru": "^5.1.1", - "resolve": "^1.22.1" - }, - "dependencies": { - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "requires": { - "is-glob": "^4.0.3" - } - } - } - }, - "tar": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", - "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - } - } - }, - "tdigest": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz", - "integrity": "sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==", - "requires": { - "bintrees": "1.0.2" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "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" - }, - "dependencies": { - "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" - } - } - } - }, - "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-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" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" - }, - "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" - } - }, - "ulid": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ulid/-/ulid-2.3.0.tgz", - "integrity": "sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw==" - }, - "undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" - }, - "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "peer": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "url-value-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/url-value-parser/-/url-value-parser-2.2.0.tgz", - "integrity": "sha512-yIQdxJpgkPamPPAPuGdS7Q548rLhny42tg8d4vyTNzFqvOnwqrgHXvgehT09U7fwrzxi3RxCiXjoNUNnNOlQ8A==" - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "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==" - }, - "web-streams-polyfill": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", - "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==" - }, - "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" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" - }, - "wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "xml-js": { - "version": "1.6.11", - "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", - "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", - "requires": { - "sax": "^1.2.4" - } - }, - "xss": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.14.tgz", - "integrity": "sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw==", - "requires": { - "commander": "^2.20.3", - "cssfilter": "0.0.10" - } - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } + "name": "datastoreservice", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "datastoreservice", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@mfd/rbxdatastoreservice": "^2.3.10", + "@yaireo/relative-time": "^1.0.3", + "atob": "^2.1.2", + "bcrypt": "^5.0.1", + "body-parser": "^1.20.0", + "connect-flash": "^0.1.1", + "cookie-parser": "^1.4.6", + "cors": "^2.8.5", + "daisyui": "^2.24.2", + "dotenv": "^16.0.1", + "easy-soap-request": "^4.8.0", + "esbuild": "0.17.4", + "express": "^4.18.1", + "express-flash-message": "^2.1.0", + "express-prom-bundle": "^6.5.0", + "express-rate-limit": "^6.7.0", + "express-session": "^1.17.3", + "file-type-checker": "^1.0.4", + "get-port": "^6.1.2", + "get-port-please": "^2.6.1", + "helmet": "^5.1.1", + "jsonwebtoken": "^9.0.0", + "mongo-sanitize": "^1.1.0", + "mongoose": "^6.5.2", + "mongoose-unique-validator": "^3.1.0", + "multer": "^1.4.5-lts.1", + "node-fetch": "^3.2.10", + "png-validator": "^1.1.0", + "prom-client": "^14.1.0", + "qrcode": "^1.5.1", + "redis": "^4.6.5", + "redis-om": "^0.4.0-beta.3", + "req-flash": "^0.0.3", + "speakeasy": "^2.0.0", + "xml-js": "^1.6.11", + "xss": "^1.0.13" + }, + "devDependencies": { + "cross-env": "^7.0.3", + "nodemon": "^2.0.19" + } + }, + "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.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.272.0.tgz", + "integrity": "sha512-s2TV3phapcTwZNr4qLxbfuQuE9ZMP4RoJdkvRRCkKdm6jslsWLJf2Zlcxti/23hOlINUMYv2iXE2pftIgWGdpg==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.272.0.tgz", + "integrity": "sha512-uMjRWcNvX7SoGaVn0mXWD43+Z1awPahQwGW3riDLfXHZdOgw2oFDhD3Jg5jQ8OzQLUfDvArhE3WyZwlS4muMuQ==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.272.0", + "@aws-sdk/config-resolver": "3.272.0", + "@aws-sdk/credential-provider-node": "3.272.0", + "@aws-sdk/fetch-http-handler": "3.272.0", + "@aws-sdk/hash-node": "3.272.0", + "@aws-sdk/invalid-dependency": "3.272.0", + "@aws-sdk/middleware-content-length": "3.272.0", + "@aws-sdk/middleware-endpoint": "3.272.0", + "@aws-sdk/middleware-host-header": "3.272.0", + "@aws-sdk/middleware-logger": "3.272.0", + "@aws-sdk/middleware-recursion-detection": "3.272.0", + "@aws-sdk/middleware-retry": "3.272.0", + "@aws-sdk/middleware-serde": "3.272.0", + "@aws-sdk/middleware-signing": "3.272.0", + "@aws-sdk/middleware-stack": "3.272.0", + "@aws-sdk/middleware-user-agent": "3.272.0", + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/node-http-handler": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/smithy-client": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/url-parser": "3.272.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.272.0", + "@aws-sdk/util-defaults-mode-node": "3.272.0", + "@aws-sdk/util-endpoints": "3.272.0", + "@aws-sdk/util-retry": "3.272.0", + "@aws-sdk/util-user-agent-browser": "3.272.0", + "@aws-sdk/util-user-agent-node": "3.272.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.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.272.0.tgz", + "integrity": "sha512-xn9a0IGONwQIARmngThoRhF1lLGjHAD67sUaShgIMaIMc6ipVYN6alWG1VuUpoUQ6iiwMEt0CHdfCyLyUV/fTA==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.272.0", + "@aws-sdk/fetch-http-handler": "3.272.0", + "@aws-sdk/hash-node": "3.272.0", + "@aws-sdk/invalid-dependency": "3.272.0", + "@aws-sdk/middleware-content-length": "3.272.0", + "@aws-sdk/middleware-endpoint": "3.272.0", + "@aws-sdk/middleware-host-header": "3.272.0", + "@aws-sdk/middleware-logger": "3.272.0", + "@aws-sdk/middleware-recursion-detection": "3.272.0", + "@aws-sdk/middleware-retry": "3.272.0", + "@aws-sdk/middleware-serde": "3.272.0", + "@aws-sdk/middleware-stack": "3.272.0", + "@aws-sdk/middleware-user-agent": "3.272.0", + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/node-http-handler": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/smithy-client": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/url-parser": "3.272.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.272.0", + "@aws-sdk/util-defaults-mode-node": "3.272.0", + "@aws-sdk/util-endpoints": "3.272.0", + "@aws-sdk/util-retry": "3.272.0", + "@aws-sdk/util-user-agent-browser": "3.272.0", + "@aws-sdk/util-user-agent-node": "3.272.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.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.272.0.tgz", + "integrity": "sha512-ECcXu3xoa1yggnGKMTh29eWNHiF/wC6r5Uqbla22eOOosyh0+Z6lkJ3JUSLOUKCkBXA4Cs/tJL9UDFBrKbSlvA==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.272.0", + "@aws-sdk/fetch-http-handler": "3.272.0", + "@aws-sdk/hash-node": "3.272.0", + "@aws-sdk/invalid-dependency": "3.272.0", + "@aws-sdk/middleware-content-length": "3.272.0", + "@aws-sdk/middleware-endpoint": "3.272.0", + "@aws-sdk/middleware-host-header": "3.272.0", + "@aws-sdk/middleware-logger": "3.272.0", + "@aws-sdk/middleware-recursion-detection": "3.272.0", + "@aws-sdk/middleware-retry": "3.272.0", + "@aws-sdk/middleware-serde": "3.272.0", + "@aws-sdk/middleware-stack": "3.272.0", + "@aws-sdk/middleware-user-agent": "3.272.0", + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/node-http-handler": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/smithy-client": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/url-parser": "3.272.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.272.0", + "@aws-sdk/util-defaults-mode-node": "3.272.0", + "@aws-sdk/util-endpoints": "3.272.0", + "@aws-sdk/util-retry": "3.272.0", + "@aws-sdk/util-user-agent-browser": "3.272.0", + "@aws-sdk/util-user-agent-node": "3.272.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.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.272.0.tgz", + "integrity": "sha512-kigxCxURp3WupufGaL/LABMb7UQfzAQkKcj9royizL3ItJ0vw5kW/JFrPje5IW1mfLgdPF7PI9ShOjE0fCLTqA==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.272.0", + "@aws-sdk/credential-provider-node": "3.272.0", + "@aws-sdk/fetch-http-handler": "3.272.0", + "@aws-sdk/hash-node": "3.272.0", + "@aws-sdk/invalid-dependency": "3.272.0", + "@aws-sdk/middleware-content-length": "3.272.0", + "@aws-sdk/middleware-endpoint": "3.272.0", + "@aws-sdk/middleware-host-header": "3.272.0", + "@aws-sdk/middleware-logger": "3.272.0", + "@aws-sdk/middleware-recursion-detection": "3.272.0", + "@aws-sdk/middleware-retry": "3.272.0", + "@aws-sdk/middleware-sdk-sts": "3.272.0", + "@aws-sdk/middleware-serde": "3.272.0", + "@aws-sdk/middleware-signing": "3.272.0", + "@aws-sdk/middleware-stack": "3.272.0", + "@aws-sdk/middleware-user-agent": "3.272.0", + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/node-http-handler": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/smithy-client": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/url-parser": "3.272.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.272.0", + "@aws-sdk/util-defaults-mode-node": "3.272.0", + "@aws-sdk/util-endpoints": "3.272.0", + "@aws-sdk/util-retry": "3.272.0", + "@aws-sdk/util-user-agent-browser": "3.272.0", + "@aws-sdk/util-user-agent-node": "3.272.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.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.272.0.tgz", + "integrity": "sha512-Dr4CffRVNsOp3LRNdpvcH6XuSgXOSLblWliCy/5I86cNl567KVMxujVx6uPrdTXYs2h1rt3MNl6jQGnAiJeTbw==", + "optional": true, + "dependencies": { + "@aws-sdk/signature-v4": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/util-config-provider": "3.208.0", + "@aws-sdk/util-middleware": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.272.0.tgz", + "integrity": "sha512-rVx0rtQjbiYCM0nah2rB/2ut2YJYPpRr1AbW/Hd4r/PI+yiusrmXAwuT4HIW2yr34zsQMPi1jZ3WHN9Rn9mzlg==", + "optional": true, + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.272.0.tgz", + "integrity": "sha512-QI65NbLnKLYHyTYhXaaUrq6eVsCCrMUb05WDA7+TJkWkjXesovpjc8vUKgFiLSxmgKmb2uOhHNcDyObKMrYQFw==", + "optional": true, + "dependencies": { + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-imds": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.272.0.tgz", + "integrity": "sha512-wwAfVY1jTFQEfxVfdYD5r5ieYGl+0g4nhekVxNMqE8E1JeRDd18OqiwAflzpgBIqxfqvCUkf+vl5JYyacMkNAQ==", + "optional": true, + "dependencies": { + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/url-parser": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.272.0.tgz", + "integrity": "sha512-iE3CDzK5NcupHYjfYjBdY1JCy8NLEoRUsboEjG0i0gy3S3jVpDeVHX1dLVcL/slBFj6GiM7SoNV/UfKnJf3Gaw==", + "optional": true, + "dependencies": { + "@aws-sdk/credential-provider-env": "3.272.0", + "@aws-sdk/credential-provider-imds": "3.272.0", + "@aws-sdk/credential-provider-process": "3.272.0", + "@aws-sdk/credential-provider-sso": "3.272.0", + "@aws-sdk/credential-provider-web-identity": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.272.0.tgz", + "integrity": "sha512-FI8uvwM1IxiRSvbkdKv8DZG5vxU3ezaseTaB1fHWTxEUFb0pWIoHX9oeOKer9Fj31SOZTCNAaYFURbSRuZlm/w==", + "optional": true, + "dependencies": { + "@aws-sdk/credential-provider-env": "3.272.0", + "@aws-sdk/credential-provider-imds": "3.272.0", + "@aws-sdk/credential-provider-ini": "3.272.0", + "@aws-sdk/credential-provider-process": "3.272.0", + "@aws-sdk/credential-provider-sso": "3.272.0", + "@aws-sdk/credential-provider-web-identity": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.272.0.tgz", + "integrity": "sha512-hiCAjWWm2PeBFp5cjkxqyam/XADjiS+e7GzwC34TbZn3LisS0uoweLojj9tD11NnnUhyhbLteUvu5+rotOLwrg==", + "optional": true, + "dependencies": { + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.272.0.tgz", + "integrity": "sha512-hwYaulyiU/7chKKFecxCeo0ls6Dxs7h+5EtoYcJJGvfpvCncyOZF35t00OAsCd3Wo7HkhhgfpGdb6dmvCNQAZQ==", + "optional": true, + "dependencies": { + "@aws-sdk/client-sso": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/token-providers": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.272.0.tgz", + "integrity": "sha512-ImrHMkcgneGa/HadHAQXPwOrX26sAKuB8qlMxZF/ZCM2B55u8deY+ZVkVuraeKb7YsahMGehPFOfRAF6mvFI5Q==", + "optional": true, + "dependencies": { + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.272.0.tgz", + "integrity": "sha512-ucd6Xq6aBMf+nM4uz5zkjL11mwaE5BV1Q4hkulaGu2v1dRA8n6zhLJk/sb4hOJ7leelqMJMErlbQ2T3MkYvlJQ==", + "optional": true, + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.272.0", + "@aws-sdk/client-sso": "3.272.0", + "@aws-sdk/client-sts": "3.272.0", + "@aws-sdk/credential-provider-cognito-identity": "3.272.0", + "@aws-sdk/credential-provider-env": "3.272.0", + "@aws-sdk/credential-provider-imds": "3.272.0", + "@aws-sdk/credential-provider-ini": "3.272.0", + "@aws-sdk/credential-provider-node": "3.272.0", + "@aws-sdk/credential-provider-process": "3.272.0", + "@aws-sdk/credential-provider-sso": "3.272.0", + "@aws-sdk/credential-provider-web-identity": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/fetch-http-handler": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.272.0.tgz", + "integrity": "sha512-1Qhm9e0RbS1Xf4CZqUbQyUMkDLd7GrsRXWIvm9b86/vgeV8/WnjO3CMue9D51nYgcyQORhYXv6uVjAYCWbUExA==", + "optional": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/querystring-builder": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/util-base64": "3.208.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/hash-node": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.272.0.tgz", + "integrity": "sha512-40dwND+iAm3VtPHPZu7/+CIdVJFk2s0cWZt1lOiMPMSXycSYJ45wMk7Lly3uoqRx0uWfFK5iT2OCv+fJi5jTng==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.272.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.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.272.0.tgz", + "integrity": "sha512-ysW6wbjl1Y78txHUQ/Tldj2Rg1BI7rpMO9B9xAF6yAX3mQ7t6SUPQG/ewOGvH2208NBIl3qP5e/hDf0Q6r/1iw==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.272.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.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.272.0.tgz", + "integrity": "sha512-sAbDZSTNmLX+UTGwlUHJBWy0QGQkiClpHwVFXACon+aG0ySLNeRKEVYs6NCPYldw4cj6hveLUn50cX44ukHErw==", + "optional": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-endpoint": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.272.0.tgz", + "integrity": "sha512-Dk3JVjj7SxxoUKv3xGiOeBksvPtFhTDrVW75XJ98Ymv8gJH5L1sq4hIeJAHRKogGiRFq2J73mnZSlM9FVXEylg==", + "optional": true, + "dependencies": { + "@aws-sdk/middleware-serde": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/signature-v4": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/url-parser": "3.272.0", + "@aws-sdk/util-config-provider": "3.208.0", + "@aws-sdk/util-middleware": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.272.0.tgz", + "integrity": "sha512-Q8K7bMMFZnioUXpxn57HIt4p+I63XaNAawMLIZ5B4F2piyukbQeM9q2XVKMGwqLvijHR8CyP5nHrtKqVuINogQ==", + "optional": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.272.0.tgz", + "integrity": "sha512-u2SQ0hWrFwxbxxYMG5uMEgf01pQY5jauK/LYWgGIvuCmFgiyRQQP3oN7kkmsxnS9MWmNmhbyQguX2NY02s5e9w==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.272.0.tgz", + "integrity": "sha512-Gp/eKWeUWVNiiBdmUM2qLkBv+VLSJKoWAO+aKmyxxwjjmWhE0FrfA1NQ1a3g+NGMhRbAfQdaYswRAKsul70ISg==", + "optional": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-retry": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.272.0.tgz", + "integrity": "sha512-pCGvHM7C76VbO/dFerH+Vwf7tGv7j+e+eGrvhQ35mRghCtfIou/WMfTZlD1TNee93crrAQQVZKjtW3dMB3WCzg==", + "optional": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/service-error-classification": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/util-middleware": "3.272.0", + "@aws-sdk/util-retry": "3.272.0", + "tslib": "^2.3.1", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.272.0.tgz", + "integrity": "sha512-VvYPg7LrDIjUOWueSzo2wBzcNG7dw+cmzV6zAKaLxf0RC5jeAP4hE0OzDiiZfDrjNghEzgq/V+0NO+LewqYL9Q==", + "optional": true, + "dependencies": { + "@aws-sdk/middleware-signing": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/signature-v4": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-serde": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.272.0.tgz", + "integrity": "sha512-kW1uOxgPSwtXPB5rm3QLdWomu42lkYpQL94tM1BjyFOWmBLO2lQhk5a7Dw6HkTozT9a+vxtscLChRa6KZe61Hw==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-signing": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.272.0.tgz", + "integrity": "sha512-4LChFK4VAR91X+dupqM8fQqYhFGE0G4Bf9rQlVTgGSbi2KUOmpqXzH0/WKE228nKuEhmH8+Qd2VPSAE2JcyAUA==", + "optional": true, + "dependencies": { + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/signature-v4": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/util-middleware": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-stack": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.272.0.tgz", + "integrity": "sha512-jhwhknnPBGhfXAGV5GXUWfEhDFoP/DN8MPCO2yC5OAxyp6oVJ8lTPLkZYMTW5VL0c0eG44dXpF4Ib01V+PlDrQ==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.272.0.tgz", + "integrity": "sha512-Qy7/0fsDJxY5l0bEk7WKDfqb4Os/sCAgFR2zEvrhDtbkhYPf72ysvg/nRUTncmCbo8tOok4SJii2myk8KMfjjw==", + "optional": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/node-config-provider": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.272.0.tgz", + "integrity": "sha512-YYCIBh9g1EQo7hm2l22HX5Yr9RoPQ2RCvhzKvF1n1e8t1QH4iObQrYUtqHG4khcm64Cft8C5MwZmgzHbya5Z6Q==", + "optional": true, + "dependencies": { + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/node-http-handler": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.272.0.tgz", + "integrity": "sha512-VrW9PjhhngeyYp4yGYPe5S0vgZH6NwU3Po9xAgayUeE37Inr7LS1YteFMHdpgsUUeNXnh7d06CXqHo1XjtqOKA==", + "optional": true, + "dependencies": { + "@aws-sdk/abort-controller": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/querystring-builder": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/property-provider": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.272.0.tgz", + "integrity": "sha512-V1pZTaH5eqpAt8O8CzbItHhOtzIfFuWymvwZFkAtwKuaHpnl7jjrTouV482zoq8AD/fF+VVSshwBKYA7bhidIw==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/protocol-http": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.272.0.tgz", + "integrity": "sha512-4JQ54v5Yn08jspNDeHo45CaSn1CvTJqS1Ywgr79eU6jBExtguOWv6LNtwVSBD9X37v88iqaxt8iu1Z3pZZAJeg==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/querystring-builder": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.272.0.tgz", + "integrity": "sha512-ndo++7GkdCj5tBXE6rGcITpSpZS4PfyV38wntGYAlj9liL1omk3bLZRY6uzqqkJpVHqbg2fD7O2qHNItzZgqhw==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.272.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.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.272.0.tgz", + "integrity": "sha512-5oS4/9n6N1LZW9tI3qq/0GnCuWoOXRgcHVB+AJLRBvDbEe+GI+C/xK1tKLsfpDNgsQJHc4IPQoIt4megyZ/1+A==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/service-error-classification": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.272.0.tgz", + "integrity": "sha512-REoltM1LK9byyIufLqx9znhSolPcHQgVHIA2S0zu5sdt5qER4OubkLAXuo4MBbisUTmh8VOOvIyUb5ijZCXq1w==", + "optional": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/shared-ini-file-loader": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.272.0.tgz", + "integrity": "sha512-lzFPohp5sy2XvwFjZIzLVCRpC0i5cwBiaXmFzXYQZJm6FSCszHO4ax+m9yrtlyVFF/2YPWl+/bzNthy4aJtseA==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.272.0.tgz", + "integrity": "sha512-pWxnHG1NqJWMwlhJ6NHNiUikOL00DHROmxah6krJPMPq4I3am2KY2Rs/8ouWhnEXKaHAv4EQhSALJ+7Mq5S4/A==", + "optional": true, + "dependencies": { + "@aws-sdk/is-array-buffer": "3.201.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/util-hex-encoding": "3.201.0", + "@aws-sdk/util-middleware": "3.272.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.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.272.0.tgz", + "integrity": "sha512-pvdleJ3kaRvyRw2pIZnqL85ZlWBOZrPKmR9I69GCvlyrfdjRBhbSjIEZ+sdhZudw0vdHxq25AGoLUXhofVLf5Q==", + "optional": true, + "dependencies": { + "@aws-sdk/middleware-stack": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.272.0.tgz", + "integrity": "sha512-0GISJ4IKN2rXvbSddB775VjBGSKhYIGQnAdMqbvxi9LB6pSvVxcH9aIL28G0spiuL+dy3yGQZ8RlJPAyP9JW9A==", + "optional": true, + "dependencies": { + "@aws-sdk/client-sso-oidc": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.272.0.tgz", + "integrity": "sha512-MmmL6vxMGP5Bsi+4wRx4mxYlU/LX6M0noOXrDh/x5FfG7/4ZOar/nDxqDadhJtNM88cuWVHZWY59P54JzkGWmA==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/url-parser": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.272.0.tgz", + "integrity": "sha512-vX/Tx02PlnQ/Kgtf5TnrNDHPNbY+amLZjW0Z1d9vzAvSZhQ4i9Y18yxoRDIaDTCNVRDjdhV8iuctW+05PB5JtQ==", + "optional": true, + "dependencies": { + "@aws-sdk/querystring-parser": "3.272.0", + "@aws-sdk/types": "3.272.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.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.272.0.tgz", + "integrity": "sha512-W8ZVJSZRuUBg8l0JEZzUc+9fKlthVp/cdE+pFeF8ArhZelOLCiaeCrMaZAeJusaFzIpa6cmOYQAjtSMVyrwRtg==", + "optional": true, + "dependencies": { + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/types": "3.272.0", + "bowser": "^2.11.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-defaults-mode-node": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.272.0.tgz", + "integrity": "sha512-U0NTcbMw6KFk7uz/avBmfxQSTREEiX6JDMH68oN/3ux4AICd2I4jHyxnloSWGuiER1FxZf1dEJ8ZTwy8Ibl21Q==", + "optional": true, + "dependencies": { + "@aws-sdk/config-resolver": "3.272.0", + "@aws-sdk/credential-provider-imds": "3.272.0", + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.272.0.tgz", + "integrity": "sha512-c4MPUaJt2G6gGpoiwIOqDfUa98c1J63RpYvf/spQEKOtC/tF5Gfqlxuq8FnAl5lHnrqj1B9ZXLLxFhHtDR0IiQ==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.272.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.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.272.0.tgz", + "integrity": "sha512-Abw8m30arbwxqmeMMha5J11ESpHUNmCeSqSzE8/C4B8jZQtHY4kq7f+upzcNIQ11lsd+uzBEzNG3+dDRi0XOJQ==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-retry": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.272.0.tgz", + "integrity": "sha512-Ngha5414LR4gRHURVKC9ZYXsEJhMkm+SJ+44wlzOhavglfdcKKPUsibz5cKY1jpUV7oKECwaxHWpBB8r6h+hOg==", + "optional": true, + "dependencies": { + "@aws-sdk/service-error-classification": "3.272.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.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.272.0.tgz", + "integrity": "sha512-Lp5QX5bH6uuwBlIdr7w7OAcAI50ttyskb++yUr9i+SPvj6RI2dsfIBaK4mDg1qUdM5LeUdvIyqwj3XHjFKAAvA==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.272.0", + "bowser": "^2.11.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.272.0.tgz", + "integrity": "sha512-ljK+R3l+Q1LIHrcR+Knhk0rmcSkfFadZ8V+crEGpABf/QUQRg7NkZMsoe814tfBO5F7tMxo8wwwSdaVNNHtoRA==", + "optional": true, + "dependencies": { + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/types": "3.272.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/@esbuild/android-arm": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.4.tgz", + "integrity": "sha512-R9GCe2xl2XDSc2XbQB63mFiFXHIVkOP+ltIxICKXqUPrFX97z6Z7vONCLQM1pSOLGqfLrGi3B7nbhxmFY/fomg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.4.tgz", + "integrity": "sha512-91VwDrl4EpxBCiG6h2LZZEkuNvVZYJkv2T9gyLG/mhGG1qrM7i5SwUcg/hlSPnL/4hDT0TFcF35/XMGSn0bemg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.4.tgz", + "integrity": "sha512-mGSqhEPL7029XL7QHNPxPs15JVa02hvZvysUcyMP9UXdGFwncl2WU0bqx+Ysgzd+WAbv8rfNa73QveOxAnAM2w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.4.tgz", + "integrity": "sha512-tTyJRM9dHvlMPt1KrBFVB5OW1kXOsRNvAPtbzoKazd5RhD5/wKlXk1qR2MpaZRYwf4WDMadt0Pv0GwxB41CVow==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.4.tgz", + "integrity": "sha512-phQuC2Imrb3TjOJwLN8EO50nb2FHe8Ew0OwgZDH1SV6asIPGudnwTQtighDF2EAYlXChLoMJwqjAp4vAaACq6w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.4.tgz", + "integrity": "sha512-oH6JUZkocgmjzzYaP5juERLpJQSwazdjZrTPgLRmAU2bzJ688x0vfMB/WTv4r58RiecdHvXOPC46VtsMy/mepg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.4.tgz", + "integrity": "sha512-U4iWGn/9TrAfpAdfd56eO0pRxIgb0a8Wj9jClrhT8hvZnOnS4dfMPW7o4fn15D/KqoiVYHRm43jjBaTt3g/2KA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.4.tgz", + "integrity": "sha512-S2s9xWTGMTa/fG5EyMGDeL0wrWVgOSQcNddJWgu6rG1NCSXJHs76ZP9AsxjB3f2nZow9fWOyApklIgiTGZKhiw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.4.tgz", + "integrity": "sha512-UkGfQvYlwOaeYJzZG4cLV0hCASzQZnKNktRXUo3/BMZvdau40AOz9GzmGA063n1piq6VrFFh43apRDQx8hMP2w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.4.tgz", + "integrity": "sha512-3lqFi4VFo/Vwvn77FZXeLd0ctolIJH/uXkH3yNgEk89Eh6D3XXAC9/iTPEzeEpsNE5IqGIsFa5Z0iPeOh25IyA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.4.tgz", + "integrity": "sha512-HqpWZkVslDHIwdQ9D+gk7NuAulgQvRxF9no54ut/M55KEb3mi7sQS3GwpPJzSyzzP0UkjQVN7/tbk88/CaX4EQ==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.4.tgz", + "integrity": "sha512-d/nMCKKh/SVDbqR9ju+b78vOr0tNXtfBjcp5vfHONCCOAL9ad8gN9dC/u+UnH939pz7wO+0u/x9y1MaZcb/lKA==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.4.tgz", + "integrity": "sha512-lOD9p2dmjZcNiTU+sGe9Nn6G3aYw3k0HBJies1PU0j5IGfp6tdKOQ6mzfACRFCqXjnBuTqK7eTYpwx09O5LLfg==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.4.tgz", + "integrity": "sha512-mTGnwWwVshAjGsd8rP+K6583cPDgxOunsqqldEYij7T5/ysluMHKqUIT4TJHfrDFadUwrghAL6QjER4FeqQXoA==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.4.tgz", + "integrity": "sha512-AQYuUGp50XM29/N/dehADxvc2bUqDcoqrVuijop1Wv72SyxT6dDB9wjUxuPZm2HwIM876UoNNBMVd+iX/UTKVQ==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.4.tgz", + "integrity": "sha512-+AsFBwKgQuhV2shfGgA9YloxLDVjXgUEWZum7glR5lLmV94IThu/u2JZGxTgjYby6kyXEx8lKOqP5rTEVBR0Rw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.4.tgz", + "integrity": "sha512-zD1TKYX9553OiLS/qkXPMlWoELYkH/VkzRYNKEU+GwFiqkq0SuxsKnsCg5UCdxN3cqd+1KZ8SS3R+WG/Hxy2jQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.4.tgz", + "integrity": "sha512-PY1NjEsLRhPEFFg1AV0/4Or/gR+q2dOb9s5rXcPuCjyHRzbt8vnHJl3vYj+641TgWZzTFmSUnZbzs1zwTzjeqw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.4.tgz", + "integrity": "sha512-B3Z7s8QZQW9tKGleMRXvVmwwLPAUoDCHs4WZ2ElVMWiortLJFowU1NjAhXOKjDgC7o9ByeVcwyOlJ+F2r6ZgmQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.4.tgz", + "integrity": "sha512-0HCu8R3mY/H5V7N6kdlsJkvrT591bO/oRZy8ztF1dhgNU5xD5tAh5bKByT1UjTGjp/VVBsl1PDQ3L18SfvtnBQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.4.tgz", + "integrity": "sha512-VUjhVDQycse1gLbe06pC/uaA0M+piQXJpdpNdhg8sPmeIZZqu5xPoGWVCmcsOO2gaM2cywuTYTHkXRozo3/Nkg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.4.tgz", + "integrity": "sha512-0kLAjs+xN5OjhTt/aUA6t48SfENSCKgGPfExADYTOo/UCn0ivxos9/anUVeSfg+L+2O9xkFxvJXIJfG+Q4sYSg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", + "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/node-fetch": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/@mfd/rbxdatastoreservice": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/@mfd/rbxdatastoreservice/-/rbxdatastoreservice-2.3.11.tgz", + "integrity": "sha512-sZkBwBolSwHT2RDz4//7K0Vkxdjo2Zg1RSdSaUasTUKWj+BMeANgyLv/baMFHcJFE/Z+3kCcCkU/VHqfiQAHgA==", + "hasInstallScript": true, + "dependencies": { + "axios": "^0.27.2", + "crypto-js": "^4.0.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@redis/bloom": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", + "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/client": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.6.tgz", + "integrity": "sha512-dFD1S6je+A47Lj22jN/upVU2fj4huR7S9APd7/ziUXsIXDL+11GPYti4Suv5y8FuXaN+0ZG4JF+y1houEJ7ToA==", + "dependencies": { + "cluster-key-slot": "1.1.2", + "generic-pool": "3.9.0", + "yallist": "4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@redis/graph": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz", + "integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/json": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz", + "integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/search": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.2.tgz", + "integrity": "sha512-/cMfstG/fOh/SsE+4/BQGeuH/JJloeWuH+qJzM8dbxuWvdWibWAOAHHCZTMPhV3xIlH4/cUEIA8OV5QnYpaVoA==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/time-series": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz", + "integrity": "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "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/@yaireo/relative-time": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@yaireo/relative-time/-/relative-time-1.0.3.tgz", + "integrity": "sha512-CJGxyWjb4SnkqubyfiPNQeg0YrJKnVu+11DOP65ltXFxDsjjnm3IByXS9O1Ny9AU9Oxqg0a7Gt26tzXtcijicg==" + }, + "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==" + }, + "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": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "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==", + "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==", + "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==" + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "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==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "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/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.13", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", + "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "peer": true, + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001426", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "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/base32.js": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/base32.js/-/base32.js-0.0.1.tgz", + "integrity": "sha512-EGHIRiegFa62/SsA1J+Xs2tIzludPdzM064N9wjbiEgHnGnJ1V0WEpA4pEwCYT5nDvZk3ubf0shqaCS7k6xeUQ==" + }, + "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/bcrypt": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.0.tgz", + "integrity": "sha512-RHBS7HI5N5tEnGTmtR/pppX0mmDSBpQ4aCBsj7CEQfYXDcO74A8sIBYcJMuCsis2E81zDxeENYhv66oZwLiA+Q==", + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.10", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">= 10.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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/bintrees": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz", + "integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==" + }, + "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/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "peer": true, + "dependencies": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "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/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "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/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001441", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz", + "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ], + "peer": true + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "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/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.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/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "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/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "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/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "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.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", + "dependencies": { + "cookie": "0.4.1", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + }, + "node_modules/css-selector-tokenizer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz", + "integrity": "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==", + "dependencies": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssfilter": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", + "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==" + }, + "node_modules/daisyui": { + "version": "2.46.1", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-2.46.1.tgz", + "integrity": "sha512-i59+nLuzzPAVOhNhot3KLtt6stfYeCIPXs9uiLcpXjykpqxHfBA3W6hQWOUWPMwfqhyQd0WKub3sydtPGjzLtA==", + "dependencies": { + "color": "^4.2", + "css-selector-tokenizer": "^0.8.0", + "postcss-js": "^4.0.0", + "tailwindcss": "^3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/daisyui" + }, + "peerDependencies": { + "autoprefixer": "^10.0.2", + "postcss": "^8.1.6" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", + "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==", + "engines": { + "node": ">= 12" + } + }, + "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/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defined": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "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/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/detective": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", + "dependencies": { + "acorn-node": "^1.8.2", + "defined": "^1.0.0", + "minimist": "^1.2.6" + }, + "bin": { + "detective": "bin/detective.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "node_modules/dijkstrajs": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.2.tgz", + "integrity": "sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg==" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "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/easy-soap-request": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/easy-soap-request/-/easy-soap-request-4.8.0.tgz", + "integrity": "sha512-fD1NXRv14P4IdAoyYpGJ2kB+292vYfvU7qLbmUw2x2HA+U74LWVyErjyNf2Jxn1mUAwp+sRdMlkmrUrPY0/wAg==", + "dependencies": { + "axios": "^0.27.2" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "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/electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "peer": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encode-utf8": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", + "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==" + }, + "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/esbuild": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.4.tgz", + "integrity": "sha512-zBn9MeCwT7W5F1a3lXClD61ip6vQM+H8Msb0w8zMT4ZKBpDg+rFAraNyWCDelB/2L6M3g6AXHPnsyvjMFnxtFw==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.4", + "@esbuild/android-arm64": "0.17.4", + "@esbuild/android-x64": "0.17.4", + "@esbuild/darwin-arm64": "0.17.4", + "@esbuild/darwin-x64": "0.17.4", + "@esbuild/freebsd-arm64": "0.17.4", + "@esbuild/freebsd-x64": "0.17.4", + "@esbuild/linux-arm": "0.17.4", + "@esbuild/linux-arm64": "0.17.4", + "@esbuild/linux-ia32": "0.17.4", + "@esbuild/linux-loong64": "0.17.4", + "@esbuild/linux-mips64el": "0.17.4", + "@esbuild/linux-ppc64": "0.17.4", + "@esbuild/linux-riscv64": "0.17.4", + "@esbuild/linux-s390x": "0.17.4", + "@esbuild/linux-x64": "0.17.4", + "@esbuild/netbsd-x64": "0.17.4", + "@esbuild/openbsd-x64": "0.17.4", + "@esbuild/sunos-x64": "0.17.4", + "@esbuild/win32-arm64": "0.17.4", + "@esbuild/win32-ia32": "0.17.4", + "@esbuild/win32-x64": "0.17.4" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "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/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-flash-message": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/express-flash-message/-/express-flash-message-2.1.0.tgz", + "integrity": "sha512-oR/cwzt7CfjSUt7XwEZCCyOegylHuTF8/by6+jAshZh2TzREqDIjfU0JU5M6usurSk/ep3lUxxyaCbujyERyTQ==" + }, + "node_modules/express-prom-bundle": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/express-prom-bundle/-/express-prom-bundle-6.6.0.tgz", + "integrity": "sha512-tZh2P2p5a8/yxQ5VbRav011Poa4R0mHqdFwn9Swe/obXDe5F0jY9wtRAfNYnqk4LXY7akyvR/nrvAHxQPWUjsQ==", + "dependencies": { + "on-finished": "^2.3.0", + "url-value-parser": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "prom-client": ">=12.0.0" + } + }, + "node_modules/express-rate-limit": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.7.0.tgz", + "integrity": "sha512-vhwIdRoqcYB/72TK3tRZI+0ttS8Ytrk24GfmsxDXK9o9IhHNO5bXRiXQSExPQ4GbaE5tvIS7j1SGrxsuWs+sGA==", + "engines": { + "node": ">= 12.9.0" + }, + "peerDependencies": { + "express": "^4 || ^5" + } + }, + "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/express/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/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "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/fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/file-type-checker": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/file-type-checker/-/file-type-checker-1.0.4.tgz", + "integrity": "sha512-hhleilG34kfSjlSfAAj8DVvqXxMwEIVY/pkWnkMVbqdmly6jUv7jjNw/dmvdcbMt6joXlQgavCJCtNDRzODOsQ==" + }, + "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==", + "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/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "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/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "peer": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "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-memo": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fs-memo/-/fs-memo-1.2.0.tgz", + "integrity": "sha512-YEexkCpL4j03jn5SxaMHqcO6IuWuqm8JFUYhyCep7Ao89JIYmB8xoKhK7zXXJ9cCaNXpyNH5L3QtAmoxjoHW2w==" + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.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/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/generic-pool": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", + "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "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-port": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-6.1.2.tgz", + "integrity": "sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-port-please": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-2.6.1.tgz", + "integrity": "sha512-4PDSrL6+cuMM1xs6w36ZIkaKzzE0xzfVBCfebHIJ3FE8iB9oic/ECwPw3iNiD4h1AoJ5XLLBhEviFAVrZsDC5A==", + "dependencies": { + "fs-memo": "^1.2.0" + } + }, + "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==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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": "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/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/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "node_modules/helmet": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-5.1.1.tgz", + "integrity": "sha512-/yX0oVZBggA9cLJh8aw3PPCfedBnbd7J2aowjzsaWwZh7/UFY0nccn/aHAggIgWUFfnykX8GKd3a1pSbrmlcVQ==", + "engines": { + "node": ">=12.0.0" + } + }, + "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/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==", + "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==", + "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==" + }, + "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/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "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-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "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==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "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==", + "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==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jsonpath-plus": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz", + "integrity": "sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", + "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", + "dependencies": { + "jws": "^3.2.2", + "lodash": "^4.17.21", + "ms": "^2.1.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/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/just-clone": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/just-clone/-/just-clone-6.2.0.tgz", + "integrity": "sha512-1IynUYEc/HAwxhi3WDpIpxJbZpMCvvrrmZVqvj9EhpvbH8lls7HhdhiByjL7DkAaWlLIzpC0Xc/VPvy/UxLNjA==" + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "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/lilconfig": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "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/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "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/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.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/minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz", + "integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mongo-sanitize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mongo-sanitize/-/mongo-sanitize-1.1.0.tgz", + "integrity": "sha512-6gB9AiJD+om2eZLxaPKIP5Q8P3Fr+s+17rVWso7hU0+MAzmIvIMlgTYuyvalDLTtE/p0gczcvJ8A3pbN1XmQ/A==" + }, + "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-unique-validator": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mongoose-unique-validator/-/mongoose-unique-validator-3.1.0.tgz", + "integrity": "sha512-UsBBlFapip8gc8x1h+nLWnkOy+GTy9Z+zmTyZ35icLV3EoLIVz180vJzepfMM9yBy2AJh+maeuoM8CWtqejGUg==", + "dependencies": { + "lodash.foreach": "^4.1.0", + "lodash.get": "^4.0.2", + "lodash.merge": "^4.6.2" + }, + "peerDependencies": { + "mongoose": "^6.0.0" + } + }, + "node_modules/mongoose/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/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.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/multer": { + "version": "1.4.5-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", + "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "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/node-addon-api": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz", + "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==" + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.0.tgz", + "integrity": "sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/node-releases": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", + "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", + "peer": true + }, + "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/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nodemon/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==", + "dev": true + }, + "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/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "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/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "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/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "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/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/png-validator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/png-validator/-/png-validator-1.1.0.tgz", + "integrity": "sha512-MlRLyPI1p3/dJbsjVH+4xOPucycrz8T3EvO0BzCXaNtrUhZkZROtzib9J6mnC81AJO8eBIwiDZwTFel2cMmSuQ==" + }, + "node_modules/pngjs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", + "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/postcss": { + "version": "8.4.20", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.20.tgz", + "integrity": "sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", + "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" + } + }, + "node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", + "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/prom-client": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-14.1.1.tgz", + "integrity": "sha512-hFU32q7UZQ59bVJQGUtm3I2PrJ3gWvoCkilX9sF165ks1qflhugVCeK+S1JjJYHvyt3o5kj68+q3bchormjnzw==", + "dependencies": { + "tdigest": "^0.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "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/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/qrcode": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.1.tgz", + "integrity": "sha512-nS8NJ1Z3md8uTjKtP+SGGhfqmTCs5flU/xR623oI0JX+Wepz9R8UrRVCTBTJm3qGw3rH6jJ6MUHjkDx15cxSSg==", + "dependencies": { + "dijkstrajs": "^1.0.1", + "encode-utf8": "^1.0.3", + "pngjs": "^5.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "qrcode": "bin/qrcode" + }, + "engines": { + "node": ">=10.13.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/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "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/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/redis": { + "version": "4.6.5", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.5.tgz", + "integrity": "sha512-O0OWA36gDQbswOdUuAhRL6mTZpHFN525HlgZgDaVNgCJIAZR3ya06NTESb0R+TUZ+BFaDpz6NnnVvoMx9meUFg==", + "dependencies": { + "@redis/bloom": "1.2.0", + "@redis/client": "1.5.6", + "@redis/graph": "1.1.0", + "@redis/json": "1.0.4", + "@redis/search": "1.1.2", + "@redis/time-series": "1.0.4" + } + }, + "node_modules/redis-om": { + "version": "0.4.0-beta.3", + "resolved": "https://registry.npmjs.org/redis-om/-/redis-om-0.4.0-beta.3.tgz", + "integrity": "sha512-zGWBMGoe3exrvkbFjWqAFG8UJL3tdby5UkfPKiZLvA67d7FsR0ScEpsBaaWGL33y5EQUWnYL+pI8jzZaQ6brtA==", + "dependencies": { + "jsonpath-plus": "^7.2.0", + "just-clone": "^6.1.1", + "redis": "^4.6.4", + "ulid": "^2.3.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/req-flash": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/req-flash/-/req-flash-0.0.3.tgz", + "integrity": "sha512-c5ouPRJ6OVc4ecL5cgdwd51nYOFQiOTfl7UWk+VlgUHgfsh7TMRFPN/OJ5ETnOYFyswprT8C2a6ctMvJgms9ng==" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/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/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/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/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "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": { + "queue-microtask": "^1.2.2" + } + }, + "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/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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/send/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/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/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "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/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "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/speakeasy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/speakeasy/-/speakeasy-2.0.0.tgz", + "integrity": "sha512-lW2A2s5LKi8rwu77ewisuUOtlCydF/hmQSOJjpTqTj1gZLkNgTaYnyvfxy2WBr4T/h+9c4g8HIITfj83OkFQFw==", + "dependencies": { + "base32.js": "0.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "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/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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": "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/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz", + "integrity": "sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==", + "dependencies": { + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "color-name": "^1.1.4", + "detective": "^5.2.1", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "lilconfig": "^2.0.6", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.18", + "postcss-import": "^14.1.0", + "postcss-js": "^4.0.0", + "postcss-load-config": "^3.1.4", + "postcss-nested": "6.0.0", + "postcss-selector-parser": "^6.0.10", + "postcss-value-parser": "^4.2.0", + "quick-lru": "^5.1.1", + "resolve": "^1.22.1" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tar": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^4.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tdigest": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz", + "integrity": "sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==", + "dependencies": { + "bintrees": "1.0.2" + } + }, + "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==", + "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/touch/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/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-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/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "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/ulid": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ulid/-/ulid-2.3.0.tgz", + "integrity": "sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw==", + "bin": { + "ulid": "bin/cli.js" + } + }, + "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/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/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "peer": true, + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/url-value-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/url-value-parser/-/url-value-parser-2.2.0.tgz", + "integrity": "sha512-yIQdxJpgkPamPPAPuGdS7Q548rLhny42tg8d4vyTNzFqvOnwqrgHXvgehT09U7fwrzxi3RxCiXjoNUNnNOlQ8A==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "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/web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "engines": { + "node": ">= 8" + } + }, + "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/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, + "node_modules/xss": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.14.tgz", + "integrity": "sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw==", + "dependencies": { + "commander": "^2.20.3", + "cssfilter": "0.0.10" + }, + "bin": { + "xss": "bin/xss" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + } + }, + "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.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.272.0.tgz", + "integrity": "sha512-s2TV3phapcTwZNr4qLxbfuQuE9ZMP4RoJdkvRRCkKdm6jslsWLJf2Zlcxti/23hOlINUMYv2iXE2pftIgWGdpg==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/client-cognito-identity": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.272.0.tgz", + "integrity": "sha512-uMjRWcNvX7SoGaVn0mXWD43+Z1awPahQwGW3riDLfXHZdOgw2oFDhD3Jg5jQ8OzQLUfDvArhE3WyZwlS4muMuQ==", + "optional": true, + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.272.0", + "@aws-sdk/config-resolver": "3.272.0", + "@aws-sdk/credential-provider-node": "3.272.0", + "@aws-sdk/fetch-http-handler": "3.272.0", + "@aws-sdk/hash-node": "3.272.0", + "@aws-sdk/invalid-dependency": "3.272.0", + "@aws-sdk/middleware-content-length": "3.272.0", + "@aws-sdk/middleware-endpoint": "3.272.0", + "@aws-sdk/middleware-host-header": "3.272.0", + "@aws-sdk/middleware-logger": "3.272.0", + "@aws-sdk/middleware-recursion-detection": "3.272.0", + "@aws-sdk/middleware-retry": "3.272.0", + "@aws-sdk/middleware-serde": "3.272.0", + "@aws-sdk/middleware-signing": "3.272.0", + "@aws-sdk/middleware-stack": "3.272.0", + "@aws-sdk/middleware-user-agent": "3.272.0", + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/node-http-handler": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/smithy-client": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/url-parser": "3.272.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.272.0", + "@aws-sdk/util-defaults-mode-node": "3.272.0", + "@aws-sdk/util-endpoints": "3.272.0", + "@aws-sdk/util-retry": "3.272.0", + "@aws-sdk/util-user-agent-browser": "3.272.0", + "@aws-sdk/util-user-agent-node": "3.272.0", + "@aws-sdk/util-utf8": "3.254.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/client-sso": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.272.0.tgz", + "integrity": "sha512-xn9a0IGONwQIARmngThoRhF1lLGjHAD67sUaShgIMaIMc6ipVYN6alWG1VuUpoUQ6iiwMEt0CHdfCyLyUV/fTA==", + "optional": true, + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.272.0", + "@aws-sdk/fetch-http-handler": "3.272.0", + "@aws-sdk/hash-node": "3.272.0", + "@aws-sdk/invalid-dependency": "3.272.0", + "@aws-sdk/middleware-content-length": "3.272.0", + "@aws-sdk/middleware-endpoint": "3.272.0", + "@aws-sdk/middleware-host-header": "3.272.0", + "@aws-sdk/middleware-logger": "3.272.0", + "@aws-sdk/middleware-recursion-detection": "3.272.0", + "@aws-sdk/middleware-retry": "3.272.0", + "@aws-sdk/middleware-serde": "3.272.0", + "@aws-sdk/middleware-stack": "3.272.0", + "@aws-sdk/middleware-user-agent": "3.272.0", + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/node-http-handler": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/smithy-client": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/url-parser": "3.272.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.272.0", + "@aws-sdk/util-defaults-mode-node": "3.272.0", + "@aws-sdk/util-endpoints": "3.272.0", + "@aws-sdk/util-retry": "3.272.0", + "@aws-sdk/util-user-agent-browser": "3.272.0", + "@aws-sdk/util-user-agent-node": "3.272.0", + "@aws-sdk/util-utf8": "3.254.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/client-sso-oidc": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.272.0.tgz", + "integrity": "sha512-ECcXu3xoa1yggnGKMTh29eWNHiF/wC6r5Uqbla22eOOosyh0+Z6lkJ3JUSLOUKCkBXA4Cs/tJL9UDFBrKbSlvA==", + "optional": true, + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.272.0", + "@aws-sdk/fetch-http-handler": "3.272.0", + "@aws-sdk/hash-node": "3.272.0", + "@aws-sdk/invalid-dependency": "3.272.0", + "@aws-sdk/middleware-content-length": "3.272.0", + "@aws-sdk/middleware-endpoint": "3.272.0", + "@aws-sdk/middleware-host-header": "3.272.0", + "@aws-sdk/middleware-logger": "3.272.0", + "@aws-sdk/middleware-recursion-detection": "3.272.0", + "@aws-sdk/middleware-retry": "3.272.0", + "@aws-sdk/middleware-serde": "3.272.0", + "@aws-sdk/middleware-stack": "3.272.0", + "@aws-sdk/middleware-user-agent": "3.272.0", + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/node-http-handler": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/smithy-client": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/url-parser": "3.272.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.272.0", + "@aws-sdk/util-defaults-mode-node": "3.272.0", + "@aws-sdk/util-endpoints": "3.272.0", + "@aws-sdk/util-retry": "3.272.0", + "@aws-sdk/util-user-agent-browser": "3.272.0", + "@aws-sdk/util-user-agent-node": "3.272.0", + "@aws-sdk/util-utf8": "3.254.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/client-sts": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.272.0.tgz", + "integrity": "sha512-kigxCxURp3WupufGaL/LABMb7UQfzAQkKcj9royizL3ItJ0vw5kW/JFrPje5IW1mfLgdPF7PI9ShOjE0fCLTqA==", + "optional": true, + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.272.0", + "@aws-sdk/credential-provider-node": "3.272.0", + "@aws-sdk/fetch-http-handler": "3.272.0", + "@aws-sdk/hash-node": "3.272.0", + "@aws-sdk/invalid-dependency": "3.272.0", + "@aws-sdk/middleware-content-length": "3.272.0", + "@aws-sdk/middleware-endpoint": "3.272.0", + "@aws-sdk/middleware-host-header": "3.272.0", + "@aws-sdk/middleware-logger": "3.272.0", + "@aws-sdk/middleware-recursion-detection": "3.272.0", + "@aws-sdk/middleware-retry": "3.272.0", + "@aws-sdk/middleware-sdk-sts": "3.272.0", + "@aws-sdk/middleware-serde": "3.272.0", + "@aws-sdk/middleware-signing": "3.272.0", + "@aws-sdk/middleware-stack": "3.272.0", + "@aws-sdk/middleware-user-agent": "3.272.0", + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/node-http-handler": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/smithy-client": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/url-parser": "3.272.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.272.0", + "@aws-sdk/util-defaults-mode-node": "3.272.0", + "@aws-sdk/util-endpoints": "3.272.0", + "@aws-sdk/util-retry": "3.272.0", + "@aws-sdk/util-user-agent-browser": "3.272.0", + "@aws-sdk/util-user-agent-node": "3.272.0", + "@aws-sdk/util-utf8": "3.254.0", + "fast-xml-parser": "4.0.11", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/config-resolver": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.272.0.tgz", + "integrity": "sha512-Dr4CffRVNsOp3LRNdpvcH6XuSgXOSLblWliCy/5I86cNl567KVMxujVx6uPrdTXYs2h1rt3MNl6jQGnAiJeTbw==", + "optional": true, + "requires": { + "@aws-sdk/signature-v4": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/util-config-provider": "3.208.0", + "@aws-sdk/util-middleware": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-cognito-identity": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.272.0.tgz", + "integrity": "sha512-rVx0rtQjbiYCM0nah2rB/2ut2YJYPpRr1AbW/Hd4r/PI+yiusrmXAwuT4HIW2yr34zsQMPi1jZ3WHN9Rn9mzlg==", + "optional": true, + "requires": { + "@aws-sdk/client-cognito-identity": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-env": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.272.0.tgz", + "integrity": "sha512-QI65NbLnKLYHyTYhXaaUrq6eVsCCrMUb05WDA7+TJkWkjXesovpjc8vUKgFiLSxmgKmb2uOhHNcDyObKMrYQFw==", + "optional": true, + "requires": { + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-imds": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.272.0.tgz", + "integrity": "sha512-wwAfVY1jTFQEfxVfdYD5r5ieYGl+0g4nhekVxNMqE8E1JeRDd18OqiwAflzpgBIqxfqvCUkf+vl5JYyacMkNAQ==", + "optional": true, + "requires": { + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/url-parser": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-ini": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.272.0.tgz", + "integrity": "sha512-iE3CDzK5NcupHYjfYjBdY1JCy8NLEoRUsboEjG0i0gy3S3jVpDeVHX1dLVcL/slBFj6GiM7SoNV/UfKnJf3Gaw==", + "optional": true, + "requires": { + "@aws-sdk/credential-provider-env": "3.272.0", + "@aws-sdk/credential-provider-imds": "3.272.0", + "@aws-sdk/credential-provider-process": "3.272.0", + "@aws-sdk/credential-provider-sso": "3.272.0", + "@aws-sdk/credential-provider-web-identity": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-node": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.272.0.tgz", + "integrity": "sha512-FI8uvwM1IxiRSvbkdKv8DZG5vxU3ezaseTaB1fHWTxEUFb0pWIoHX9oeOKer9Fj31SOZTCNAaYFURbSRuZlm/w==", + "optional": true, + "requires": { + "@aws-sdk/credential-provider-env": "3.272.0", + "@aws-sdk/credential-provider-imds": "3.272.0", + "@aws-sdk/credential-provider-ini": "3.272.0", + "@aws-sdk/credential-provider-process": "3.272.0", + "@aws-sdk/credential-provider-sso": "3.272.0", + "@aws-sdk/credential-provider-web-identity": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-process": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.272.0.tgz", + "integrity": "sha512-hiCAjWWm2PeBFp5cjkxqyam/XADjiS+e7GzwC34TbZn3LisS0uoweLojj9tD11NnnUhyhbLteUvu5+rotOLwrg==", + "optional": true, + "requires": { + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-sso": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.272.0.tgz", + "integrity": "sha512-hwYaulyiU/7chKKFecxCeo0ls6Dxs7h+5EtoYcJJGvfpvCncyOZF35t00OAsCd3Wo7HkhhgfpGdb6dmvCNQAZQ==", + "optional": true, + "requires": { + "@aws-sdk/client-sso": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/token-providers": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-web-identity": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.272.0.tgz", + "integrity": "sha512-ImrHMkcgneGa/HadHAQXPwOrX26sAKuB8qlMxZF/ZCM2B55u8deY+ZVkVuraeKb7YsahMGehPFOfRAF6mvFI5Q==", + "optional": true, + "requires": { + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-providers": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.272.0.tgz", + "integrity": "sha512-ucd6Xq6aBMf+nM4uz5zkjL11mwaE5BV1Q4hkulaGu2v1dRA8n6zhLJk/sb4hOJ7leelqMJMErlbQ2T3MkYvlJQ==", + "optional": true, + "requires": { + "@aws-sdk/client-cognito-identity": "3.272.0", + "@aws-sdk/client-sso": "3.272.0", + "@aws-sdk/client-sts": "3.272.0", + "@aws-sdk/credential-provider-cognito-identity": "3.272.0", + "@aws-sdk/credential-provider-env": "3.272.0", + "@aws-sdk/credential-provider-imds": "3.272.0", + "@aws-sdk/credential-provider-ini": "3.272.0", + "@aws-sdk/credential-provider-node": "3.272.0", + "@aws-sdk/credential-provider-process": "3.272.0", + "@aws-sdk/credential-provider-sso": "3.272.0", + "@aws-sdk/credential-provider-web-identity": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/fetch-http-handler": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.272.0.tgz", + "integrity": "sha512-1Qhm9e0RbS1Xf4CZqUbQyUMkDLd7GrsRXWIvm9b86/vgeV8/WnjO3CMue9D51nYgcyQORhYXv6uVjAYCWbUExA==", + "optional": true, + "requires": { + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/querystring-builder": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/util-base64": "3.208.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/hash-node": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.272.0.tgz", + "integrity": "sha512-40dwND+iAm3VtPHPZu7/+CIdVJFk2s0cWZt1lOiMPMSXycSYJ45wMk7Lly3uoqRx0uWfFK5iT2OCv+fJi5jTng==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.272.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.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.272.0.tgz", + "integrity": "sha512-ysW6wbjl1Y78txHUQ/Tldj2Rg1BI7rpMO9B9xAF6yAX3mQ7t6SUPQG/ewOGvH2208NBIl3qP5e/hDf0Q6r/1iw==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.272.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.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.272.0.tgz", + "integrity": "sha512-sAbDZSTNmLX+UTGwlUHJBWy0QGQkiClpHwVFXACon+aG0ySLNeRKEVYs6NCPYldw4cj6hveLUn50cX44ukHErw==", + "optional": true, + "requires": { + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-endpoint": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.272.0.tgz", + "integrity": "sha512-Dk3JVjj7SxxoUKv3xGiOeBksvPtFhTDrVW75XJ98Ymv8gJH5L1sq4hIeJAHRKogGiRFq2J73mnZSlM9FVXEylg==", + "optional": true, + "requires": { + "@aws-sdk/middleware-serde": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/signature-v4": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/url-parser": "3.272.0", + "@aws-sdk/util-config-provider": "3.208.0", + "@aws-sdk/util-middleware": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-host-header": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.272.0.tgz", + "integrity": "sha512-Q8K7bMMFZnioUXpxn57HIt4p+I63XaNAawMLIZ5B4F2piyukbQeM9q2XVKMGwqLvijHR8CyP5nHrtKqVuINogQ==", + "optional": true, + "requires": { + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-logger": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.272.0.tgz", + "integrity": "sha512-u2SQ0hWrFwxbxxYMG5uMEgf01pQY5jauK/LYWgGIvuCmFgiyRQQP3oN7kkmsxnS9MWmNmhbyQguX2NY02s5e9w==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-recursion-detection": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.272.0.tgz", + "integrity": "sha512-Gp/eKWeUWVNiiBdmUM2qLkBv+VLSJKoWAO+aKmyxxwjjmWhE0FrfA1NQ1a3g+NGMhRbAfQdaYswRAKsul70ISg==", + "optional": true, + "requires": { + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-retry": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.272.0.tgz", + "integrity": "sha512-pCGvHM7C76VbO/dFerH+Vwf7tGv7j+e+eGrvhQ35mRghCtfIou/WMfTZlD1TNee93crrAQQVZKjtW3dMB3WCzg==", + "optional": true, + "requires": { + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/service-error-classification": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/util-middleware": "3.272.0", + "@aws-sdk/util-retry": "3.272.0", + "tslib": "^2.3.1", + "uuid": "^8.3.2" + } + }, + "@aws-sdk/middleware-sdk-sts": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.272.0.tgz", + "integrity": "sha512-VvYPg7LrDIjUOWueSzo2wBzcNG7dw+cmzV6zAKaLxf0RC5jeAP4hE0OzDiiZfDrjNghEzgq/V+0NO+LewqYL9Q==", + "optional": true, + "requires": { + "@aws-sdk/middleware-signing": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/signature-v4": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-serde": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.272.0.tgz", + "integrity": "sha512-kW1uOxgPSwtXPB5rm3QLdWomu42lkYpQL94tM1BjyFOWmBLO2lQhk5a7Dw6HkTozT9a+vxtscLChRa6KZe61Hw==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-signing": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.272.0.tgz", + "integrity": "sha512-4LChFK4VAR91X+dupqM8fQqYhFGE0G4Bf9rQlVTgGSbi2KUOmpqXzH0/WKE228nKuEhmH8+Qd2VPSAE2JcyAUA==", + "optional": true, + "requires": { + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/signature-v4": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/util-middleware": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-stack": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.272.0.tgz", + "integrity": "sha512-jhwhknnPBGhfXAGV5GXUWfEhDFoP/DN8MPCO2yC5OAxyp6oVJ8lTPLkZYMTW5VL0c0eG44dXpF4Ib01V+PlDrQ==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-user-agent": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.272.0.tgz", + "integrity": "sha512-Qy7/0fsDJxY5l0bEk7WKDfqb4Os/sCAgFR2zEvrhDtbkhYPf72ysvg/nRUTncmCbo8tOok4SJii2myk8KMfjjw==", + "optional": true, + "requires": { + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/node-config-provider": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.272.0.tgz", + "integrity": "sha512-YYCIBh9g1EQo7hm2l22HX5Yr9RoPQ2RCvhzKvF1n1e8t1QH4iObQrYUtqHG4khcm64Cft8C5MwZmgzHbya5Z6Q==", + "optional": true, + "requires": { + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/node-http-handler": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.272.0.tgz", + "integrity": "sha512-VrW9PjhhngeyYp4yGYPe5S0vgZH6NwU3Po9xAgayUeE37Inr7LS1YteFMHdpgsUUeNXnh7d06CXqHo1XjtqOKA==", + "optional": true, + "requires": { + "@aws-sdk/abort-controller": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/querystring-builder": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/property-provider": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.272.0.tgz", + "integrity": "sha512-V1pZTaH5eqpAt8O8CzbItHhOtzIfFuWymvwZFkAtwKuaHpnl7jjrTouV482zoq8AD/fF+VVSshwBKYA7bhidIw==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/protocol-http": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.272.0.tgz", + "integrity": "sha512-4JQ54v5Yn08jspNDeHo45CaSn1CvTJqS1Ywgr79eU6jBExtguOWv6LNtwVSBD9X37v88iqaxt8iu1Z3pZZAJeg==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/querystring-builder": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.272.0.tgz", + "integrity": "sha512-ndo++7GkdCj5tBXE6rGcITpSpZS4PfyV38wntGYAlj9liL1omk3bLZRY6uzqqkJpVHqbg2fD7O2qHNItzZgqhw==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.272.0", + "@aws-sdk/util-uri-escape": "3.201.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/querystring-parser": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.272.0.tgz", + "integrity": "sha512-5oS4/9n6N1LZW9tI3qq/0GnCuWoOXRgcHVB+AJLRBvDbEe+GI+C/xK1tKLsfpDNgsQJHc4IPQoIt4megyZ/1+A==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/service-error-classification": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.272.0.tgz", + "integrity": "sha512-REoltM1LK9byyIufLqx9znhSolPcHQgVHIA2S0zu5sdt5qER4OubkLAXuo4MBbisUTmh8VOOvIyUb5ijZCXq1w==", + "optional": true + }, + "@aws-sdk/shared-ini-file-loader": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.272.0.tgz", + "integrity": "sha512-lzFPohp5sy2XvwFjZIzLVCRpC0i5cwBiaXmFzXYQZJm6FSCszHO4ax+m9yrtlyVFF/2YPWl+/bzNthy4aJtseA==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/signature-v4": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.272.0.tgz", + "integrity": "sha512-pWxnHG1NqJWMwlhJ6NHNiUikOL00DHROmxah6krJPMPq4I3am2KY2Rs/8ouWhnEXKaHAv4EQhSALJ+7Mq5S4/A==", + "optional": true, + "requires": { + "@aws-sdk/is-array-buffer": "3.201.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/util-hex-encoding": "3.201.0", + "@aws-sdk/util-middleware": "3.272.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.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.272.0.tgz", + "integrity": "sha512-pvdleJ3kaRvyRw2pIZnqL85ZlWBOZrPKmR9I69GCvlyrfdjRBhbSjIEZ+sdhZudw0vdHxq25AGoLUXhofVLf5Q==", + "optional": true, + "requires": { + "@aws-sdk/middleware-stack": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/token-providers": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.272.0.tgz", + "integrity": "sha512-0GISJ4IKN2rXvbSddB775VjBGSKhYIGQnAdMqbvxi9LB6pSvVxcH9aIL28G0spiuL+dy3yGQZ8RlJPAyP9JW9A==", + "optional": true, + "requires": { + "@aws-sdk/client-sso-oidc": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/types": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.272.0.tgz", + "integrity": "sha512-MmmL6vxMGP5Bsi+4wRx4mxYlU/LX6M0noOXrDh/x5FfG7/4ZOar/nDxqDadhJtNM88cuWVHZWY59P54JzkGWmA==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/url-parser": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.272.0.tgz", + "integrity": "sha512-vX/Tx02PlnQ/Kgtf5TnrNDHPNbY+amLZjW0Z1d9vzAvSZhQ4i9Y18yxoRDIaDTCNVRDjdhV8iuctW+05PB5JtQ==", + "optional": true, + "requires": { + "@aws-sdk/querystring-parser": "3.272.0", + "@aws-sdk/types": "3.272.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.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.272.0.tgz", + "integrity": "sha512-W8ZVJSZRuUBg8l0JEZzUc+9fKlthVp/cdE+pFeF8ArhZelOLCiaeCrMaZAeJusaFzIpa6cmOYQAjtSMVyrwRtg==", + "optional": true, + "requires": { + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/types": "3.272.0", + "bowser": "^2.11.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-defaults-mode-node": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.272.0.tgz", + "integrity": "sha512-U0NTcbMw6KFk7uz/avBmfxQSTREEiX6JDMH68oN/3ux4AICd2I4jHyxnloSWGuiER1FxZf1dEJ8ZTwy8Ibl21Q==", + "optional": true, + "requires": { + "@aws-sdk/config-resolver": "3.272.0", + "@aws-sdk/credential-provider-imds": "3.272.0", + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-endpoints": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.272.0.tgz", + "integrity": "sha512-c4MPUaJt2G6gGpoiwIOqDfUa98c1J63RpYvf/spQEKOtC/tF5Gfqlxuq8FnAl5lHnrqj1B9ZXLLxFhHtDR0IiQ==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.272.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.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.272.0.tgz", + "integrity": "sha512-Abw8m30arbwxqmeMMha5J11ESpHUNmCeSqSzE8/C4B8jZQtHY4kq7f+upzcNIQ11lsd+uzBEzNG3+dDRi0XOJQ==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-retry": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.272.0.tgz", + "integrity": "sha512-Ngha5414LR4gRHURVKC9ZYXsEJhMkm+SJ+44wlzOhavglfdcKKPUsibz5cKY1jpUV7oKECwaxHWpBB8r6h+hOg==", + "optional": true, + "requires": { + "@aws-sdk/service-error-classification": "3.272.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.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.272.0.tgz", + "integrity": "sha512-Lp5QX5bH6uuwBlIdr7w7OAcAI50ttyskb++yUr9i+SPvj6RI2dsfIBaK4mDg1qUdM5LeUdvIyqwj3XHjFKAAvA==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.272.0", + "bowser": "^2.11.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-user-agent-node": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.272.0.tgz", + "integrity": "sha512-ljK+R3l+Q1LIHrcR+Knhk0rmcSkfFadZ8V+crEGpABf/QUQRg7NkZMsoe814tfBO5F7tMxo8wwwSdaVNNHtoRA==", + "optional": true, + "requires": { + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/types": "3.272.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" + } + }, + "@esbuild/android-arm": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.4.tgz", + "integrity": "sha512-R9GCe2xl2XDSc2XbQB63mFiFXHIVkOP+ltIxICKXqUPrFX97z6Z7vONCLQM1pSOLGqfLrGi3B7nbhxmFY/fomg==", + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.4.tgz", + "integrity": "sha512-91VwDrl4EpxBCiG6h2LZZEkuNvVZYJkv2T9gyLG/mhGG1qrM7i5SwUcg/hlSPnL/4hDT0TFcF35/XMGSn0bemg==", + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.4.tgz", + "integrity": "sha512-mGSqhEPL7029XL7QHNPxPs15JVa02hvZvysUcyMP9UXdGFwncl2WU0bqx+Ysgzd+WAbv8rfNa73QveOxAnAM2w==", + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.4.tgz", + "integrity": "sha512-tTyJRM9dHvlMPt1KrBFVB5OW1kXOsRNvAPtbzoKazd5RhD5/wKlXk1qR2MpaZRYwf4WDMadt0Pv0GwxB41CVow==", + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.4.tgz", + "integrity": "sha512-phQuC2Imrb3TjOJwLN8EO50nb2FHe8Ew0OwgZDH1SV6asIPGudnwTQtighDF2EAYlXChLoMJwqjAp4vAaACq6w==", + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.4.tgz", + "integrity": "sha512-oH6JUZkocgmjzzYaP5juERLpJQSwazdjZrTPgLRmAU2bzJ688x0vfMB/WTv4r58RiecdHvXOPC46VtsMy/mepg==", + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.4.tgz", + "integrity": "sha512-U4iWGn/9TrAfpAdfd56eO0pRxIgb0a8Wj9jClrhT8hvZnOnS4dfMPW7o4fn15D/KqoiVYHRm43jjBaTt3g/2KA==", + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.4.tgz", + "integrity": "sha512-S2s9xWTGMTa/fG5EyMGDeL0wrWVgOSQcNddJWgu6rG1NCSXJHs76ZP9AsxjB3f2nZow9fWOyApklIgiTGZKhiw==", + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.4.tgz", + "integrity": "sha512-UkGfQvYlwOaeYJzZG4cLV0hCASzQZnKNktRXUo3/BMZvdau40AOz9GzmGA063n1piq6VrFFh43apRDQx8hMP2w==", + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.4.tgz", + "integrity": "sha512-3lqFi4VFo/Vwvn77FZXeLd0ctolIJH/uXkH3yNgEk89Eh6D3XXAC9/iTPEzeEpsNE5IqGIsFa5Z0iPeOh25IyA==", + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.4.tgz", + "integrity": "sha512-HqpWZkVslDHIwdQ9D+gk7NuAulgQvRxF9no54ut/M55KEb3mi7sQS3GwpPJzSyzzP0UkjQVN7/tbk88/CaX4EQ==", + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.4.tgz", + "integrity": "sha512-d/nMCKKh/SVDbqR9ju+b78vOr0tNXtfBjcp5vfHONCCOAL9ad8gN9dC/u+UnH939pz7wO+0u/x9y1MaZcb/lKA==", + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.4.tgz", + "integrity": "sha512-lOD9p2dmjZcNiTU+sGe9Nn6G3aYw3k0HBJies1PU0j5IGfp6tdKOQ6mzfACRFCqXjnBuTqK7eTYpwx09O5LLfg==", + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.4.tgz", + "integrity": "sha512-mTGnwWwVshAjGsd8rP+K6583cPDgxOunsqqldEYij7T5/ysluMHKqUIT4TJHfrDFadUwrghAL6QjER4FeqQXoA==", + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.4.tgz", + "integrity": "sha512-AQYuUGp50XM29/N/dehADxvc2bUqDcoqrVuijop1Wv72SyxT6dDB9wjUxuPZm2HwIM876UoNNBMVd+iX/UTKVQ==", + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.4.tgz", + "integrity": "sha512-+AsFBwKgQuhV2shfGgA9YloxLDVjXgUEWZum7glR5lLmV94IThu/u2JZGxTgjYby6kyXEx8lKOqP5rTEVBR0Rw==", + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.4.tgz", + "integrity": "sha512-zD1TKYX9553OiLS/qkXPMlWoELYkH/VkzRYNKEU+GwFiqkq0SuxsKnsCg5UCdxN3cqd+1KZ8SS3R+WG/Hxy2jQ==", + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.4.tgz", + "integrity": "sha512-PY1NjEsLRhPEFFg1AV0/4Or/gR+q2dOb9s5rXcPuCjyHRzbt8vnHJl3vYj+641TgWZzTFmSUnZbzs1zwTzjeqw==", + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.4.tgz", + "integrity": "sha512-B3Z7s8QZQW9tKGleMRXvVmwwLPAUoDCHs4WZ2ElVMWiortLJFowU1NjAhXOKjDgC7o9ByeVcwyOlJ+F2r6ZgmQ==", + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.4.tgz", + "integrity": "sha512-0HCu8R3mY/H5V7N6kdlsJkvrT591bO/oRZy8ztF1dhgNU5xD5tAh5bKByT1UjTGjp/VVBsl1PDQ3L18SfvtnBQ==", + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.4.tgz", + "integrity": "sha512-VUjhVDQycse1gLbe06pC/uaA0M+piQXJpdpNdhg8sPmeIZZqu5xPoGWVCmcsOO2gaM2cywuTYTHkXRozo3/Nkg==", + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.4.tgz", + "integrity": "sha512-0kLAjs+xN5OjhTt/aUA6t48SfENSCKgGPfExADYTOo/UCn0ivxos9/anUVeSfg+L+2O9xkFxvJXIJfG+Q4sYSg==", + "optional": true + }, + "@mapbox/node-pre-gyp": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", + "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", + "requires": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "dependencies": { + "node-fetch": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } + }, + "@mfd/rbxdatastoreservice": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/@mfd/rbxdatastoreservice/-/rbxdatastoreservice-2.3.11.tgz", + "integrity": "sha512-sZkBwBolSwHT2RDz4//7K0Vkxdjo2Zg1RSdSaUasTUKWj+BMeANgyLv/baMFHcJFE/Z+3kCcCkU/VHqfiQAHgA==", + "requires": { + "axios": "^0.27.2", + "crypto-js": "^4.0.0" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@redis/bloom": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", + "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==", + "requires": {} + }, + "@redis/client": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.6.tgz", + "integrity": "sha512-dFD1S6je+A47Lj22jN/upVU2fj4huR7S9APd7/ziUXsIXDL+11GPYti4Suv5y8FuXaN+0ZG4JF+y1houEJ7ToA==", + "requires": { + "cluster-key-slot": "1.1.2", + "generic-pool": "3.9.0", + "yallist": "4.0.0" + } + }, + "@redis/graph": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz", + "integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==", + "requires": {} + }, + "@redis/json": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz", + "integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==", + "requires": {} + }, + "@redis/search": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.2.tgz", + "integrity": "sha512-/cMfstG/fOh/SsE+4/BQGeuH/JJloeWuH+qJzM8dbxuWvdWibWAOAHHCZTMPhV3xIlH4/cUEIA8OV5QnYpaVoA==", + "requires": {} + }, + "@redis/time-series": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz", + "integrity": "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==", + "requires": {} + }, + "@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": "*" + } + }, + "@yaireo/relative-time": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@yaireo/relative-time/-/relative-time-1.0.3.tgz", + "integrity": "sha512-CJGxyWjb4SnkqubyfiPNQeg0YrJKnVu+11DOP65ltXFxDsjjnm3IByXS9O1Ny9AU9Oxqg0a7Gt26tzXtcijicg==" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "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": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" + }, + "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==", + "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==", + "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==" + } + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "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==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" + }, + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "autoprefixer": { + "version": "10.4.13", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", + "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "peer": true, + "requires": { + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001426", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "requires": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base32.js": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/base32.js/-/base32.js-0.0.1.tgz", + "integrity": "sha512-EGHIRiegFa62/SsA1J+Xs2tIzludPdzM064N9wjbiEgHnGnJ1V0WEpA4pEwCYT5nDvZk3ubf0shqaCS7k6xeUQ==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bcrypt": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.0.tgz", + "integrity": "sha512-RHBS7HI5N5tEnGTmtR/pppX0mmDSBpQ4aCBsj7CEQfYXDcO74A8sIBYcJMuCsis2E81zDxeENYhv66oZwLiA+Q==", + "requires": { + "@mapbox/node-pre-gyp": "^1.0.10", + "node-addon-api": "^5.0.0" + } + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "bintrees": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz", + "integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==" + }, + "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 + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "peer": true, + "requires": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + } + }, + "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" + } + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "requires": { + "streamsearch": "^1.1.0" + } + }, + "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" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" + }, + "caniuse-lite": { + "version": "1.0.30001441", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz", + "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==", + "peer": true + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "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" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==" + }, + "color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "requires": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "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==" + }, + "color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "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==" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "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.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + }, + "cookie-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", + "requires": { + "cookie": "0.4.1", + "cookie-signature": "1.0.6" + } + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "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==" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.1" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + }, + "css-selector-tokenizer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz", + "integrity": "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==", + "requires": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2" + } + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, + "cssfilter": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", + "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==" + }, + "daisyui": { + "version": "2.46.1", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-2.46.1.tgz", + "integrity": "sha512-i59+nLuzzPAVOhNhot3KLtt6stfYeCIPXs9uiLcpXjykpqxHfBA3W6hQWOUWPMwfqhyQd0WKub3sydtPGjzLtA==", + "requires": { + "color": "^4.2", + "css-selector-tokenizer": "^0.8.0", + "postcss-js": "^4.0.0", + "tailwindcss": "^3" + } + }, + "data-uri-to-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", + "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==" + }, + "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" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" + }, + "defined": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "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==" + }, + "detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" + }, + "detective": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", + "requires": { + "acorn-node": "^1.8.2", + "defined": "^1.0.0", + "minimist": "^1.2.6" + } + }, + "didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "dijkstrajs": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.2.tgz", + "integrity": "sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg==" + }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" + }, + "easy-soap-request": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/easy-soap-request/-/easy-soap-request-4.8.0.tgz", + "integrity": "sha512-fD1NXRv14P4IdAoyYpGJ2kB+292vYfvU7qLbmUw2x2HA+U74LWVyErjyNf2Jxn1mUAwp+sRdMlkmrUrPY0/wAg==", + "requires": { + "axios": "^0.27.2" + } + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "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==" + }, + "electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "peer": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "encode-utf8": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", + "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "esbuild": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.4.tgz", + "integrity": "sha512-zBn9MeCwT7W5F1a3lXClD61ip6vQM+H8Msb0w8zMT4ZKBpDg+rFAraNyWCDelB/2L6M3g6AXHPnsyvjMFnxtFw==", + "requires": { + "@esbuild/android-arm": "0.17.4", + "@esbuild/android-arm64": "0.17.4", + "@esbuild/android-x64": "0.17.4", + "@esbuild/darwin-arm64": "0.17.4", + "@esbuild/darwin-x64": "0.17.4", + "@esbuild/freebsd-arm64": "0.17.4", + "@esbuild/freebsd-x64": "0.17.4", + "@esbuild/linux-arm": "0.17.4", + "@esbuild/linux-arm64": "0.17.4", + "@esbuild/linux-ia32": "0.17.4", + "@esbuild/linux-loong64": "0.17.4", + "@esbuild/linux-mips64el": "0.17.4", + "@esbuild/linux-ppc64": "0.17.4", + "@esbuild/linux-riscv64": "0.17.4", + "@esbuild/linux-s390x": "0.17.4", + "@esbuild/linux-x64": "0.17.4", + "@esbuild/netbsd-x64": "0.17.4", + "@esbuild/openbsd-x64": "0.17.4", + "@esbuild/sunos-x64": "0.17.4", + "@esbuild/win32-arm64": "0.17.4", + "@esbuild/win32-ia32": "0.17.4", + "@esbuild/win32-x64": "0.17.4" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "peer": true + }, + "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==" + }, + "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" + }, + "dependencies": { + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + } + } + }, + "express-flash-message": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/express-flash-message/-/express-flash-message-2.1.0.tgz", + "integrity": "sha512-oR/cwzt7CfjSUt7XwEZCCyOegylHuTF8/by6+jAshZh2TzREqDIjfU0JU5M6usurSk/ep3lUxxyaCbujyERyTQ==" + }, + "express-prom-bundle": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/express-prom-bundle/-/express-prom-bundle-6.6.0.tgz", + "integrity": "sha512-tZh2P2p5a8/yxQ5VbRav011Poa4R0mHqdFwn9Swe/obXDe5F0jY9wtRAfNYnqk4LXY7akyvR/nrvAHxQPWUjsQ==", + "requires": { + "on-finished": "^2.3.0", + "url-value-parser": "^2.0.0" + } + }, + "express-rate-limit": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.7.0.tgz", + "integrity": "sha512-vhwIdRoqcYB/72TK3tRZI+0ttS8Ytrk24GfmsxDXK9o9IhHNO5bXRiXQSExPQ4GbaE5tvIS7j1SGrxsuWs+sGA==", + "requires": {} + }, + "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-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "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" + } + }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "requires": { + "reusify": "^1.0.4" + } + }, + "fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "requires": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + } + }, + "file-type-checker": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/file-type-checker/-/file-type-checker-1.0.4.tgz", + "integrity": "sha512-hhleilG34kfSjlSfAAj8DVvqXxMwEIVY/pkWnkMVbqdmly6jUv7jjNw/dmvdcbMt6joXlQgavCJCtNDRzODOsQ==" + }, + "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==", + "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" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "requires": { + "fetch-blob": "^3.1.2" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "peer": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "fs-memo": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fs-memo/-/fs-memo-1.2.0.tgz", + "integrity": "sha512-YEexkCpL4j03jn5SxaMHqcO6IuWuqm8JFUYhyCep7Ao89JIYmB8xoKhK7zXXJ9cCaNXpyNH5L3QtAmoxjoHW2w==" + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + } + }, + "generic-pool": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", + "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==" + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-6.1.2.tgz", + "integrity": "sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==" + }, + "get-port-please": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-2.6.1.tgz", + "integrity": "sha512-4PDSrL6+cuMM1xs6w36ZIkaKzzE0xzfVBCfebHIJ3FE8iB9oic/ECwPw3iNiD4h1AoJ5XLLBhEviFAVrZsDC5A==", + "requires": { + "fs-memo": "^1.2.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "helmet": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-5.1.1.tgz", + "integrity": "sha512-/yX0oVZBggA9cLJh8aw3PPCfedBnbd7J2aowjzsaWwZh7/UFY0nccn/aHAggIgWUFfnykX8GKd3a1pSbrmlcVQ==" + }, + "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" + } + }, + "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==", + "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==", + "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==" + } + } + }, + "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 + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "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-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "jsonpath-plus": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz", + "integrity": "sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==" + }, + "jsonwebtoken": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", + "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", + "requires": { + "jws": "^3.2.2", + "lodash": "^4.17.21", + "ms": "^2.1.1", + "semver": "^7.3.8" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "just-clone": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/just-clone/-/just-clone-6.2.0.tgz", + "integrity": "sha512-1IynUYEc/HAwxhi3WDpIpxJbZpMCvvrrmZVqvj9EhpvbH8lls7HhdhiByjL7DkAaWlLIzpC0Xc/VPvy/UxLNjA==" + }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "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==" + }, + "lilconfig": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==" + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==" + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "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==" + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "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" + } + }, + "minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" + }, + "minipass": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz", + "integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "requires": { + "minimist": "^1.2.6" + } + }, + "mongo-sanitize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mongo-sanitize/-/mongo-sanitize-1.1.0.tgz", + "integrity": "sha512-6gB9AiJD+om2eZLxaPKIP5Q8P3Fr+s+17rVWso7hU0+MAzmIvIMlgTYuyvalDLTtE/p0gczcvJ8A3pbN1XmQ/A==" + }, + "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" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "mongoose-unique-validator": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mongoose-unique-validator/-/mongoose-unique-validator-3.1.0.tgz", + "integrity": "sha512-UsBBlFapip8gc8x1h+nLWnkOy+GTy9Z+zmTyZ35icLV3EoLIVz180vJzepfMM9yBy2AJh+maeuoM8CWtqejGUg==", + "requires": { + "lodash.foreach": "^4.1.0", + "lodash.get": "^4.0.2", + "lodash.merge": "^4.6.2" + } + }, + "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.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "multer": { + "version": "1.4.5-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", + "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", + "requires": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + } + }, + "nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "node-addon-api": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz", + "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==" + }, + "node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==" + }, + "node-fetch": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.0.tgz", + "integrity": "sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==", + "requires": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + } + }, + "node-releases": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", + "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", + "peer": 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": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "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==" + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "peer": true + }, + "npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "requires": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "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==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "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==" + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" + }, + "png-validator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/png-validator/-/png-validator-1.1.0.tgz", + "integrity": "sha512-MlRLyPI1p3/dJbsjVH+4xOPucycrz8T3EvO0BzCXaNtrUhZkZROtzib9J6mnC81AJO8eBIwiDZwTFel2cMmSuQ==" + }, + "pngjs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", + "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==" + }, + "postcss": { + "version": "8.4.20", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.20.tgz", + "integrity": "sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==", + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-js": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", + "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", + "requires": { + "camelcase-css": "^2.0.1" + } + }, + "postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "requires": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + } + }, + "postcss-nested": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", + "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "prom-client": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-14.1.1.tgz", + "integrity": "sha512-hFU32q7UZQ59bVJQGUtm3I2PrJ3gWvoCkilX9sF165ks1qflhugVCeK+S1JjJYHvyt3o5kj68+q3bchormjnzw==", + "requires": { + "tdigest": "^0.1.1" + } + }, + "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" + } + }, + "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==" + }, + "qrcode": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.1.tgz", + "integrity": "sha512-nS8NJ1Z3md8uTjKtP+SGGhfqmTCs5flU/xR623oI0JX+Wepz9R8UrRVCTBTJm3qGw3rH6jJ6MUHjkDx15cxSSg==", + "requires": { + "dijkstrajs": "^1.0.1", + "encode-utf8": "^1.0.3", + "pngjs": "^5.0.0", + "yargs": "^15.3.1" + } + }, + "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" + } + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" + }, + "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" + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "requires": { + "pify": "^2.3.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "redis": { + "version": "4.6.5", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.5.tgz", + "integrity": "sha512-O0OWA36gDQbswOdUuAhRL6mTZpHFN525HlgZgDaVNgCJIAZR3ya06NTESb0R+TUZ+BFaDpz6NnnVvoMx9meUFg==", + "requires": { + "@redis/bloom": "1.2.0", + "@redis/client": "1.5.6", + "@redis/graph": "1.1.0", + "@redis/json": "1.0.4", + "@redis/search": "1.1.2", + "@redis/time-series": "1.0.4" + } + }, + "redis-om": { + "version": "0.4.0-beta.3", + "resolved": "https://registry.npmjs.org/redis-om/-/redis-om-0.4.0-beta.3.tgz", + "integrity": "sha512-zGWBMGoe3exrvkbFjWqAFG8UJL3tdby5UkfPKiZLvA67d7FsR0ScEpsBaaWGL33y5EQUWnYL+pI8jzZaQ6brtA==", + "requires": { + "jsonpath-plus": "^7.2.0", + "just-clone": "^6.1.1", + "redis": "^4.6.4", + "ulid": "^2.3.0" + } + }, + "req-flash": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/req-flash/-/req-flash-0.0.3.tgz", + "integrity": "sha512-c5ouPRJ6OVc4ecL5cgdwd51nYOFQiOTfl7UWk+VlgUHgfsh7TMRFPN/OJ5ETnOYFyswprT8C2a6ctMvJgms9ng==" + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "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" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.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" + } + } + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "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" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "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" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "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" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "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==" + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "requires": { + "is-arrayish": "^0.3.1" + } + }, + "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" + } + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + }, + "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" + } + }, + "speakeasy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/speakeasy/-/speakeasy-2.0.0.tgz", + "integrity": "sha512-lW2A2s5LKi8rwu77ewisuUOtlCydF/hmQSOJjpTqTj1gZLkNgTaYnyvfxy2WBr4T/h+9c4g8HIITfj83OkFQFw==", + "requires": { + "base32.js": "0.0.1" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "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": "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" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "tailwindcss": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz", + "integrity": "sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==", + "requires": { + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "color-name": "^1.1.4", + "detective": "^5.2.1", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "lilconfig": "^2.0.6", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.18", + "postcss-import": "^14.1.0", + "postcss-js": "^4.0.0", + "postcss-load-config": "^3.1.4", + "postcss-nested": "6.0.0", + "postcss-selector-parser": "^6.0.10", + "postcss-value-parser": "^4.2.0", + "quick-lru": "^5.1.1", + "resolve": "^1.22.1" + }, + "dependencies": { + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "requires": { + "is-glob": "^4.0.3" + } + } + } + }, + "tar": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^4.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, + "tdigest": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz", + "integrity": "sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==", + "requires": { + "bintrees": "1.0.2" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "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-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" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "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" + } + }, + "ulid": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ulid/-/ulid-2.3.0.tgz", + "integrity": "sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw==" + }, + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "peer": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "url-value-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/url-value-parser/-/url-value-parser-2.2.0.tgz", + "integrity": "sha512-yIQdxJpgkPamPPAPuGdS7Q548rLhny42tg8d4vyTNzFqvOnwqrgHXvgehT09U7fwrzxi3RxCiXjoNUNnNOlQ8A==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "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==" + }, + "web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==" + }, + "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" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "requires": { + "sax": "^1.2.4" + } + }, + "xss": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.14.tgz", + "integrity": "sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw==", + "requires": { + "commander": "^2.20.3", + "cssfilter": "0.0.10" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } } diff --git a/Back/package.json b/Back/package.json index d47414c..c5838c5 100644 --- a/Back/package.json +++ b/Back/package.json @@ -1,56 +1,57 @@ { - "name": "datastoreservice", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "devStart": "cross-env PROTOCOL_HEADER=x-forwarded-proto HOST_HEADER=x-forwarded-host nodemon server.mjs", - "prod": "PROTOCOL_HEADER=x-forwarded-proto HOST_HEADER=x-forwarded-host pm2 start server.mjs", - "prodreload": "PROTOCOL_HEADER=x-forwarded-proto HOST_HEADER=x-forwarded-host pm2 reload server.mjs" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "@mfd/rbxdatastoreservice": "^2.3.10", - "@yaireo/relative-time": "^1.0.3", - "atob": "^2.1.2", - "bcrypt": "^5.0.1", - "body-parser": "^1.20.0", - "connect-flash": "^0.1.1", - "cookie-parser": "^1.4.6", - "cors": "^2.8.5", - "daisyui": "^2.24.2", - "dotenv": "^16.0.1", - "easy-soap-request": "^4.8.0", - "esbuild": "0.17.4", - "express": "^4.18.1", - "express-flash-message": "^2.1.0", - "express-prom-bundle": "^6.5.0", - "express-rate-limit": "^6.7.0", - "express-session": "^1.17.3", - "file-type-checker": "^1.0.4", - "get-port": "^6.1.2", - "get-port-please": "^2.6.1", - "helmet": "^5.1.1", - "jsonwebtoken": "^9.0.0", - "mongo-sanitize": "^1.1.0", - "mongoose": "^6.5.2", - "mongoose-unique-validator": "^3.1.0", - "multer": "^1.4.5-lts.1", - "node-fetch": "^3.2.10", - "png-validator": "^1.1.0", - "prom-client": "^14.1.0", - "qrcode": "^1.5.1", - "redis": "^4.6.5", - "redis-om": "^0.4.0-beta.3", - "req-flash": "^0.0.3", - "speakeasy": "^2.0.0", - "xml-js": "^1.6.11", - "xss": "^1.0.13" - }, - "devDependencies": { - "cross-env": "^7.0.3", - "nodemon": "^2.0.19" - } + "name": "datastoreservice", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "devStart": "cross-env PROTOCOL_HEADER=x-forwarded-proto HOST_HEADER=x-forwarded-host nodemon server.mjs", + "prod": "PROTOCOL_HEADER=x-forwarded-proto HOST_HEADER=x-forwarded-host pm2 start server.mjs", + "prodreload": "PROTOCOL_HEADER=x-forwarded-proto HOST_HEADER=x-forwarded-host pm2 reload server.mjs" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@mfd/rbxdatastoreservice": "^2.3.10", + "@yaireo/relative-time": "^1.0.3", + "atob": "^2.1.2", + "bcrypt": "^5.0.1", + "body-parser": "^1.20.0", + "connect-flash": "^0.1.1", + "cookie-parser": "^1.4.6", + "cors": "^2.8.5", + "daisyui": "^2.24.2", + "dotenv": "^16.0.1", + "easy-soap-request": "^4.8.0", + "esbuild": "0.17.4", + "express": "^4.18.1", + "express-flash-message": "^2.1.0", + "express-prom-bundle": "^6.5.0", + "express-rate-limit": "^6.7.0", + "express-session": "^1.17.3", + "file-type-checker": "^1.0.4", + "get-port": "^6.1.2", + "get-port-please": "^2.6.1", + "helmet": "^5.1.1", + "jsonwebtoken": "^9.0.0", + "mongo-sanitize": "^1.1.0", + "mongoose": "^6.5.2", + "mongoose-unique-validator": "^3.1.0", + "multer": "^1.4.5-lts.1", + "node-fetch": "^3.2.10", + "png-validator": "^1.1.0", + "prom-client": "^14.1.0", + "qrcode": "^1.5.1", + "redis": "^4.6.5", + "redis-om": "^0.4.0-beta.3", + "req-flash": "^0.0.3", + "speakeasy": "^2.0.0", + "xml-js": "^1.6.11", + "xss": "^1.0.13" + }, + "devDependencies": { + "cross-env": "^7.0.3", + "nodemon": "^2.0.19", + "prettier": "^3.0.3" + } } diff --git a/Back/pnpm-lock.yaml b/Back/pnpm-lock.yaml new file mode 100644 index 0000000..77633ee --- /dev/null +++ b/Back/pnpm-lock.yaml @@ -0,0 +1,5145 @@ +lockfileVersion: "6.0" + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + "@mfd/rbxdatastoreservice": + specifier: ^2.3.10 + version: 2.3.11 + "@yaireo/relative-time": + specifier: ^1.0.3 + version: 1.0.4 + atob: + specifier: ^2.1.2 + version: 2.1.2 + bcrypt: + specifier: ^5.0.1 + version: 5.1.1 + body-parser: + specifier: ^1.20.0 + version: 1.20.2 + connect-flash: + specifier: ^0.1.1 + version: 0.1.1 + cookie-parser: + specifier: ^1.4.6 + version: 1.4.6 + cors: + specifier: ^2.8.5 + version: 2.8.5 + daisyui: + specifier: ^2.24.2 + version: 2.52.0(autoprefixer@10.4.15)(postcss@8.4.29) + dotenv: + specifier: ^16.0.1 + version: 16.3.1 + easy-soap-request: + specifier: ^4.8.0 + version: 4.8.0 + esbuild: + specifier: 0.17.4 + version: 0.17.4 + express: + specifier: ^4.18.1 + version: 4.18.2 + express-flash-message: + specifier: ^2.1.0 + version: 2.1.0 + express-prom-bundle: + specifier: ^6.5.0 + version: 6.6.0(prom-client@14.2.0) + express-rate-limit: + specifier: ^6.7.0 + version: 6.11.0(express@4.18.2) + express-session: + specifier: ^1.17.3 + version: 1.17.3 + file-type-checker: + specifier: ^1.0.4 + version: 1.0.8 + get-port: + specifier: ^6.1.2 + version: 6.1.2 + get-port-please: + specifier: ^2.6.1 + version: 2.6.1 + helmet: + specifier: ^5.1.1 + version: 5.1.1 + jsonwebtoken: + specifier: ^9.0.0 + version: 9.0.2 + mongo-sanitize: + specifier: ^1.1.0 + version: 1.1.0 + mongoose: + specifier: ^6.5.2 + version: 6.12.0 + mongoose-unique-validator: + specifier: ^3.1.0 + version: 3.1.0(mongoose@6.12.0) + multer: + specifier: ^1.4.5-lts.1 + version: 1.4.5-lts.1 + node-fetch: + specifier: ^3.2.10 + version: 3.3.2 + png-validator: + specifier: ^1.1.0 + version: 1.1.0 + prom-client: + specifier: ^14.1.0 + version: 14.2.0 + qrcode: + specifier: ^1.5.1 + version: 1.5.3 + redis: + specifier: ^4.6.5 + version: 4.6.8 + redis-om: + specifier: ^0.4.0-beta.3 + version: 0.4.2 + req-flash: + specifier: ^0.0.3 + version: 0.0.3 + speakeasy: + specifier: ^2.0.0 + version: 2.0.0 + xml-js: + specifier: ^1.6.11 + version: 1.6.11 + xss: + specifier: ^1.0.13 + version: 1.0.14 + +devDependencies: + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + nodemon: + specifier: ^2.0.19 + version: 2.0.22 + prettier: + specifier: ^3.0.3 + version: 3.0.3 + +packages: + /@alloc/quick-lru@5.2.0: + resolution: + { + integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==, + } + engines: { node: ">=10" } + dev: false + + /@aws-crypto/crc32@3.0.0: + resolution: + { + integrity: sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==, + } + requiresBuild: true + dependencies: + "@aws-crypto/util": 3.0.0 + "@aws-sdk/types": 3.408.0 + tslib: 1.14.1 + dev: false + optional: true + + /@aws-crypto/ie11-detection@3.0.0: + resolution: + { + integrity: sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==, + } + requiresBuild: true + dependencies: + tslib: 1.14.1 + dev: false + optional: true + + /@aws-crypto/sha256-browser@3.0.0: + resolution: + { + integrity: sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==, + } + requiresBuild: 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.408.0 + "@aws-sdk/util-locate-window": 3.310.0 + "@aws-sdk/util-utf8-browser": 3.259.0 + tslib: 1.14.1 + dev: false + optional: true + + /@aws-crypto/sha256-js@3.0.0: + resolution: + { + integrity: sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==, + } + requiresBuild: true + dependencies: + "@aws-crypto/util": 3.0.0 + "@aws-sdk/types": 3.408.0 + tslib: 1.14.1 + dev: false + optional: true + + /@aws-crypto/supports-web-crypto@3.0.0: + resolution: + { + integrity: sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==, + } + requiresBuild: true + dependencies: + tslib: 1.14.1 + dev: false + optional: true + + /@aws-crypto/util@3.0.0: + resolution: + { + integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==, + } + requiresBuild: true + dependencies: + "@aws-sdk/types": 3.408.0 + "@aws-sdk/util-utf8-browser": 3.259.0 + tslib: 1.14.1 + dev: false + optional: true + + /@aws-sdk/client-cognito-identity@3.409.0: + resolution: + { + integrity: sha512-vUThhqsTL39s4Gbtldher8EuaahWkVh9M5BrfIlIoDnO2dTA/NXbAA3tP7Zj+mw1PAjLZdEqtNmIeZFVGs+0nw==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/client-sts": 3.409.0 + "@aws-sdk/credential-provider-node": 3.409.0 + "@aws-sdk/middleware-host-header": 3.408.0 + "@aws-sdk/middleware-logger": 3.408.0 + "@aws-sdk/middleware-recursion-detection": 3.408.0 + "@aws-sdk/middleware-signing": 3.408.0 + "@aws-sdk/middleware-user-agent": 3.408.0 + "@aws-sdk/types": 3.408.0 + "@aws-sdk/util-endpoints": 3.408.0 + "@aws-sdk/util-user-agent-browser": 3.408.0 + "@aws-sdk/util-user-agent-node": 3.408.0 + "@smithy/config-resolver": 2.0.7 + "@smithy/fetch-http-handler": 2.1.2 + "@smithy/hash-node": 2.0.6 + "@smithy/invalid-dependency": 2.0.6 + "@smithy/middleware-content-length": 2.0.8 + "@smithy/middleware-endpoint": 2.0.6 + "@smithy/middleware-retry": 2.0.9 + "@smithy/middleware-serde": 2.0.6 + "@smithy/middleware-stack": 2.0.0 + "@smithy/node-config-provider": 2.0.9 + "@smithy/node-http-handler": 2.1.2 + "@smithy/protocol-http": 2.0.5 + "@smithy/smithy-client": 2.1.3 + "@smithy/types": 2.3.0 + "@smithy/url-parser": 2.0.6 + "@smithy/util-base64": 2.0.0 + "@smithy/util-body-length-browser": 2.0.0 + "@smithy/util-body-length-node": 2.1.0 + "@smithy/util-defaults-mode-browser": 2.0.7 + "@smithy/util-defaults-mode-node": 2.0.9 + "@smithy/util-retry": 2.0.0 + "@smithy/util-utf8": 2.0.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + optional: true + + /@aws-sdk/client-sso@3.409.0: + resolution: + { + integrity: sha512-vlXcIzcmUhObuEJ6q3lsp1ZHeDeD9bUrG3dmdSTeII4U6A9imgvaXONWI9GFEUsgzCrrCxtCqBX2RqMfZDhylw==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/middleware-host-header": 3.408.0 + "@aws-sdk/middleware-logger": 3.408.0 + "@aws-sdk/middleware-recursion-detection": 3.408.0 + "@aws-sdk/middleware-user-agent": 3.408.0 + "@aws-sdk/types": 3.408.0 + "@aws-sdk/util-endpoints": 3.408.0 + "@aws-sdk/util-user-agent-browser": 3.408.0 + "@aws-sdk/util-user-agent-node": 3.408.0 + "@smithy/config-resolver": 2.0.7 + "@smithy/fetch-http-handler": 2.1.2 + "@smithy/hash-node": 2.0.6 + "@smithy/invalid-dependency": 2.0.6 + "@smithy/middleware-content-length": 2.0.8 + "@smithy/middleware-endpoint": 2.0.6 + "@smithy/middleware-retry": 2.0.9 + "@smithy/middleware-serde": 2.0.6 + "@smithy/middleware-stack": 2.0.0 + "@smithy/node-config-provider": 2.0.9 + "@smithy/node-http-handler": 2.1.2 + "@smithy/protocol-http": 2.0.5 + "@smithy/smithy-client": 2.1.3 + "@smithy/types": 2.3.0 + "@smithy/url-parser": 2.0.6 + "@smithy/util-base64": 2.0.0 + "@smithy/util-body-length-browser": 2.0.0 + "@smithy/util-body-length-node": 2.1.0 + "@smithy/util-defaults-mode-browser": 2.0.7 + "@smithy/util-defaults-mode-node": 2.0.9 + "@smithy/util-retry": 2.0.0 + "@smithy/util-utf8": 2.0.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + optional: true + + /@aws-sdk/client-sts@3.409.0: + resolution: + { + integrity: sha512-yNL9zYWDVIOWZhIlsy2tiHetSYvio5ZVJ3nvR4xWPTwqOQveZx/K0PTK+nh6T6w5R3w5IOSKvd+vPCpY4bGx8Q==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/credential-provider-node": 3.409.0 + "@aws-sdk/middleware-host-header": 3.408.0 + "@aws-sdk/middleware-logger": 3.408.0 + "@aws-sdk/middleware-recursion-detection": 3.408.0 + "@aws-sdk/middleware-sdk-sts": 3.408.0 + "@aws-sdk/middleware-signing": 3.408.0 + "@aws-sdk/middleware-user-agent": 3.408.0 + "@aws-sdk/types": 3.408.0 + "@aws-sdk/util-endpoints": 3.408.0 + "@aws-sdk/util-user-agent-browser": 3.408.0 + "@aws-sdk/util-user-agent-node": 3.408.0 + "@smithy/config-resolver": 2.0.7 + "@smithy/fetch-http-handler": 2.1.2 + "@smithy/hash-node": 2.0.6 + "@smithy/invalid-dependency": 2.0.6 + "@smithy/middleware-content-length": 2.0.8 + "@smithy/middleware-endpoint": 2.0.6 + "@smithy/middleware-retry": 2.0.9 + "@smithy/middleware-serde": 2.0.6 + "@smithy/middleware-stack": 2.0.0 + "@smithy/node-config-provider": 2.0.9 + "@smithy/node-http-handler": 2.1.2 + "@smithy/protocol-http": 2.0.5 + "@smithy/smithy-client": 2.1.3 + "@smithy/types": 2.3.0 + "@smithy/url-parser": 2.0.6 + "@smithy/util-base64": 2.0.0 + "@smithy/util-body-length-browser": 2.0.0 + "@smithy/util-body-length-node": 2.1.0 + "@smithy/util-defaults-mode-browser": 2.0.7 + "@smithy/util-defaults-mode-node": 2.0.9 + "@smithy/util-retry": 2.0.0 + "@smithy/util-utf8": 2.0.0 + fast-xml-parser: 4.2.5 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + optional: true + + /@aws-sdk/credential-provider-cognito-identity@3.409.0: + resolution: + { + integrity: sha512-8MLPJ8YjX+iAhsyeUah6388EHm0aeLPyn+bz5M/PwyDkX8UuuaM3VzH0dHoMdqX+iOCIynh/WRm+qYizrAscCA==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@aws-sdk/client-cognito-identity": 3.409.0 + "@aws-sdk/types": 3.408.0 + "@smithy/property-provider": 2.0.7 + "@smithy/types": 2.3.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + optional: true + + /@aws-sdk/credential-provider-env@3.408.0: + resolution: + { + integrity: sha512-GCpgHEHxRTzKaMkwDC2gLb3xlD+ZxhKPUJ1DVcO7I9E3eCGJsYVedIi0/2XE+NP+HVoy8LyW2qH8QQWh64JKow==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@aws-sdk/types": 3.408.0 + "@smithy/property-provider": 2.0.7 + "@smithy/types": 2.3.0 + tslib: 2.6.2 + dev: false + optional: true + + /@aws-sdk/credential-provider-ini@3.409.0: + resolution: + { + integrity: sha512-Z7hb0Kj0FuqD5HimDrtt0LRjKBHA5pvLcTYYdVorJovaBxEvfDpISSDVRIUmvhMGAlv7XezbvqESOU5cn0Gpzw==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@aws-sdk/credential-provider-env": 3.408.0 + "@aws-sdk/credential-provider-process": 3.408.0 + "@aws-sdk/credential-provider-sso": 3.409.0 + "@aws-sdk/credential-provider-web-identity": 3.408.0 + "@aws-sdk/types": 3.408.0 + "@smithy/credential-provider-imds": 2.0.9 + "@smithy/property-provider": 2.0.7 + "@smithy/shared-ini-file-loader": 2.0.8 + "@smithy/types": 2.3.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + optional: true + + /@aws-sdk/credential-provider-node@3.409.0: + resolution: + { + integrity: sha512-kXmfBVYnHoEAACo6zskEryDSgMSo1QYiv6P8n6Go/RsJHe4Ec+YtrOMLg3hTOptiIGHOTWZ1ANaU/IfIxmqumA==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@aws-sdk/credential-provider-env": 3.408.0 + "@aws-sdk/credential-provider-ini": 3.409.0 + "@aws-sdk/credential-provider-process": 3.408.0 + "@aws-sdk/credential-provider-sso": 3.409.0 + "@aws-sdk/credential-provider-web-identity": 3.408.0 + "@aws-sdk/types": 3.408.0 + "@smithy/credential-provider-imds": 2.0.9 + "@smithy/property-provider": 2.0.7 + "@smithy/shared-ini-file-loader": 2.0.8 + "@smithy/types": 2.3.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + optional: true + + /@aws-sdk/credential-provider-process@3.408.0: + resolution: + { + integrity: sha512-qCTf9tr6+I2s3+v5zP4YRQQrGlYw/jyZ7u/k6bGshhlvgwGPfjNuHrM8uK/W1kv4ng1myxaL1/tAY6RVVdXz4Q==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@aws-sdk/types": 3.408.0 + "@smithy/property-provider": 2.0.7 + "@smithy/shared-ini-file-loader": 2.0.8 + "@smithy/types": 2.3.0 + tslib: 2.6.2 + dev: false + optional: true + + /@aws-sdk/credential-provider-sso@3.409.0: + resolution: + { + integrity: sha512-Bh0ykbDpnUK4W8sQMEpRA/TlZxwpPLl4aU8eBLlbEcTL2M8or2nr0dQzOOvabZo8hbaPM6yfOl+vLTvWGs75zg==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@aws-sdk/client-sso": 3.409.0 + "@aws-sdk/token-providers": 3.408.0 + "@aws-sdk/types": 3.408.0 + "@smithy/property-provider": 2.0.7 + "@smithy/shared-ini-file-loader": 2.0.8 + "@smithy/types": 2.3.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + optional: true + + /@aws-sdk/credential-provider-web-identity@3.408.0: + resolution: + { + integrity: sha512-5FbDPF/zY/1t6k1zRI/HnrxcH2v7SwsEYu2SThI2qbzaP/K7MTnTanV5vNFcdQOpuQ7x3PrzTlH3AWZueCr3Vw==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@aws-sdk/types": 3.408.0 + "@smithy/property-provider": 2.0.7 + "@smithy/types": 2.3.0 + tslib: 2.6.2 + dev: false + optional: true + + /@aws-sdk/credential-providers@3.409.0: + resolution: + { + integrity: sha512-eaQChfbLnVs1ctC04dIdQPh5FtJD9v8R3xbVttKowdhUUV18rTHM5sVJuL5DGbHTXxmZSiURsoVCujrc/kaEiA==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@aws-sdk/client-cognito-identity": 3.409.0 + "@aws-sdk/client-sso": 3.409.0 + "@aws-sdk/client-sts": 3.409.0 + "@aws-sdk/credential-provider-cognito-identity": 3.409.0 + "@aws-sdk/credential-provider-env": 3.408.0 + "@aws-sdk/credential-provider-ini": 3.409.0 + "@aws-sdk/credential-provider-node": 3.409.0 + "@aws-sdk/credential-provider-process": 3.408.0 + "@aws-sdk/credential-provider-sso": 3.409.0 + "@aws-sdk/credential-provider-web-identity": 3.408.0 + "@aws-sdk/types": 3.408.0 + "@smithy/credential-provider-imds": 2.0.9 + "@smithy/property-provider": 2.0.7 + "@smithy/types": 2.3.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + optional: true + + /@aws-sdk/middleware-host-header@3.408.0: + resolution: + { + integrity: sha512-eofCXuSZ+ntbLzeCRdHzraXzgWqAplXU7W2qFFVC4O9lZBhADwNPI8n8x98TH0mftnmvZxh5Bo5U8WvEolIDkw==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@aws-sdk/types": 3.408.0 + "@smithy/protocol-http": 2.0.5 + "@smithy/types": 2.3.0 + tslib: 2.6.2 + dev: false + optional: true + + /@aws-sdk/middleware-logger@3.408.0: + resolution: + { + integrity: sha512-otwXPCubsGRFv8Hb6nKw6Vvnu4dC8CcPk05buStj42nF8QdjWrKGb2rDCvLph5lr576LF5HN+Y2moyOi7z/I7g==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@aws-sdk/types": 3.408.0 + "@smithy/types": 2.3.0 + tslib: 2.6.2 + dev: false + optional: true + + /@aws-sdk/middleware-recursion-detection@3.408.0: + resolution: + { + integrity: sha512-QfZwmX5z0IRC2c8pBi9VozSqbJw19V5oxyykSTqdjGe3CG3yNujXObV6xQesK67CWSnPb9wDgVGKUoYuIXwOxw==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@aws-sdk/types": 3.408.0 + "@smithy/protocol-http": 2.0.5 + "@smithy/types": 2.3.0 + tslib: 2.6.2 + dev: false + optional: true + + /@aws-sdk/middleware-sdk-sts@3.408.0: + resolution: + { + integrity: sha512-dIO9BTX049P2PwaeAK2lxJeA2rZi9/bWzMP1GIE60VrMDHmN5Ljvh1lLActECLAqNQIqN5Ub0bKV2tC/jMn+CA==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@aws-sdk/middleware-signing": 3.408.0 + "@aws-sdk/types": 3.408.0 + "@smithy/types": 2.3.0 + tslib: 2.6.2 + dev: false + optional: true + + /@aws-sdk/middleware-signing@3.408.0: + resolution: + { + integrity: sha512-flLiLKATJ4NLcLb7lPojyQ6NvLSyQ3axqIClqwMRnhSRxvREB7OgBKwmPecSl0I5JxsNEqo+mjARdMjUHadgWQ==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@aws-sdk/types": 3.408.0 + "@smithy/property-provider": 2.0.7 + "@smithy/protocol-http": 2.0.5 + "@smithy/signature-v4": 2.0.6 + "@smithy/types": 2.3.0 + "@smithy/util-middleware": 2.0.0 + tslib: 2.6.2 + dev: false + optional: true + + /@aws-sdk/middleware-user-agent@3.408.0: + resolution: + { + integrity: sha512-UvlKri8/Mgf5W+tFU6ZJ65fC6HljcysIqfRFts/8Wurl322IS1I4j+pyjV2P6eK1054bzynfi3Trv+tRYHtVcA==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@aws-sdk/types": 3.408.0 + "@aws-sdk/util-endpoints": 3.408.0 + "@smithy/protocol-http": 2.0.5 + "@smithy/types": 2.3.0 + tslib: 2.6.2 + dev: false + optional: true + + /@aws-sdk/token-providers@3.408.0: + resolution: + { + integrity: sha512-D//BjUrVtDzDdCz1mRdZZSAc822fh75Ssq46smeS6S6NKq3vJeHhfrQJMyVU1GclXu1tn9AwykaQW5Jwb5im+g==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/middleware-host-header": 3.408.0 + "@aws-sdk/middleware-logger": 3.408.0 + "@aws-sdk/middleware-recursion-detection": 3.408.0 + "@aws-sdk/middleware-user-agent": 3.408.0 + "@aws-sdk/types": 3.408.0 + "@aws-sdk/util-endpoints": 3.408.0 + "@aws-sdk/util-user-agent-browser": 3.408.0 + "@aws-sdk/util-user-agent-node": 3.408.0 + "@smithy/config-resolver": 2.0.7 + "@smithy/fetch-http-handler": 2.1.2 + "@smithy/hash-node": 2.0.6 + "@smithy/invalid-dependency": 2.0.6 + "@smithy/middleware-content-length": 2.0.8 + "@smithy/middleware-endpoint": 2.0.6 + "@smithy/middleware-retry": 2.0.9 + "@smithy/middleware-serde": 2.0.6 + "@smithy/middleware-stack": 2.0.0 + "@smithy/node-config-provider": 2.0.9 + "@smithy/node-http-handler": 2.1.2 + "@smithy/property-provider": 2.0.7 + "@smithy/protocol-http": 2.0.5 + "@smithy/shared-ini-file-loader": 2.0.8 + "@smithy/smithy-client": 2.1.3 + "@smithy/types": 2.3.0 + "@smithy/url-parser": 2.0.6 + "@smithy/util-base64": 2.0.0 + "@smithy/util-body-length-browser": 2.0.0 + "@smithy/util-body-length-node": 2.1.0 + "@smithy/util-defaults-mode-browser": 2.0.7 + "@smithy/util-defaults-mode-node": 2.0.9 + "@smithy/util-retry": 2.0.0 + "@smithy/util-utf8": 2.0.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + optional: true + + /@aws-sdk/types@3.408.0: + resolution: + { + integrity: sha512-sIsR5224xWQTW7O6h4V0S7DMWs4bK4DCunwOo7Avpq7ZVmH2YyLTs0n4NGL186j8xTosycF1ACQgpM48SLIvaA==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@smithy/types": 2.3.0 + tslib: 2.6.2 + dev: false + optional: true + + /@aws-sdk/util-endpoints@3.408.0: + resolution: + { + integrity: sha512-N1D5cKEkCqf5Q7IF/pI9kfcNrT+/5ctZ6cQo4Ex6xaOcnUzdOZcXdPqaMRZVZRn8enjK2SpoLlRpXGISOugPaw==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@aws-sdk/types": 3.408.0 + tslib: 2.6.2 + dev: false + optional: true + + /@aws-sdk/util-locate-window@3.310.0: + resolution: + { + integrity: sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + tslib: 2.6.2 + dev: false + optional: true + + /@aws-sdk/util-user-agent-browser@3.408.0: + resolution: + { + integrity: sha512-wOVjDprG5h6kM8aJZk/tRX/RgxNxr73d6kIsUePlAgil13q62M9lcFMcIXduqtDsa1B6FfVB2wx/pyUuOZri5g==, + } + requiresBuild: true + dependencies: + "@aws-sdk/types": 3.408.0 + "@smithy/types": 2.3.0 + bowser: 2.11.0 + tslib: 2.6.2 + dev: false + optional: true + + /@aws-sdk/util-user-agent-node@3.408.0: + resolution: + { + integrity: sha512-BzMFV+cIXrtfcfJk3GpXnkANFkzZisvAtD306TMgIscn5FF26K1jD5DU+h5Q5WMq7gx+oXh9kJ3Lu3hi7hahKQ==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + peerDependencies: + aws-crt: ">=1.0.0" + peerDependenciesMeta: + aws-crt: + optional: true + dependencies: + "@aws-sdk/types": 3.408.0 + "@smithy/node-config-provider": 2.0.9 + "@smithy/types": 2.3.0 + tslib: 2.6.2 + dev: false + optional: true + + /@aws-sdk/util-utf8-browser@3.259.0: + resolution: + { + integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==, + } + requiresBuild: true + dependencies: + tslib: 2.6.2 + dev: false + optional: true + + /@esbuild/android-arm64@0.17.4: + resolution: + { + integrity: sha512-91VwDrl4EpxBCiG6h2LZZEkuNvVZYJkv2T9gyLG/mhGG1qrM7i5SwUcg/hlSPnL/4hDT0TFcF35/XMGSn0bemg==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm@0.17.4: + resolution: + { + integrity: sha512-R9GCe2xl2XDSc2XbQB63mFiFXHIVkOP+ltIxICKXqUPrFX97z6Z7vONCLQM1pSOLGqfLrGi3B7nbhxmFY/fomg==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-x64@0.17.4: + resolution: + { + integrity: sha512-mGSqhEPL7029XL7QHNPxPs15JVa02hvZvysUcyMP9UXdGFwncl2WU0bqx+Ysgzd+WAbv8rfNa73QveOxAnAM2w==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-arm64@0.17.4: + resolution: + { + integrity: sha512-tTyJRM9dHvlMPt1KrBFVB5OW1kXOsRNvAPtbzoKazd5RhD5/wKlXk1qR2MpaZRYwf4WDMadt0Pv0GwxB41CVow==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-x64@0.17.4: + resolution: + { + integrity: sha512-phQuC2Imrb3TjOJwLN8EO50nb2FHe8Ew0OwgZDH1SV6asIPGudnwTQtighDF2EAYlXChLoMJwqjAp4vAaACq6w==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-arm64@0.17.4: + resolution: + { + integrity: sha512-oH6JUZkocgmjzzYaP5juERLpJQSwazdjZrTPgLRmAU2bzJ688x0vfMB/WTv4r58RiecdHvXOPC46VtsMy/mepg==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-x64@0.17.4: + resolution: + { + integrity: sha512-U4iWGn/9TrAfpAdfd56eO0pRxIgb0a8Wj9jClrhT8hvZnOnS4dfMPW7o4fn15D/KqoiVYHRm43jjBaTt3g/2KA==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm64@0.17.4: + resolution: + { + integrity: sha512-UkGfQvYlwOaeYJzZG4cLV0hCASzQZnKNktRXUo3/BMZvdau40AOz9GzmGA063n1piq6VrFFh43apRDQx8hMP2w==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm@0.17.4: + resolution: + { + integrity: sha512-S2s9xWTGMTa/fG5EyMGDeL0wrWVgOSQcNddJWgu6rG1NCSXJHs76ZP9AsxjB3f2nZow9fWOyApklIgiTGZKhiw==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ia32@0.17.4: + resolution: + { + integrity: sha512-3lqFi4VFo/Vwvn77FZXeLd0ctolIJH/uXkH3yNgEk89Eh6D3XXAC9/iTPEzeEpsNE5IqGIsFa5Z0iPeOh25IyA==, + } + engines: { node: ">=12" } + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-loong64@0.17.4: + resolution: + { + integrity: sha512-HqpWZkVslDHIwdQ9D+gk7NuAulgQvRxF9no54ut/M55KEb3mi7sQS3GwpPJzSyzzP0UkjQVN7/tbk88/CaX4EQ==, + } + engines: { node: ">=12" } + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-mips64el@0.17.4: + resolution: + { + integrity: sha512-d/nMCKKh/SVDbqR9ju+b78vOr0tNXtfBjcp5vfHONCCOAL9ad8gN9dC/u+UnH939pz7wO+0u/x9y1MaZcb/lKA==, + } + engines: { node: ">=12" } + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ppc64@0.17.4: + resolution: + { + integrity: sha512-lOD9p2dmjZcNiTU+sGe9Nn6G3aYw3k0HBJies1PU0j5IGfp6tdKOQ6mzfACRFCqXjnBuTqK7eTYpwx09O5LLfg==, + } + engines: { node: ">=12" } + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-riscv64@0.17.4: + resolution: + { + integrity: sha512-mTGnwWwVshAjGsd8rP+K6583cPDgxOunsqqldEYij7T5/ysluMHKqUIT4TJHfrDFadUwrghAL6QjER4FeqQXoA==, + } + engines: { node: ">=12" } + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-s390x@0.17.4: + resolution: + { + integrity: sha512-AQYuUGp50XM29/N/dehADxvc2bUqDcoqrVuijop1Wv72SyxT6dDB9wjUxuPZm2HwIM876UoNNBMVd+iX/UTKVQ==, + } + engines: { node: ">=12" } + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-x64@0.17.4: + resolution: + { + integrity: sha512-+AsFBwKgQuhV2shfGgA9YloxLDVjXgUEWZum7glR5lLmV94IThu/u2JZGxTgjYby6kyXEx8lKOqP5rTEVBR0Rw==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/netbsd-x64@0.17.4: + resolution: + { + integrity: sha512-zD1TKYX9553OiLS/qkXPMlWoELYkH/VkzRYNKEU+GwFiqkq0SuxsKnsCg5UCdxN3cqd+1KZ8SS3R+WG/Hxy2jQ==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/openbsd-x64@0.17.4: + resolution: + { + integrity: sha512-PY1NjEsLRhPEFFg1AV0/4Or/gR+q2dOb9s5rXcPuCjyHRzbt8vnHJl3vYj+641TgWZzTFmSUnZbzs1zwTzjeqw==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/sunos-x64@0.17.4: + resolution: + { + integrity: sha512-B3Z7s8QZQW9tKGleMRXvVmwwLPAUoDCHs4WZ2ElVMWiortLJFowU1NjAhXOKjDgC7o9ByeVcwyOlJ+F2r6ZgmQ==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-arm64@0.17.4: + resolution: + { + integrity: sha512-0HCu8R3mY/H5V7N6kdlsJkvrT591bO/oRZy8ztF1dhgNU5xD5tAh5bKByT1UjTGjp/VVBsl1PDQ3L18SfvtnBQ==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-ia32@0.17.4: + resolution: + { + integrity: sha512-VUjhVDQycse1gLbe06pC/uaA0M+piQXJpdpNdhg8sPmeIZZqu5xPoGWVCmcsOO2gaM2cywuTYTHkXRozo3/Nkg==, + } + engines: { node: ">=12" } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-x64@0.17.4: + resolution: + { + integrity: sha512-0kLAjs+xN5OjhTt/aUA6t48SfENSCKgGPfExADYTOo/UCn0ivxos9/anUVeSfg+L+2O9xkFxvJXIJfG+Q4sYSg==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: + { + integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==, + } + engines: { node: ">=6.0.0" } + dependencies: + "@jridgewell/set-array": 1.1.2 + "@jridgewell/sourcemap-codec": 1.4.15 + "@jridgewell/trace-mapping": 0.3.19 + dev: false + + /@jridgewell/resolve-uri@3.1.1: + resolution: + { + integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==, + } + engines: { node: ">=6.0.0" } + dev: false + + /@jridgewell/set-array@1.1.2: + resolution: + { + integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==, + } + engines: { node: ">=6.0.0" } + dev: false + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: + { + integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, + } + dev: false + + /@jridgewell/trace-mapping@0.3.19: + resolution: + { + integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==, + } + dependencies: + "@jridgewell/resolve-uri": 3.1.1 + "@jridgewell/sourcemap-codec": 1.4.15 + dev: false + + /@mapbox/node-pre-gyp@1.0.11: + resolution: + { + integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==, + } + hasBin: true + dependencies: + detect-libc: 2.0.2 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.7.0 + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.5.4 + tar: 6.2.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@mfd/rbxdatastoreservice@2.3.11: + resolution: + { + integrity: sha512-sZkBwBolSwHT2RDz4//7K0Vkxdjo2Zg1RSdSaUasTUKWj+BMeANgyLv/baMFHcJFE/Z+3kCcCkU/VHqfiQAHgA==, + } + requiresBuild: true + dependencies: + axios: 0.27.2 + crypto-js: 4.1.1 + transitivePeerDependencies: + - debug + dev: false + + /@mongodb-js/saslprep@1.1.0: + resolution: + { + integrity: sha512-Xfijy7HvfzzqiOAhAepF4SGN5e9leLkMvg/OPOF97XemjfVCYN/oWa75wnkc6mltMSTwY+XlbhWgUOJmkFspSw==, + } + requiresBuild: true + dependencies: + sparse-bitfield: 3.0.3 + dev: false + optional: true + + /@nodelib/fs.scandir@2.1.5: + resolution: + { + integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + } + engines: { node: ">= 8" } + dependencies: + "@nodelib/fs.stat": 2.0.5 + run-parallel: 1.2.0 + dev: false + + /@nodelib/fs.stat@2.0.5: + resolution: + { + integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, + } + engines: { node: ">= 8" } + dev: false + + /@nodelib/fs.walk@1.2.8: + resolution: + { + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + } + engines: { node: ">= 8" } + dependencies: + "@nodelib/fs.scandir": 2.1.5 + fastq: 1.15.0 + dev: false + + /@redis/bloom@1.2.0(@redis/client@1.5.9): + resolution: + { + integrity: sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==, + } + peerDependencies: + "@redis/client": ^1.0.0 + dependencies: + "@redis/client": 1.5.9 + dev: false + + /@redis/client@1.5.9: + resolution: + { + integrity: sha512-SffgN+P1zdWJWSXBvJeynvEnmnZrYmtKSRW00xl8pOPFOMJjxRR9u0frSxJpPR6Y4V+k54blJjGW7FgxbTI7bQ==, + } + engines: { node: ">=14" } + dependencies: + cluster-key-slot: 1.1.2 + generic-pool: 3.9.0 + yallist: 4.0.0 + dev: false + + /@redis/graph@1.1.0(@redis/client@1.5.9): + resolution: + { + integrity: sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==, + } + peerDependencies: + "@redis/client": ^1.0.0 + dependencies: + "@redis/client": 1.5.9 + dev: false + + /@redis/json@1.0.4(@redis/client@1.5.9): + resolution: + { + integrity: sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==, + } + peerDependencies: + "@redis/client": ^1.0.0 + dependencies: + "@redis/client": 1.5.9 + dev: false + + /@redis/search@1.1.3(@redis/client@1.5.9): + resolution: + { + integrity: sha512-4Dg1JjvCevdiCBTZqjhKkGoC5/BcB7k9j99kdMnaXFXg8x4eyOIVg9487CMv7/BUVkFLZCaIh8ead9mU15DNng==, + } + peerDependencies: + "@redis/client": ^1.0.0 + dependencies: + "@redis/client": 1.5.9 + dev: false + + /@redis/time-series@1.0.5(@redis/client@1.5.9): + resolution: + { + integrity: sha512-IFjIgTusQym2B5IZJG3XKr5llka7ey84fw/NOYqESP5WUfQs9zz1ww/9+qoz4ka/S6KcGBodzlCeZ5UImKbscg==, + } + peerDependencies: + "@redis/client": ^1.0.0 + dependencies: + "@redis/client": 1.5.9 + dev: false + + /@smithy/abort-controller@2.0.6: + resolution: + { + integrity: sha512-4I7g0lyGUlW2onf8mD76IzU37oRWSHsQ5zlW5MjDzgg4I4J9bOK4500Gx6qOuoN7+GulAnGLe1YwyrIluzhakg==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@smithy/types": 2.3.0 + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/config-resolver@2.0.7: + resolution: + { + integrity: sha512-J4J1AWiqaApC+3I9U++SuxAQ3BOoM5VoYnpFzCZcb63aLF80Zpc/nq2pFR1OsEIYyg2UYNdcBKKfHABmwo4WgQ==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@smithy/node-config-provider": 2.0.9 + "@smithy/types": 2.3.0 + "@smithy/util-config-provider": 2.0.0 + "@smithy/util-middleware": 2.0.0 + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/credential-provider-imds@2.0.9: + resolution: + { + integrity: sha512-K7WZRkHS5HZofRgK+O8W4YXXyaVexU1K6hp9vlUL/8CsnrFbZS9quyH/6hTROrYh2PuJr24yii1kc83NJdxMGQ==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@smithy/node-config-provider": 2.0.9 + "@smithy/property-provider": 2.0.7 + "@smithy/types": 2.3.0 + "@smithy/url-parser": 2.0.6 + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/eventstream-codec@2.0.6: + resolution: + { + integrity: sha512-J9xL82mlYRUMXFnB9VaThXkD7z2JLr52FIVZMoQQ1dxZG5ub+NOGmzaTTZC/cMmKXI/nwCoFuwDWCTjwQhYhQA==, + } + requiresBuild: true + dependencies: + "@aws-crypto/crc32": 3.0.0 + "@smithy/types": 2.3.0 + "@smithy/util-hex-encoding": 2.0.0 + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/fetch-http-handler@2.1.2: + resolution: + { + integrity: sha512-3Gm3pQm4viUPU+e7KkRScS9t5phBxSNRS8rQSZ+HeCwK/busrX0/2HJZiwLvGblqPqi1laJB0lD18AdiOioJww==, + } + requiresBuild: true + dependencies: + "@smithy/protocol-http": 3.0.2 + "@smithy/querystring-builder": 2.0.6 + "@smithy/types": 2.3.0 + "@smithy/util-base64": 2.0.0 + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/hash-node@2.0.6: + resolution: + { + integrity: sha512-xz7fzFxSzxohKGGyKPbLReRrY01JOZgRDHIXSks3PxQxG9c8PJMa5nUw0stH8UOySUgkofmMy0n7vTUsF5Mdqg==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@smithy/types": 2.3.0 + "@smithy/util-buffer-from": 2.0.0 + "@smithy/util-utf8": 2.0.0 + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/invalid-dependency@2.0.6: + resolution: + { + integrity: sha512-L5MUyl9mzawIvBxr0Hg3J/Q5qZFXKcBgMk0PacfK3Mthp4WAR6h7iMxdSQ23Q7X/kxOrpZuoYEdh1BWLKbDc8Q==, + } + requiresBuild: true + dependencies: + "@smithy/types": 2.3.0 + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/is-array-buffer@2.0.0: + resolution: + { + integrity: sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/middleware-content-length@2.0.8: + resolution: + { + integrity: sha512-fHJFsscHXrYhUSWMFJNXfsZW8KsyhWQfBgU3b0nvDfpm+NAeQLqKYNhywGrDwZQc1k+lt7Fw9faAquhNPxTZRA==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@smithy/protocol-http": 3.0.2 + "@smithy/types": 2.3.0 + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/middleware-endpoint@2.0.6: + resolution: + { + integrity: sha512-MuSPPtEHFal/M77tR3ffLsdOfX29IZpA990nGuoPj5zQnAYrA4PYBGoqqrASQKm8Xb3C0NwuYzOATT7WX4f5Pg==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@smithy/middleware-serde": 2.0.6 + "@smithy/types": 2.3.0 + "@smithy/url-parser": 2.0.6 + "@smithy/util-middleware": 2.0.0 + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/middleware-retry@2.0.9: + resolution: + { + integrity: sha512-gneEqWj4l/ZjHdZPk0BFMXoTalRArdQ8i579/KqJgBAc6Ux5vnR/SSppkMCkj2kOQYwdypvzSPeqEW3ZrvIg6g==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@smithy/node-config-provider": 2.0.9 + "@smithy/protocol-http": 3.0.2 + "@smithy/service-error-classification": 2.0.0 + "@smithy/types": 2.3.0 + "@smithy/util-middleware": 2.0.0 + "@smithy/util-retry": 2.0.0 + tslib: 2.6.2 + uuid: 8.3.2 + dev: false + optional: true + + /@smithy/middleware-serde@2.0.6: + resolution: + { + integrity: sha512-8/GODBngYbrS28CMZtaHIL4R9rLNSQ/zgb+N1OAZ02NwBUawlnLDcatve9YRzhJC/IWz0/pt+WimJZaO1sGcig==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@smithy/types": 2.3.0 + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/middleware-stack@2.0.0: + resolution: + { + integrity: sha512-31XC1xNF65nlbc16yuh3wwTudmqs6qy4EseQUGF8A/p2m/5wdd/cnXJqpniy/XvXVwkHPz/GwV36HqzHtIKATQ==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/node-config-provider@2.0.9: + resolution: + { + integrity: sha512-TlSPbCwtT/jgNnmPQqKuCR5CFN8UIrCCHRrgUfs3NqRMuaLLeP8TPe1fSKq2J8h1M/jd4BF853gneles0gWevg==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@smithy/property-provider": 2.0.7 + "@smithy/shared-ini-file-loader": 2.0.8 + "@smithy/types": 2.3.0 + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/node-http-handler@2.1.2: + resolution: + { + integrity: sha512-PdEEDCShuM8zxGoaRxmGB/1ikB8oeqz+ZAF9VIA8FCP3E59j8zDTF+wCELoWd1Y6gtxr+RcTAg5sA8nvn5qH/w==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@smithy/abort-controller": 2.0.6 + "@smithy/protocol-http": 3.0.2 + "@smithy/querystring-builder": 2.0.6 + "@smithy/types": 2.3.0 + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/property-provider@2.0.7: + resolution: + { + integrity: sha512-XT8Tl7YNxM8tCtGqy7v7DSf6PxyXaPE9cdA/Yj4dEw2b05V3RrPqsP+t5XJiZu0yIsQ7pdeYZWv2sSEWVjNeAg==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@smithy/types": 2.3.0 + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/protocol-http@2.0.5: + resolution: + { + integrity: sha512-d2hhHj34mA2V86doiDfrsy2fNTnUOowGaf9hKb0hIPHqvcnShU4/OSc4Uf1FwHkAdYF3cFXTrj5VGUYbEuvMdw==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@smithy/types": 2.3.0 + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/protocol-http@3.0.2: + resolution: + { + integrity: sha512-LUOWCPRihvJBkdSs+ivK9m1f/rMfF3n9Zpzg8qdry2eIG4HQqqLBMWQyF9bgk7JhsrrOa3//jJKhXzvL7wL5Xw==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@smithy/types": 2.3.0 + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/querystring-builder@2.0.6: + resolution: + { + integrity: sha512-HnU00shCGoV8vKJZTiNBkNvR9NogU3NIUaVMAGJPSqNGJj3psWo+TUrC0BVCDcwiCljXwXCFGJqIcsWtClrktQ==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@smithy/types": 2.3.0 + "@smithy/util-uri-escape": 2.0.0 + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/querystring-parser@2.0.6: + resolution: + { + integrity: sha512-i4LKoXHP7pTFAPjLIJyQXYOhWokbcFha3WWsX74sAKmuluv0XM2cxONZoFxwEzmWhsNyM6buSwJSZXyPiec0AQ==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@smithy/types": 2.3.0 + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/service-error-classification@2.0.0: + resolution: + { + integrity: sha512-2z5Nafy1O0cTf69wKyNjGW/sNVMiqDnb4jgwfMG8ye8KnFJ5qmJpDccwIbJNhXIfbsxTg9SEec2oe1cexhMJvw==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dev: false + optional: true + + /@smithy/shared-ini-file-loader@2.0.8: + resolution: + { + integrity: sha512-4u+V+Dv7JGpJ0tppB5rxCem7WhdFux950z4cGPhV0kHTPkKe8DDgINzOlVa2RBu5dI33D02OBJcxFjhW4FPORg==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@smithy/types": 2.3.0 + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/signature-v4@2.0.6: + resolution: + { + integrity: sha512-4zNTi8w4sky07YKq7oYucZt4ogY00IEaS1NFDXxmCN5V/ywE0WiK+WMim+8wtYQmB0qy3oExZR4LoCAml6j/rA==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@smithy/eventstream-codec": 2.0.6 + "@smithy/is-array-buffer": 2.0.0 + "@smithy/types": 2.3.0 + "@smithy/util-hex-encoding": 2.0.0 + "@smithy/util-middleware": 2.0.0 + "@smithy/util-uri-escape": 2.0.0 + "@smithy/util-utf8": 2.0.0 + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/smithy-client@2.1.3: + resolution: + { + integrity: sha512-nSMMp2AKqcG/ruzCY01ogrMdbq/WS1cvGStTsw7yd6bTpp/bGtlOgXvy3h7e0zP7w2DH1AtvIwzYBD6ejZePsQ==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@smithy/middleware-stack": 2.0.0 + "@smithy/types": 2.3.0 + "@smithy/util-stream": 2.0.9 + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/types@2.3.0: + resolution: + { + integrity: sha512-pJce3rd39MElkV57UTPAoSYAApjQLELUxjU5adHNLYk9gnPvyIGbJNJTZVVFu00BrgZH3W/cQe8QuFcknDyodQ==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/url-parser@2.0.6: + resolution: + { + integrity: sha512-9i6j5QW6bapHZ4rtkXOAm0hOUG1+5IVdVJXNSUTcNskwJchZH5IQuDNPCbgUi/u2P8EZazKt4wXT51QxOXCz1A==, + } + requiresBuild: true + dependencies: + "@smithy/querystring-parser": 2.0.6 + "@smithy/types": 2.3.0 + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/util-base64@2.0.0: + resolution: + { + integrity: sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@smithy/util-buffer-from": 2.0.0 + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/util-body-length-browser@2.0.0: + resolution: + { + integrity: sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==, + } + requiresBuild: true + dependencies: + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/util-body-length-node@2.1.0: + resolution: + { + integrity: sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/util-buffer-from@2.0.0: + resolution: + { + integrity: sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@smithy/is-array-buffer": 2.0.0 + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/util-config-provider@2.0.0: + resolution: + { + integrity: sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/util-defaults-mode-browser@2.0.7: + resolution: + { + integrity: sha512-s1caKxC7Y87Q72Goll//clZs2WNBfG9WtFDWVRS+Qgk147YPCOUYtkpuD0XZAh/vbayObFz5tQ1fiX4G19HSCA==, + } + engines: { node: ">= 10.0.0" } + requiresBuild: true + dependencies: + "@smithy/property-provider": 2.0.7 + "@smithy/types": 2.3.0 + bowser: 2.11.0 + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/util-defaults-mode-node@2.0.9: + resolution: + { + integrity: sha512-HlV4iNL3/PgPpmDGs0+XrAKtwFQ8rOs5P2y5Dye8dUYaJauadlzHRrNKk7wH2aBYswvT2HM+PIgXamvrE7xbcw==, + } + engines: { node: ">= 10.0.0" } + requiresBuild: true + dependencies: + "@smithy/config-resolver": 2.0.7 + "@smithy/credential-provider-imds": 2.0.9 + "@smithy/node-config-provider": 2.0.9 + "@smithy/property-provider": 2.0.7 + "@smithy/types": 2.3.0 + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/util-hex-encoding@2.0.0: + resolution: + { + integrity: sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/util-middleware@2.0.0: + resolution: + { + integrity: sha512-eCWX4ECuDHn1wuyyDdGdUWnT4OGyIzV0LN1xRttBFMPI9Ff/4heSHVxneyiMtOB//zpXWCha1/SWHJOZstG7kA==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/util-retry@2.0.0: + resolution: + { + integrity: sha512-/dvJ8afrElasuiiIttRJeoS2sy8YXpksQwiM/TcepqdRVp7u4ejd9C4IQURHNjlfPUT7Y6lCDSa2zQJbdHhVTg==, + } + engines: { node: ">= 14.0.0" } + requiresBuild: true + dependencies: + "@smithy/service-error-classification": 2.0.0 + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/util-stream@2.0.9: + resolution: + { + integrity: sha512-Fn2/3IMwqu0l2hOC7K3bbtSqFEJ6nOzMLoPVIhuH84yw/95itNkFBwVbIIiAfDaout0ZfZ26+5ch86E2q3avww==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@smithy/fetch-http-handler": 2.1.2 + "@smithy/node-http-handler": 2.1.2 + "@smithy/types": 2.3.0 + "@smithy/util-base64": 2.0.0 + "@smithy/util-buffer-from": 2.0.0 + "@smithy/util-hex-encoding": 2.0.0 + "@smithy/util-utf8": 2.0.0 + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/util-uri-escape@2.0.0: + resolution: + { + integrity: sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + tslib: 2.6.2 + dev: false + optional: true + + /@smithy/util-utf8@2.0.0: + resolution: + { + integrity: sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==, + } + engines: { node: ">=14.0.0" } + requiresBuild: true + dependencies: + "@smithy/util-buffer-from": 2.0.0 + tslib: 2.6.2 + dev: false + optional: true + + /@types/node@20.6.0: + resolution: + { + integrity: sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==, + } + dev: false + + /@types/webidl-conversions@7.0.0: + resolution: + { + integrity: sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==, + } + dev: false + + /@types/whatwg-url@8.2.2: + resolution: + { + integrity: sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==, + } + dependencies: + "@types/node": 20.6.0 + "@types/webidl-conversions": 7.0.0 + dev: false + + /@yaireo/relative-time@1.0.4: + resolution: + { + integrity: sha512-ILW0k/xtOsnnzLZg+3tk+A9HtTOYu4GI4bG1epBxJ/borIZgGDRMD8kVjzitGyKbV0LOsOchIMZdsAaQxRgImA==, + } + engines: { node: ">=12.0.0" } + dev: false + + /abbrev@1.1.1: + resolution: + { + integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==, + } + + /accepts@1.3.8: + resolution: + { + integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==, + } + engines: { node: ">= 0.6" } + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: false + + /agent-base@6.0.2: + resolution: + { + integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==, + } + engines: { node: ">= 6.0.0" } + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /ansi-regex@5.0.1: + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: ">=8" } + dev: false + + /ansi-styles@4.3.0: + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: ">=8" } + dependencies: + color-convert: 2.0.1 + dev: false + + /any-promise@1.3.0: + resolution: + { + integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==, + } + dev: false + + /anymatch@3.1.3: + resolution: + { + integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, + } + engines: { node: ">= 8" } + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + /append-field@1.0.0: + resolution: + { + integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==, + } + dev: false + + /aproba@2.0.0: + resolution: + { + integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==, + } + dev: false + + /are-we-there-yet@2.0.0: + resolution: + { + integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==, + } + engines: { node: ">=10" } + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + dev: false + + /arg@5.0.2: + resolution: + { + integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==, + } + dev: false + + /array-flatten@1.1.1: + resolution: + { + integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==, + } + dev: false + + /asynckit@0.4.0: + resolution: + { + integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, + } + dev: false + + /atob@2.1.2: + resolution: + { + integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==, + } + engines: { node: ">= 4.5.0" } + hasBin: true + dev: false + + /autoprefixer@10.4.15(postcss@8.4.29): + resolution: + { + integrity: sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==, + } + engines: { node: ^10 || ^12 || >=14 } + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.21.10 + caniuse-lite: 1.0.30001532 + fraction.js: 4.3.6 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.29 + postcss-value-parser: 4.2.0 + dev: false + + /axios@0.27.2: + resolution: + { + integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==, + } + dependencies: + follow-redirects: 1.15.2 + form-data: 4.0.0 + transitivePeerDependencies: + - debug + dev: false + + /balanced-match@1.0.2: + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } + + /base32.js@0.0.1: + resolution: + { + integrity: sha512-EGHIRiegFa62/SsA1J+Xs2tIzludPdzM064N9wjbiEgHnGnJ1V0WEpA4pEwCYT5nDvZk3ubf0shqaCS7k6xeUQ==, + } + dev: false + + /base64-js@1.5.1: + resolution: + { + integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, + } + dev: false + + /bcrypt@5.1.1: + resolution: + { + integrity: sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==, + } + engines: { node: ">= 10.0.0" } + requiresBuild: true + dependencies: + "@mapbox/node-pre-gyp": 1.0.11 + node-addon-api: 5.1.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /binary-extensions@2.2.0: + resolution: + { + integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==, + } + engines: { node: ">=8" } + + /bintrees@1.0.2: + resolution: + { + integrity: sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==, + } + dev: false + + /body-parser@1.20.1: + resolution: + { + integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==, + } + engines: { node: ">= 0.8", npm: 1.2.8000 || >= 1.4.16 } + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + 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 + transitivePeerDependencies: + - supports-color + dev: false + + /body-parser@1.20.2: + resolution: + { + integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==, + } + engines: { node: ">= 0.8", npm: 1.2.8000 || >= 1.4.16 } + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + 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.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /bowser@2.11.0: + resolution: + { + integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==, + } + requiresBuild: true + dev: false + optional: true + + /brace-expansion@1.1.11: + resolution: + { + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, + } + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /braces@3.0.2: + resolution: + { + integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, + } + engines: { node: ">=8" } + dependencies: + fill-range: 7.0.1 + + /browserslist@4.21.10: + resolution: + { + integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==, + } + engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + hasBin: true + dependencies: + caniuse-lite: 1.0.30001532 + electron-to-chromium: 1.4.513 + node-releases: 2.0.13 + update-browserslist-db: 1.0.11(browserslist@4.21.10) + dev: false + + /bson@4.7.2: + resolution: + { + integrity: sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==, + } + engines: { node: ">=6.9.0" } + dependencies: + buffer: 5.7.1 + dev: false + + /buffer-equal-constant-time@1.0.1: + resolution: + { + integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==, + } + dev: false + + /buffer-from@1.1.2: + resolution: + { + integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, + } + dev: false + + /buffer@5.7.1: + resolution: + { + integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, + } + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /busboy@1.6.0: + resolution: + { + integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==, + } + engines: { node: ">=10.16.0" } + dependencies: + streamsearch: 1.1.0 + dev: false + + /bytes@3.1.2: + resolution: + { + integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==, + } + engines: { node: ">= 0.8" } + dev: false + + /call-bind@1.0.2: + resolution: + { + integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==, + } + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.1 + dev: false + + /camelcase-css@2.0.1: + resolution: + { + integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==, + } + engines: { node: ">= 6" } + dev: false + + /camelcase@5.3.1: + resolution: + { + integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==, + } + engines: { node: ">=6" } + dev: false + + /caniuse-lite@1.0.30001532: + resolution: + { + integrity: sha512-FbDFnNat3nMnrROzqrsg314zhqN5LGQ1kyyMk2opcrwGbVGpHRhgCWtAgD5YJUqNAiQ+dklreil/c3Qf1dfCTw==, + } + dev: false + + /chokidar@3.5.3: + resolution: + { + integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, + } + engines: { node: ">= 8.10.0" } + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + /chownr@2.0.0: + resolution: + { + integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==, + } + engines: { node: ">=10" } + dev: false + + /cliui@6.0.0: + resolution: + { + integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==, + } + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + dev: false + + /cluster-key-slot@1.1.2: + resolution: + { + integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==, + } + engines: { node: ">=0.10.0" } + dev: false + + /color-convert@2.0.1: + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: ">=7.0.0" } + dependencies: + color-name: 1.1.4 + dev: false + + /color-name@1.1.4: + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } + dev: false + + /color-string@1.9.1: + resolution: + { + integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==, + } + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + + /color-support@1.1.3: + resolution: + { + integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==, + } + hasBin: true + dev: false + + /color@4.2.3: + resolution: + { + integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==, + } + engines: { node: ">=12.5.0" } + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + dev: false + + /combined-stream@1.0.8: + resolution: + { + integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, + } + engines: { node: ">= 0.8" } + dependencies: + delayed-stream: 1.0.0 + dev: false + + /commander@2.20.3: + resolution: + { + integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, + } + dev: false + + /commander@4.1.1: + resolution: + { + integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==, + } + engines: { node: ">= 6" } + dev: false + + /concat-map@0.0.1: + resolution: + { + integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, + } + + /concat-stream@1.6.2: + resolution: + { + integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==, + } + engines: { "0": node >= 0.8 } + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + typedarray: 0.0.6 + dev: false + + /connect-flash@0.1.1: + resolution: + { + integrity: sha512-2rcfELQt/ZMP+SM/pG8PyhJRaLKp+6Hk2IUBNkEit09X+vwn3QsAL3ZbYtxUn7NVPzbMTSLRDhqe0B/eh30RYA==, + } + engines: { node: ">= 0.4.0" } + dev: false + + /console-control-strings@1.1.0: + resolution: + { + integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==, + } + dev: false + + /content-disposition@0.5.4: + resolution: + { + integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==, + } + engines: { node: ">= 0.6" } + dependencies: + safe-buffer: 5.2.1 + dev: false + + /content-type@1.0.5: + resolution: + { + integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==, + } + engines: { node: ">= 0.6" } + dev: false + + /cookie-parser@1.4.6: + resolution: + { + integrity: sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==, + } + engines: { node: ">= 0.8.0" } + dependencies: + cookie: 0.4.1 + cookie-signature: 1.0.6 + dev: false + + /cookie-signature@1.0.6: + resolution: + { + integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==, + } + dev: false + + /cookie@0.4.1: + resolution: + { + integrity: sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==, + } + engines: { node: ">= 0.6" } + dev: false + + /cookie@0.4.2: + resolution: + { + integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==, + } + engines: { node: ">= 0.6" } + dev: false + + /cookie@0.5.0: + resolution: + { + integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==, + } + engines: { node: ">= 0.6" } + dev: false + + /core-util-is@1.0.3: + resolution: + { + integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, + } + dev: false + + /cors@2.8.5: + resolution: + { + integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==, + } + engines: { node: ">= 0.10" } + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + dev: false + + /cross-env@7.0.3: + resolution: + { + integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==, + } + engines: { node: ">=10.14", npm: ">=6", yarn: ">=1" } + hasBin: true + dependencies: + cross-spawn: 7.0.3 + dev: true + + /cross-spawn@7.0.3: + resolution: + { + integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, + } + engines: { node: ">= 8" } + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /crypto-js@4.1.1: + resolution: + { + integrity: sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==, + } + dev: false + + /css-selector-tokenizer@0.8.0: + resolution: + { + integrity: sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==, + } + dependencies: + cssesc: 3.0.0 + fastparse: 1.1.2 + dev: false + + /cssesc@3.0.0: + resolution: + { + integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==, + } + engines: { node: ">=4" } + hasBin: true + dev: false + + /cssfilter@0.0.10: + resolution: + { + integrity: sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==, + } + dev: false + + /daisyui@2.52.0(autoprefixer@10.4.15)(postcss@8.4.29): + resolution: + { + integrity: sha512-LQTA5/IVXAJHBMFoeaEMfd7/akAFPPcdQPR3O9fzzcFiczneJFM73CFPnScmW2sOgn/D83cvkP854ep2T9OfTg==, + } + peerDependencies: + autoprefixer: ^10.0.2 + postcss: ^8.1.6 + dependencies: + autoprefixer: 10.4.15(postcss@8.4.29) + color: 4.2.3 + css-selector-tokenizer: 0.8.0 + postcss: 8.4.29 + postcss-js: 4.0.1(postcss@8.4.29) + tailwindcss: 3.3.3 + transitivePeerDependencies: + - ts-node + dev: false + + /data-uri-to-buffer@4.0.1: + resolution: + { + integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==, + } + engines: { node: ">= 12" } + dev: false + + /debug@2.6.9: + resolution: + { + integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==, + } + peerDependencies: + supports-color: "*" + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: false + + /debug@3.2.7(supports-color@5.5.0): + resolution: + { + integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==, + } + peerDependencies: + supports-color: "*" + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + supports-color: 5.5.0 + dev: true + + /debug@4.3.4: + resolution: + { + integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, + } + engines: { node: ">=6.0" } + peerDependencies: + supports-color: "*" + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: false + + /decamelize@1.2.0: + resolution: + { + integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==, + } + engines: { node: ">=0.10.0" } + dev: false + + /delayed-stream@1.0.0: + resolution: + { + integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, + } + engines: { node: ">=0.4.0" } + dev: false + + /delegates@1.0.0: + resolution: + { + integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==, + } + dev: false + + /depd@2.0.0: + resolution: + { + integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, + } + engines: { node: ">= 0.8" } + dev: false + + /destroy@1.2.0: + resolution: + { + integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==, + } + engines: { node: ">= 0.8", npm: 1.2.8000 || >= 1.4.16 } + dev: false + + /detect-libc@2.0.2: + resolution: + { + integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==, + } + engines: { node: ">=8" } + dev: false + + /didyoumean@1.2.2: + resolution: + { + integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==, + } + dev: false + + /dijkstrajs@1.0.3: + resolution: + { + integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==, + } + dev: false + + /dlv@1.1.3: + resolution: + { + integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==, + } + dev: false + + /dotenv@16.3.1: + resolution: + { + integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==, + } + engines: { node: ">=12" } + dev: false + + /easy-soap-request@4.8.0: + resolution: + { + integrity: sha512-fD1NXRv14P4IdAoyYpGJ2kB+292vYfvU7qLbmUw2x2HA+U74LWVyErjyNf2Jxn1mUAwp+sRdMlkmrUrPY0/wAg==, + } + dependencies: + axios: 0.27.2 + transitivePeerDependencies: + - debug + dev: false + + /ecdsa-sig-formatter@1.0.11: + resolution: + { + integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==, + } + dependencies: + safe-buffer: 5.2.1 + dev: false + + /ee-first@1.1.1: + resolution: + { + integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==, + } + dev: false + + /electron-to-chromium@1.4.513: + resolution: + { + integrity: sha512-cOB0xcInjm+E5qIssHeXJ29BaUyWpMyFKT5RB3bsLENDheCja0wMkHJyiPl0NBE/VzDI7JDuNEQWhe6RitEUcw==, + } + dev: false + + /emoji-regex@8.0.0: + resolution: + { + integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, + } + dev: false + + /encode-utf8@1.0.3: + resolution: + { + integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==, + } + dev: false + + /encodeurl@1.0.2: + resolution: + { + integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==, + } + engines: { node: ">= 0.8" } + dev: false + + /esbuild@0.17.4: + resolution: + { + integrity: sha512-zBn9MeCwT7W5F1a3lXClD61ip6vQM+H8Msb0w8zMT4ZKBpDg+rFAraNyWCDelB/2L6M3g6AXHPnsyvjMFnxtFw==, + } + engines: { node: ">=12" } + hasBin: true + requiresBuild: true + optionalDependencies: + "@esbuild/android-arm": 0.17.4 + "@esbuild/android-arm64": 0.17.4 + "@esbuild/android-x64": 0.17.4 + "@esbuild/darwin-arm64": 0.17.4 + "@esbuild/darwin-x64": 0.17.4 + "@esbuild/freebsd-arm64": 0.17.4 + "@esbuild/freebsd-x64": 0.17.4 + "@esbuild/linux-arm": 0.17.4 + "@esbuild/linux-arm64": 0.17.4 + "@esbuild/linux-ia32": 0.17.4 + "@esbuild/linux-loong64": 0.17.4 + "@esbuild/linux-mips64el": 0.17.4 + "@esbuild/linux-ppc64": 0.17.4 + "@esbuild/linux-riscv64": 0.17.4 + "@esbuild/linux-s390x": 0.17.4 + "@esbuild/linux-x64": 0.17.4 + "@esbuild/netbsd-x64": 0.17.4 + "@esbuild/openbsd-x64": 0.17.4 + "@esbuild/sunos-x64": 0.17.4 + "@esbuild/win32-arm64": 0.17.4 + "@esbuild/win32-ia32": 0.17.4 + "@esbuild/win32-x64": 0.17.4 + dev: false + + /escalade@3.1.1: + resolution: + { + integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==, + } + engines: { node: ">=6" } + dev: false + + /escape-html@1.0.3: + resolution: + { + integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==, + } + dev: false + + /etag@1.8.1: + resolution: + { + integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==, + } + engines: { node: ">= 0.6" } + dev: false + + /express-flash-message@2.1.0: + resolution: + { + integrity: sha512-oR/cwzt7CfjSUt7XwEZCCyOegylHuTF8/by6+jAshZh2TzREqDIjfU0JU5M6usurSk/ep3lUxxyaCbujyERyTQ==, + } + dev: false + + /express-prom-bundle@6.6.0(prom-client@14.2.0): + resolution: + { + integrity: sha512-tZh2P2p5a8/yxQ5VbRav011Poa4R0mHqdFwn9Swe/obXDe5F0jY9wtRAfNYnqk4LXY7akyvR/nrvAHxQPWUjsQ==, + } + engines: { node: ">=10" } + peerDependencies: + prom-client: ">=12.0.0" + dependencies: + on-finished: 2.4.1 + prom-client: 14.2.0 + url-value-parser: 2.2.0 + dev: false + + /express-rate-limit@6.11.0(express@4.18.2): + resolution: + { + integrity: sha512-H9afltGTaEZcvenAB5LFgb/ysTMHUzMxoB3TJM6UHP5FtAP1p2+heMj1xwTei54Zm4I9I/2qsS5m+XrdKQp/Hw==, + } + engines: { node: ">= 14" } + peerDependencies: + express: ^4 || ^5 + dependencies: + express: 4.18.2 + dev: false + + /express-session@1.17.3: + resolution: + { + integrity: sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==, + } + engines: { node: ">= 0.8.0" } + 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 + transitivePeerDependencies: + - supports-color + dev: false + + /express@4.18.2: + resolution: + { + integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==, + } + engines: { node: ">= 0.10.0" } + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + 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 + transitivePeerDependencies: + - supports-color + dev: false + + /fast-glob@3.3.1: + resolution: + { + integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==, + } + engines: { node: ">=8.6.0" } + dependencies: + "@nodelib/fs.stat": 2.0.5 + "@nodelib/fs.walk": 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: false + + /fast-xml-parser@4.2.5: + resolution: + { + integrity: sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==, + } + hasBin: true + requiresBuild: true + dependencies: + strnum: 1.0.5 + dev: false + optional: true + + /fastparse@1.1.2: + resolution: + { + integrity: sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==, + } + dev: false + + /fastq@1.15.0: + resolution: + { + integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==, + } + dependencies: + reusify: 1.0.4 + dev: false + + /fetch-blob@3.2.0: + resolution: + { + integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==, + } + engines: { node: ^12.20 || >= 14.13 } + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.2.1 + dev: false + + /file-type-checker@1.0.8: + resolution: + { + integrity: sha512-aNs0byeXzbY+LD+DVsadicRLd3hRoum0ZJhtO5P4gPuRJGXM4ZmZKzCHuxPcGEaUGZ2r0LKXkgydKROswu7NaQ==, + } + dev: false + + /fill-range@7.0.1: + resolution: + { + integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, + } + engines: { node: ">=8" } + dependencies: + to-regex-range: 5.0.1 + + /finalhandler@1.2.0: + resolution: + { + integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==, + } + engines: { node: ">= 0.8" } + 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 + transitivePeerDependencies: + - supports-color + dev: false + + /find-up@4.1.0: + resolution: + { + integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, + } + engines: { node: ">=8" } + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: false + + /follow-redirects@1.15.2: + resolution: + { + integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==, + } + engines: { node: ">=4.0" } + peerDependencies: + debug: "*" + peerDependenciesMeta: + debug: + optional: true + dev: false + + /form-data@4.0.0: + resolution: + { + integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, + } + engines: { node: ">= 6" } + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /formdata-polyfill@4.0.10: + resolution: + { + integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==, + } + engines: { node: ">=12.20.0" } + dependencies: + fetch-blob: 3.2.0 + dev: false + + /forwarded@0.2.0: + resolution: + { + integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==, + } + engines: { node: ">= 0.6" } + dev: false + + /fraction.js@4.3.6: + resolution: + { + integrity: sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==, + } + dev: false + + /fresh@0.5.2: + resolution: + { + integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==, + } + engines: { node: ">= 0.6" } + dev: false + + /fs-memo@1.2.0: + resolution: + { + integrity: sha512-YEexkCpL4j03jn5SxaMHqcO6IuWuqm8JFUYhyCep7Ao89JIYmB8xoKhK7zXXJ9cCaNXpyNH5L3QtAmoxjoHW2w==, + } + dev: false + + /fs-minipass@2.1.0: + resolution: + { + integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==, + } + engines: { node: ">= 8" } + dependencies: + minipass: 3.3.6 + dev: false + + /fs.realpath@1.0.0: + resolution: + { + integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, + } + dev: false + + /fsevents@2.3.3: + resolution: + { + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + os: [darwin] + requiresBuild: true + optional: true + + /function-bind@1.1.1: + resolution: + { + integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==, + } + dev: false + + /gauge@3.0.2: + resolution: + { + integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==, + } + engines: { node: ">=10" } + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: false + + /generic-pool@3.9.0: + resolution: + { + integrity: sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==, + } + engines: { node: ">= 4" } + dev: false + + /get-caller-file@2.0.5: + resolution: + { + integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, + } + engines: { node: 6.* || 8.* || >= 10.* } + dev: false + + /get-intrinsic@1.2.1: + resolution: + { + integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==, + } + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-proto: 1.0.1 + has-symbols: 1.0.3 + dev: false + + /get-port-please@2.6.1: + resolution: + { + integrity: sha512-4PDSrL6+cuMM1xs6w36ZIkaKzzE0xzfVBCfebHIJ3FE8iB9oic/ECwPw3iNiD4h1AoJ5XLLBhEviFAVrZsDC5A==, + } + dependencies: + fs-memo: 1.2.0 + dev: false + + /get-port@6.1.2: + resolution: + { + integrity: sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dev: false + + /glob-parent@5.1.2: + resolution: + { + integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, + } + engines: { node: ">= 6" } + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: + { + integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, + } + engines: { node: ">=10.13.0" } + dependencies: + is-glob: 4.0.3 + dev: false + + /glob@7.1.6: + resolution: + { + integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==, + } + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: false + + /glob@7.2.3: + resolution: + { + integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, + } + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: false + + /has-flag@3.0.0: + resolution: + { + integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, + } + engines: { node: ">=4" } + dev: true + + /has-proto@1.0.1: + resolution: + { + integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==, + } + engines: { node: ">= 0.4" } + dev: false + + /has-symbols@1.0.3: + resolution: + { + integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, + } + engines: { node: ">= 0.4" } + dev: false + + /has-unicode@2.0.1: + resolution: + { + integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==, + } + dev: false + + /has@1.0.3: + resolution: + { + integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==, + } + engines: { node: ">= 0.4.0" } + dependencies: + function-bind: 1.1.1 + dev: false + + /helmet@5.1.1: + resolution: + { + integrity: sha512-/yX0oVZBggA9cLJh8aw3PPCfedBnbd7J2aowjzsaWwZh7/UFY0nccn/aHAggIgWUFfnykX8GKd3a1pSbrmlcVQ==, + } + engines: { node: ">=12.0.0" } + dev: false + + /http-errors@2.0.0: + resolution: + { + integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==, + } + engines: { node: ">= 0.8" } + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: false + + /https-proxy-agent@5.0.1: + resolution: + { + integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==, + } + engines: { node: ">= 6" } + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /iconv-lite@0.4.24: + resolution: + { + integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, + } + engines: { node: ">=0.10.0" } + dependencies: + safer-buffer: 2.1.2 + dev: false + + /ieee754@1.2.1: + resolution: + { + integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, + } + dev: false + + /ignore-by-default@1.0.1: + resolution: + { + integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==, + } + dev: true + + /inflight@1.0.6: + resolution: + { + integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, + } + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: false + + /inherits@2.0.4: + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } + dev: false + + /ip@2.0.0: + resolution: + { + integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==, + } + dev: false + + /ipaddr.js@1.9.1: + resolution: + { + integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==, + } + engines: { node: ">= 0.10" } + dev: false + + /is-arrayish@0.3.2: + resolution: + { + integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==, + } + dev: false + + /is-binary-path@2.1.0: + resolution: + { + integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, + } + engines: { node: ">=8" } + dependencies: + binary-extensions: 2.2.0 + + /is-core-module@2.13.0: + resolution: + { + integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==, + } + dependencies: + has: 1.0.3 + dev: false + + /is-extglob@2.1.1: + resolution: + { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + } + engines: { node: ">=0.10.0" } + + /is-fullwidth-code-point@3.0.0: + resolution: + { + integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, + } + engines: { node: ">=8" } + dev: false + + /is-glob@4.0.3: + resolution: + { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + } + engines: { node: ">=0.10.0" } + dependencies: + is-extglob: 2.1.1 + + /is-number@7.0.0: + resolution: + { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + } + engines: { node: ">=0.12.0" } + + /isarray@1.0.0: + resolution: + { + integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, + } + dev: false + + /isexe@2.0.0: + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } + dev: true + + /jiti@1.20.0: + resolution: + { + integrity: sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==, + } + hasBin: true + dev: false + + /jsonpath-plus@7.2.0: + resolution: + { + integrity: sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==, + } + engines: { node: ">=12.0.0" } + dev: false + + /jsonwebtoken@9.0.2: + resolution: + { + integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==, + } + engines: { node: ">=12", npm: ">=6" } + dependencies: + jws: 3.2.2 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 7.5.4 + dev: false + + /just-clone@6.2.0: + resolution: + { + integrity: sha512-1IynUYEc/HAwxhi3WDpIpxJbZpMCvvrrmZVqvj9EhpvbH8lls7HhdhiByjL7DkAaWlLIzpC0Xc/VPvy/UxLNjA==, + } + dev: false + + /jwa@1.4.1: + resolution: + { + integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==, + } + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + dev: false + + /jws@3.2.2: + resolution: + { + integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==, + } + dependencies: + jwa: 1.4.1 + safe-buffer: 5.2.1 + dev: false + + /kareem@2.5.1: + resolution: + { + integrity: sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==, + } + engines: { node: ">=12.0.0" } + dev: false + + /lilconfig@2.1.0: + resolution: + { + integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==, + } + engines: { node: ">=10" } + dev: false + + /lines-and-columns@1.2.4: + resolution: + { + integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, + } + dev: false + + /locate-path@5.0.0: + resolution: + { + integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, + } + engines: { node: ">=8" } + dependencies: + p-locate: 4.1.0 + dev: false + + /lodash.foreach@4.5.0: + resolution: + { + integrity: sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==, + } + dev: false + + /lodash.get@4.4.2: + resolution: + { + integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==, + } + dev: false + + /lodash.includes@4.3.0: + resolution: + { + integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==, + } + dev: false + + /lodash.isboolean@3.0.3: + resolution: + { + integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==, + } + dev: false + + /lodash.isinteger@4.0.4: + resolution: + { + integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==, + } + dev: false + + /lodash.isnumber@3.0.3: + resolution: + { + integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==, + } + dev: false + + /lodash.isplainobject@4.0.6: + resolution: + { + integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==, + } + dev: false + + /lodash.isstring@4.0.1: + resolution: + { + integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==, + } + dev: false + + /lodash.merge@4.6.2: + resolution: + { + integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, + } + dev: false + + /lodash.once@4.1.1: + resolution: + { + integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==, + } + dev: false + + /lru-cache@6.0.0: + resolution: + { + integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, + } + engines: { node: ">=10" } + dependencies: + yallist: 4.0.0 + dev: false + + /make-dir@3.1.0: + resolution: + { + integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==, + } + engines: { node: ">=8" } + dependencies: + semver: 6.3.1 + dev: false + + /media-typer@0.3.0: + resolution: + { + integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==, + } + engines: { node: ">= 0.6" } + dev: false + + /memory-pager@1.5.0: + resolution: + { + integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==, + } + requiresBuild: true + dev: false + optional: true + + /merge-descriptors@1.0.1: + resolution: + { + integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==, + } + dev: false + + /merge2@1.4.1: + resolution: + { + integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, + } + engines: { node: ">= 8" } + dev: false + + /methods@1.1.2: + resolution: + { + integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==, + } + engines: { node: ">= 0.6" } + dev: false + + /micromatch@4.0.5: + resolution: + { + integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, + } + engines: { node: ">=8.6" } + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: false + + /mime-db@1.52.0: + resolution: + { + integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, + } + engines: { node: ">= 0.6" } + dev: false + + /mime-types@2.1.35: + resolution: + { + integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, + } + engines: { node: ">= 0.6" } + dependencies: + mime-db: 1.52.0 + dev: false + + /mime@1.6.0: + resolution: + { + integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==, + } + engines: { node: ">=4" } + hasBin: true + dev: false + + /minimatch@3.1.2: + resolution: + { + integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, + } + dependencies: + brace-expansion: 1.1.11 + + /minimist@1.2.8: + resolution: + { + integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, + } + dev: false + + /minipass@3.3.6: + resolution: + { + integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==, + } + engines: { node: ">=8" } + dependencies: + yallist: 4.0.0 + dev: false + + /minipass@5.0.0: + resolution: + { + integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==, + } + engines: { node: ">=8" } + dev: false + + /minizlib@2.1.2: + resolution: + { + integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==, + } + engines: { node: ">= 8" } + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + dev: false + + /mkdirp@0.5.6: + resolution: + { + integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==, + } + hasBin: true + dependencies: + minimist: 1.2.8 + dev: false + + /mkdirp@1.0.4: + resolution: + { + integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==, + } + engines: { node: ">=10" } + hasBin: true + dev: false + + /mongo-sanitize@1.1.0: + resolution: + { + integrity: sha512-6gB9AiJD+om2eZLxaPKIP5Q8P3Fr+s+17rVWso7hU0+MAzmIvIMlgTYuyvalDLTtE/p0gczcvJ8A3pbN1XmQ/A==, + } + dev: false + + /mongodb-connection-string-url@2.6.0: + resolution: + { + integrity: sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==, + } + dependencies: + "@types/whatwg-url": 8.2.2 + whatwg-url: 11.0.0 + dev: false + + /mongodb@4.17.1: + resolution: + { + integrity: sha512-MBuyYiPUPRTqfH2dV0ya4dcr2E5N52ocBuZ8Sgg/M030nGF78v855B3Z27mZJnp8PxjnUquEnAtjOsphgMZOlQ==, + } + engines: { node: ">=12.9.0" } + dependencies: + bson: 4.7.2 + mongodb-connection-string-url: 2.6.0 + socks: 2.7.1 + optionalDependencies: + "@aws-sdk/credential-providers": 3.409.0 + "@mongodb-js/saslprep": 1.1.0 + transitivePeerDependencies: + - aws-crt + dev: false + + /mongoose-unique-validator@3.1.0(mongoose@6.12.0): + resolution: + { + integrity: sha512-UsBBlFapip8gc8x1h+nLWnkOy+GTy9Z+zmTyZ35icLV3EoLIVz180vJzepfMM9yBy2AJh+maeuoM8CWtqejGUg==, + } + peerDependencies: + mongoose: ^6.0.0 + dependencies: + lodash.foreach: 4.5.0 + lodash.get: 4.4.2 + lodash.merge: 4.6.2 + mongoose: 6.12.0 + dev: false + + /mongoose@6.12.0: + resolution: + { + integrity: sha512-sd/q83C6TBRPBrrD2A/POSbA/exbCFM2WOuY7Lf2JuIJFlHFG39zYSDTTAEiYlzIfahNOLmXPxBGFxdAch41Mw==, + } + engines: { node: ">=12.0.0" } + dependencies: + bson: 4.7.2 + kareem: 2.5.1 + mongodb: 4.17.1 + mpath: 0.9.0 + mquery: 4.0.3 + ms: 2.1.3 + sift: 16.0.1 + transitivePeerDependencies: + - aws-crt + - supports-color + dev: false + + /mpath@0.9.0: + resolution: + { + integrity: sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==, + } + engines: { node: ">=4.0.0" } + dev: false + + /mquery@4.0.3: + resolution: + { + integrity: sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==, + } + engines: { node: ">=12.0.0" } + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /ms@2.0.0: + resolution: + { + integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==, + } + dev: false + + /ms@2.1.2: + resolution: + { + integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, + } + dev: false + + /ms@2.1.3: + resolution: + { + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, + } + + /multer@1.4.5-lts.1: + resolution: + { + integrity: sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==, + } + engines: { node: ">= 6.0.0" } + dependencies: + append-field: 1.0.0 + busboy: 1.6.0 + concat-stream: 1.6.2 + mkdirp: 0.5.6 + object-assign: 4.1.1 + type-is: 1.6.18 + xtend: 4.0.2 + dev: false + + /mz@2.7.0: + resolution: + { + integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==, + } + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: false + + /nanoid@3.3.6: + resolution: + { + integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==, + } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + hasBin: true + dev: false + + /negotiator@0.6.3: + resolution: + { + integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==, + } + engines: { node: ">= 0.6" } + dev: false + + /node-addon-api@5.1.0: + resolution: + { + integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==, + } + dev: false + + /node-domexception@1.0.0: + resolution: + { + integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==, + } + engines: { node: ">=10.5.0" } + dev: false + + /node-fetch@2.7.0: + resolution: + { + integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==, + } + engines: { node: 4.x || >=6.0.0 } + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + + /node-fetch@3.3.2: + resolution: + { + integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + dev: false + + /node-releases@2.0.13: + resolution: + { + integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==, + } + dev: false + + /nodemon@2.0.22: + resolution: + { + integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==, + } + engines: { node: ">=8.10.0" } + hasBin: true + dependencies: + chokidar: 3.5.3 + debug: 3.2.7(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 5.7.2 + simple-update-notifier: 1.1.0 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.5 + dev: true + + /nopt@1.0.10: + resolution: + { + integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==, + } + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /nopt@5.0.0: + resolution: + { + integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==, + } + engines: { node: ">=6" } + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: false + + /normalize-path@3.0.0: + resolution: + { + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, + } + engines: { node: ">=0.10.0" } + + /normalize-range@0.1.2: + resolution: + { + integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==, + } + engines: { node: ">=0.10.0" } + dev: false + + /npmlog@5.0.1: + resolution: + { + integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==, + } + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + dev: false + + /object-assign@4.1.1: + resolution: + { + integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, + } + engines: { node: ">=0.10.0" } + dev: false + + /object-hash@3.0.0: + resolution: + { + integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==, + } + engines: { node: ">= 6" } + dev: false + + /object-inspect@1.12.3: + resolution: + { + integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==, + } + dev: false + + /on-finished@2.4.1: + resolution: + { + integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==, + } + engines: { node: ">= 0.8" } + dependencies: + ee-first: 1.1.1 + dev: false + + /on-headers@1.0.2: + resolution: + { + integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==, + } + engines: { node: ">= 0.8" } + dev: false + + /once@1.4.0: + resolution: + { + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + } + dependencies: + wrappy: 1.0.2 + dev: false + + /p-limit@2.3.0: + resolution: + { + integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, + } + engines: { node: ">=6" } + dependencies: + p-try: 2.2.0 + dev: false + + /p-locate@4.1.0: + resolution: + { + integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, + } + engines: { node: ">=8" } + dependencies: + p-limit: 2.3.0 + dev: false + + /p-try@2.2.0: + resolution: + { + integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, + } + engines: { node: ">=6" } + dev: false + + /parseurl@1.3.3: + resolution: + { + integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==, + } + engines: { node: ">= 0.8" } + dev: false + + /path-exists@4.0.0: + resolution: + { + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, + } + engines: { node: ">=8" } + dev: false + + /path-is-absolute@1.0.1: + resolution: + { + integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, + } + engines: { node: ">=0.10.0" } + dev: false + + /path-key@3.1.1: + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: ">=8" } + dev: true + + /path-parse@1.0.7: + resolution: + { + integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, + } + dev: false + + /path-to-regexp@0.1.7: + resolution: + { + integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==, + } + dev: false + + /picocolors@1.0.0: + resolution: + { + integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, + } + dev: false + + /picomatch@2.3.1: + resolution: + { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + } + engines: { node: ">=8.6" } + + /pify@2.3.0: + resolution: + { + integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==, + } + engines: { node: ">=0.10.0" } + dev: false + + /pirates@4.0.6: + resolution: + { + integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==, + } + engines: { node: ">= 6" } + dev: false + + /png-validator@1.1.0: + resolution: + { + integrity: sha512-MlRLyPI1p3/dJbsjVH+4xOPucycrz8T3EvO0BzCXaNtrUhZkZROtzib9J6mnC81AJO8eBIwiDZwTFel2cMmSuQ==, + } + dev: false + + /pngjs@5.0.0: + resolution: + { + integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==, + } + engines: { node: ">=10.13.0" } + dev: false + + /postcss-import@15.1.0(postcss@8.4.29): + resolution: + { + integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==, + } + engines: { node: ">=14.0.0" } + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.29 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.4 + dev: false + + /postcss-js@4.0.1(postcss@8.4.29): + resolution: + { + integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==, + } + engines: { node: ^12 || ^14 || >= 16 } + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.29 + dev: false + + /postcss-load-config@4.0.1(postcss@8.4.29): + resolution: + { + integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==, + } + engines: { node: ">= 14" } + peerDependencies: + postcss: ">=8.0.9" + ts-node: ">=9.0.0" + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 2.1.0 + postcss: 8.4.29 + yaml: 2.3.2 + dev: false + + /postcss-nested@6.0.1(postcss@8.4.29): + resolution: + { + integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==, + } + engines: { node: ">=12.0" } + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.29 + postcss-selector-parser: 6.0.13 + dev: false + + /postcss-selector-parser@6.0.13: + resolution: + { + integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==, + } + engines: { node: ">=4" } + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: false + + /postcss-value-parser@4.2.0: + resolution: + { + integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==, + } + dev: false + + /postcss@8.4.29: + resolution: + { + integrity: sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==, + } + engines: { node: ^10 || ^12 || >=14 } + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: false + + /prettier@3.0.3: + resolution: + { + integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==, + } + engines: { node: ">=14" } + hasBin: true + dev: true + + /process-nextick-args@2.0.1: + resolution: + { + integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, + } + dev: false + + /prom-client@14.2.0: + resolution: + { + integrity: sha512-sF308EhTenb/pDRPakm+WgiN+VdM/T1RaHj1x+MvAuT8UiQP8JmOEbxVqtkbfR4LrvOg5n7ic01kRBDGXjYikA==, + } + engines: { node: ">=10" } + dependencies: + tdigest: 0.1.2 + dev: false + + /proxy-addr@2.0.7: + resolution: + { + integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==, + } + engines: { node: ">= 0.10" } + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + dev: false + + /pstree.remy@1.1.8: + resolution: + { + integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==, + } + dev: true + + /punycode@2.3.0: + resolution: + { + integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==, + } + engines: { node: ">=6" } + dev: false + + /qrcode@1.5.3: + resolution: + { + integrity: sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==, + } + engines: { node: ">=10.13.0" } + hasBin: true + dependencies: + dijkstrajs: 1.0.3 + encode-utf8: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + dev: false + + /qs@6.11.0: + resolution: + { + integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==, + } + engines: { node: ">=0.6" } + dependencies: + side-channel: 1.0.4 + dev: false + + /queue-microtask@1.2.3: + resolution: + { + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, + } + dev: false + + /random-bytes@1.0.0: + resolution: + { + integrity: sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==, + } + engines: { node: ">= 0.8" } + dev: false + + /range-parser@1.2.1: + resolution: + { + integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==, + } + engines: { node: ">= 0.6" } + dev: false + + /raw-body@2.5.1: + resolution: + { + integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==, + } + engines: { node: ">= 0.8" } + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: false + + /raw-body@2.5.2: + resolution: + { + integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==, + } + engines: { node: ">= 0.8" } + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: false + + /read-cache@1.0.0: + resolution: + { + integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==, + } + dependencies: + pify: 2.3.0 + dev: false + + /readable-stream@2.3.8: + resolution: + { + integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, + } + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: false + + /readable-stream@3.6.2: + resolution: + { + integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, + } + engines: { node: ">= 6" } + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /readdirp@3.6.0: + resolution: + { + integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, + } + engines: { node: ">=8.10.0" } + dependencies: + picomatch: 2.3.1 + + /redis-om@0.4.2: + resolution: + { + integrity: sha512-sBah+ljGQY4Zm1f9/+l7HjtIuTQH/rzIX3JSLizymbr6VlTZ2ibt+U3xYKNjIA0tv/D9toEMF7HFXHMtT+l+1A==, + } + engines: { node: ">= 14" } + dependencies: + jsonpath-plus: 7.2.0 + just-clone: 6.2.0 + redis: 4.6.8 + ulid: 2.3.0 + dev: false + + /redis@4.6.8: + resolution: + { + integrity: sha512-S7qNkPUYrsofQ0ztWlTHSaK0Qqfl1y+WMIxrzeAGNG+9iUZB4HGeBgkHxE6uJJ6iXrkvLd1RVJ2nvu6H1sAzfQ==, + } + dependencies: + "@redis/bloom": 1.2.0(@redis/client@1.5.9) + "@redis/client": 1.5.9 + "@redis/graph": 1.1.0(@redis/client@1.5.9) + "@redis/json": 1.0.4(@redis/client@1.5.9) + "@redis/search": 1.1.3(@redis/client@1.5.9) + "@redis/time-series": 1.0.5(@redis/client@1.5.9) + dev: false + + /req-flash@0.0.3: + resolution: + { + integrity: sha512-c5ouPRJ6OVc4ecL5cgdwd51nYOFQiOTfl7UWk+VlgUHgfsh7TMRFPN/OJ5ETnOYFyswprT8C2a6ctMvJgms9ng==, + } + dev: false + + /require-directory@2.1.1: + resolution: + { + integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, + } + engines: { node: ">=0.10.0" } + dev: false + + /require-main-filename@2.0.0: + resolution: + { + integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==, + } + dev: false + + /resolve@1.22.4: + resolution: + { + integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==, + } + hasBin: true + dependencies: + is-core-module: 2.13.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: false + + /reusify@1.0.4: + resolution: + { + integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, + } + engines: { iojs: ">=1.0.0", node: ">=0.10.0" } + dev: false + + /rimraf@3.0.2: + resolution: + { + integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, + } + hasBin: true + dependencies: + glob: 7.2.3 + dev: false + + /run-parallel@1.2.0: + resolution: + { + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, + } + dependencies: + queue-microtask: 1.2.3 + dev: false + + /safe-buffer@5.1.2: + resolution: + { + integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, + } + dev: false + + /safe-buffer@5.2.1: + resolution: + { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + } + dev: false + + /safer-buffer@2.1.2: + resolution: + { + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, + } + dev: false + + /sax@1.2.4: + resolution: + { + integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==, + } + dev: false + + /semver@5.7.2: + resolution: + { + integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==, + } + hasBin: true + dev: true + + /semver@6.3.1: + resolution: + { + integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, + } + hasBin: true + dev: false + + /semver@7.0.0: + resolution: + { + integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==, + } + hasBin: true + dev: true + + /semver@7.5.4: + resolution: + { + integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==, + } + engines: { node: ">=10" } + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: false + + /send@0.18.0: + resolution: + { + integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==, + } + engines: { node: ">= 0.8.0" } + 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 + transitivePeerDependencies: + - supports-color + dev: false + + /serve-static@1.15.0: + resolution: + { + integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==, + } + engines: { node: ">= 0.8.0" } + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + dev: false + + /set-blocking@2.0.0: + resolution: + { + integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==, + } + dev: false + + /setprototypeof@1.2.0: + resolution: + { + integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==, + } + dev: false + + /shebang-command@2.0.0: + resolution: + { + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, + } + engines: { node: ">=8" } + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: + { + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + } + engines: { node: ">=8" } + dev: true + + /side-channel@1.0.4: + resolution: + { + integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==, + } + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + object-inspect: 1.12.3 + dev: false + + /sift@16.0.1: + resolution: + { + integrity: sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==, + } + dev: false + + /signal-exit@3.0.7: + resolution: + { + integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, + } + dev: false + + /simple-swizzle@0.2.2: + resolution: + { + integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==, + } + dependencies: + is-arrayish: 0.3.2 + dev: false + + /simple-update-notifier@1.1.0: + resolution: + { + integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==, + } + engines: { node: ">=8.10.0" } + dependencies: + semver: 7.0.0 + dev: true + + /smart-buffer@4.2.0: + resolution: + { + integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==, + } + engines: { node: ">= 6.0.0", npm: ">= 3.0.0" } + dev: false + + /socks@2.7.1: + resolution: + { + integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==, + } + engines: { node: ">= 10.13.0", npm: ">= 3.0.0" } + dependencies: + ip: 2.0.0 + smart-buffer: 4.2.0 + dev: false + + /source-map-js@1.0.2: + resolution: + { + integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==, + } + engines: { node: ">=0.10.0" } + dev: false + + /sparse-bitfield@3.0.3: + resolution: + { + integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==, + } + requiresBuild: true + dependencies: + memory-pager: 1.5.0 + dev: false + optional: true + + /speakeasy@2.0.0: + resolution: + { + integrity: sha512-lW2A2s5LKi8rwu77ewisuUOtlCydF/hmQSOJjpTqTj1gZLkNgTaYnyvfxy2WBr4T/h+9c4g8HIITfj83OkFQFw==, + } + engines: { node: ">= 0.10.0" } + dependencies: + base32.js: 0.0.1 + dev: false + + /statuses@2.0.1: + resolution: + { + integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==, + } + engines: { node: ">= 0.8" } + dev: false + + /streamsearch@1.1.0: + resolution: + { + integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==, + } + engines: { node: ">=10.0.0" } + dev: false + + /string-width@4.2.3: + resolution: + { + integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, + } + engines: { node: ">=8" } + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: false + + /string_decoder@1.1.1: + resolution: + { + integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, + } + dependencies: + safe-buffer: 5.1.2 + dev: false + + /string_decoder@1.3.0: + resolution: + { + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, + } + dependencies: + safe-buffer: 5.2.1 + dev: false + + /strip-ansi@6.0.1: + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: ">=8" } + dependencies: + ansi-regex: 5.0.1 + dev: false + + /strnum@1.0.5: + resolution: + { + integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==, + } + requiresBuild: true + dev: false + optional: true + + /sucrase@3.34.0: + resolution: + { + integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==, + } + engines: { node: ">=8" } + hasBin: true + dependencies: + "@jridgewell/gen-mapping": 0.3.3 + commander: 4.1.1 + glob: 7.1.6 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + dev: false + + /supports-color@5.5.0: + resolution: + { + integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, + } + engines: { node: ">=4" } + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: + { + integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, + } + engines: { node: ">= 0.4" } + dev: false + + /tailwindcss@3.3.3: + resolution: + { + integrity: sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==, + } + engines: { node: ">=14.0.0" } + hasBin: true + dependencies: + "@alloc/quick-lru": 5.2.0 + arg: 5.0.2 + chokidar: 3.5.3 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.1 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.20.0 + lilconfig: 2.1.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.29 + postcss-import: 15.1.0(postcss@8.4.29) + postcss-js: 4.0.1(postcss@8.4.29) + postcss-load-config: 4.0.1(postcss@8.4.29) + postcss-nested: 6.0.1(postcss@8.4.29) + postcss-selector-parser: 6.0.13 + resolve: 1.22.4 + sucrase: 3.34.0 + transitivePeerDependencies: + - ts-node + dev: false + + /tar@6.2.0: + resolution: + { + integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==, + } + engines: { node: ">=10" } + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: false + + /tdigest@0.1.2: + resolution: + { + integrity: sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==, + } + dependencies: + bintrees: 1.0.2 + dev: false + + /thenify-all@1.6.0: + resolution: + { + integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==, + } + engines: { node: ">=0.8" } + dependencies: + thenify: 3.3.1 + dev: false + + /thenify@3.3.1: + resolution: + { + integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==, + } + dependencies: + any-promise: 1.3.0 + dev: false + + /to-regex-range@5.0.1: + resolution: + { + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + } + engines: { node: ">=8.0" } + dependencies: + is-number: 7.0.0 + + /toidentifier@1.0.1: + resolution: + { + integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==, + } + engines: { node: ">=0.6" } + dev: false + + /touch@3.1.0: + resolution: + { + integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==, + } + hasBin: true + dependencies: + nopt: 1.0.10 + dev: true + + /tr46@0.0.3: + resolution: + { + integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, + } + dev: false + + /tr46@3.0.0: + resolution: + { + integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==, + } + engines: { node: ">=12" } + dependencies: + punycode: 2.3.0 + dev: false + + /ts-interface-checker@0.1.13: + resolution: + { + integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==, + } + dev: false + + /tslib@1.14.1: + resolution: + { + integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==, + } + requiresBuild: true + dev: false + optional: true + + /tslib@2.6.2: + resolution: + { + integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, + } + requiresBuild: true + dev: false + optional: true + + /type-is@1.6.18: + resolution: + { + integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==, + } + engines: { node: ">= 0.6" } + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: false + + /typedarray@0.0.6: + resolution: + { + integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==, + } + dev: false + + /uid-safe@2.1.5: + resolution: + { + integrity: sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==, + } + engines: { node: ">= 0.8" } + dependencies: + random-bytes: 1.0.0 + dev: false + + /ulid@2.3.0: + resolution: + { + integrity: sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw==, + } + hasBin: true + dev: false + + /undefsafe@2.0.5: + resolution: + { + integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==, + } + dev: true + + /unpipe@1.0.0: + resolution: + { + integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==, + } + engines: { node: ">= 0.8" } + dev: false + + /update-browserslist-db@1.0.11(browserslist@4.21.10): + resolution: + { + integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==, + } + hasBin: true + peerDependencies: + browserslist: ">= 4.21.0" + dependencies: + browserslist: 4.21.10 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: false + + /url-value-parser@2.2.0: + resolution: + { + integrity: sha512-yIQdxJpgkPamPPAPuGdS7Q548rLhny42tg8d4vyTNzFqvOnwqrgHXvgehT09U7fwrzxi3RxCiXjoNUNnNOlQ8A==, + } + engines: { node: ">=6.0.0" } + dev: false + + /util-deprecate@1.0.2: + resolution: + { + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, + } + dev: false + + /utils-merge@1.0.1: + resolution: + { + integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==, + } + engines: { node: ">= 0.4.0" } + dev: false + + /uuid@8.3.2: + resolution: + { + integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==, + } + hasBin: true + requiresBuild: true + dev: false + optional: true + + /vary@1.1.2: + resolution: + { + integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==, + } + engines: { node: ">= 0.8" } + dev: false + + /web-streams-polyfill@3.2.1: + resolution: + { + integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==, + } + engines: { node: ">= 8" } + dev: false + + /webidl-conversions@3.0.1: + resolution: + { + integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, + } + dev: false + + /webidl-conversions@7.0.0: + resolution: + { + integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==, + } + engines: { node: ">=12" } + dev: false + + /whatwg-url@11.0.0: + resolution: + { + integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==, + } + engines: { node: ">=12" } + dependencies: + tr46: 3.0.0 + webidl-conversions: 7.0.0 + dev: false + + /whatwg-url@5.0.0: + resolution: + { + integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, + } + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: false + + /which-module@2.0.1: + resolution: + { + integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==, + } + dev: false + + /which@2.0.2: + resolution: + { + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, + } + engines: { node: ">= 8" } + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /wide-align@1.1.5: + resolution: + { + integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==, + } + dependencies: + string-width: 4.2.3 + dev: false + + /wrap-ansi@6.2.0: + resolution: + { + integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==, + } + engines: { node: ">=8" } + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + + /wrappy@1.0.2: + resolution: + { + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, + } + dev: false + + /xml-js@1.6.11: + resolution: + { + integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==, + } + hasBin: true + dependencies: + sax: 1.2.4 + dev: false + + /xss@1.0.14: + resolution: + { + integrity: sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw==, + } + engines: { node: ">= 0.10.0" } + hasBin: true + dependencies: + commander: 2.20.3 + cssfilter: 0.0.10 + dev: false + + /xtend@4.0.2: + resolution: + { + integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==, + } + engines: { node: ">=0.4" } + dev: false + + /y18n@4.0.3: + resolution: + { + integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==, + } + dev: false + + /yallist@4.0.0: + resolution: + { + integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, + } + dev: false + + /yaml@2.3.2: + resolution: + { + integrity: sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==, + } + engines: { node: ">= 14" } + dev: false + + /yargs-parser@18.1.3: + resolution: + { + integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==, + } + engines: { node: ">=6" } + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + dev: false + + /yargs@15.4.1: + resolution: + { + integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==, + } + engines: { node: ">=8" } + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + dev: false diff --git a/Back/rcctalk.js b/Back/rcctalk.js index b6dd4b1..d3b524d 100644 --- a/Back/rcctalk.js +++ b/Back/rcctalk.js @@ -1,320 +1,373 @@ -const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args)); -let controller = new AbortController(); -require('dotenv').config() +const fetch = (...args) => + import("node-fetch").then(({ default: fetch }) => fetch(...args)) +let controller = new AbortController() +require("dotenv").config() const RCC_HOST = process.env.RCC_HOST - const url = 'http://'+RCC_HOST+':64989'; // change this to rcc soap +const url = "http://" + RCC_HOST + ":64989" // change this to rcc soap -var convert = require('xml-js'); +var convert = require("xml-js") const sampleHeaders = { - 'Content-Type': 'text/xml;charset=UTF-8', -}; - - - -async function OpenJob(jobid,script,expiration){ - return new Promise(async (resolve, reject) => { - // this is all boilerplate because soap sucks -var xml = { - _declaration: { _attributes: { version: '1.0', encoding: 'UTF-8' } }, - 'SOAP-ENV:Envelope': { - _attributes: { - 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', - 'xmlns:ns1': 'http://roblox.com/' - }, - 'SOAP-ENV:Body': { - 'ns1:OpenJobEx': { - 'ns1:job': { - 'ns1:id': { _text: 'StringTest11' }, - 'ns1:expirationInSeconds': { _text: '10' }, - 'ns1:category': { _text: '0' }, - 'ns1:cores': { _text: '1' } - }, - 'ns1:script': { - 'ns1:name': { _text: 'StringTest11-Script' }, - 'ns1:script': { - _text: 'print("Recieved job with ID " .. game.JobId)\r\n' - }, - 'ns1:arguments': {} - } - } - } - } - } -xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:OpenJobEx']['ns1:job']['ns1:id']._text = jobid -xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:OpenJobEx']['ns1:job']['ns1:expirationInSeconds']._text = expiration -if (!expiration) { - xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:OpenJobEx']['ns1:job']['ns1:expirationInSeconds']._text = "60" + "Content-Type": "text/xml;charset=UTF-8", } -xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:OpenJobEx']['ns1:script']['ns1:script']._text = script -const body = convert.js2xml(xml, { compact: true, spaces: 4 }) - - try { - const result = await fetch(url, { method: 'POST', body }) - const data = await result.text() - const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) - return resolve( - convertedData - ) - } catch (error) { - return reject(error) - } - }) + +async function OpenJob(jobid, script, expiration) { + return new Promise(async (resolve, reject) => { + // this is all boilerplate because soap sucks + var xml = { + _declaration: { + _attributes: { version: "1.0", encoding: "UTF-8" }, + }, + "SOAP-ENV:Envelope": { + _attributes: { + "xmlns:SOAP-ENV": + "http://schemas.xmlsoap.org/soap/envelope/", + "xmlns:ns1": "http://roblox.com/", + }, + "SOAP-ENV:Body": { + "ns1:OpenJobEx": { + "ns1:job": { + "ns1:id": { _text: "StringTest11" }, + "ns1:expirationInSeconds": { _text: "10" }, + "ns1:category": { _text: "0" }, + "ns1:cores": { _text: "1" }, + }, + "ns1:script": { + "ns1:name": { _text: "StringTest11-Script" }, + "ns1:script": { + _text: 'print("Recieved job with ID " .. game.JobId)\r\n', + }, + "ns1:arguments": {}, + }, + }, + }, + }, + } + xml["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:OpenJobEx"]["ns1:job"][ + "ns1:id" + ]._text = jobid + xml["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:OpenJobEx"]["ns1:job"][ + "ns1:expirationInSeconds" + ]._text = expiration + if (!expiration) { + xml["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:OpenJobEx"][ + "ns1:job" + ]["ns1:expirationInSeconds"]._text = "60" + } + xml["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:OpenJobEx"][ + "ns1:script" + ]["ns1:script"]._text = script + const body = convert.js2xml(xml, { compact: true, spaces: 4 }) + + try { + const result = await fetch(url, { method: "POST", body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { + compact: true, + spaces: 4, + }) + return resolve(convertedData) + } catch (error) { + return reject(error) + } + }) } async function GetAllJobs() { - return new Promise(async (resolve, reject) => { - const xmlData = (xml = { - _declaration: { - _attributes: { version: '1.0', encoding: 'UTF - 8' }, - }, - 'SOAP-ENV:Envelope': { - _attributes: { - 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', - 'xmlns:SOAP-ENC': 'http://schemas.xmlsoap.org/soap/encoding/', - 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance', - 'xmlns:xsd': 'http://www.w3.org/2001/XMLSchema', - 'xmlns:ns2': 'http://roblox.com/RCCServiceSoap', - 'xmlns:ns1': 'http://roblox.com/', - 'xmlns:ns3': 'http://roblox.com/RCCServiceSoap12', - }, - 'SOAP-ENV:Body': { 'ns1:GetAllJobsEx': {} }, - }, - }) - - const body = convert.js2xml(xmlData, { compact: true, spaces: 4 }) - - try { - const result = await fetch(url, { method: 'POST', body }) - const data = await result.text() - const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) - return resolve( - convertedData['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:GetAllJobsExResponse']['ns1:GetAllJobsExResult'] - ) - } catch (error) { - return reject(error) - } - }) + return new Promise(async (resolve, reject) => { + const xmlData = (xml = { + _declaration: { + _attributes: { version: "1.0", encoding: "UTF - 8" }, + }, + "SOAP-ENV:Envelope": { + _attributes: { + "xmlns:SOAP-ENV": + "http://schemas.xmlsoap.org/soap/envelope/", + "xmlns:SOAP-ENC": + "http://schemas.xmlsoap.org/soap/encoding/", + "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", + "xmlns:xsd": "http://www.w3.org/2001/XMLSchema", + "xmlns:ns2": "http://roblox.com/RCCServiceSoap", + "xmlns:ns1": "http://roblox.com/", + "xmlns:ns3": "http://roblox.com/RCCServiceSoap12", + }, + "SOAP-ENV:Body": { "ns1:GetAllJobsEx": {} }, + }, + }) + + const body = convert.js2xml(xmlData, { compact: true, spaces: 4 }) + + try { + const result = await fetch(url, { method: "POST", body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { + compact: true, + spaces: 4, + }) + return resolve( + convertedData["SOAP-ENV:Envelope"]["SOAP-ENV:Body"][ + "ns1:GetAllJobsExResponse" + ]["ns1:GetAllJobsExResult"], + ) + } catch (error) { + return reject(error) + } + }) } +async function Execute(jobid, script) { + return new Promise(async (resolve, reject) => { + var xml = { + _declaration: { + _attributes: { version: "1.0", encoding: "UTF - 8" }, + }, + "SOAP-ENV:Envelope": { + _attributes: { + "xmlns:SOAP-ENV": + "http://schemas.xmlsoap.org/soap/envelope/", + "xmlns:SOAP-ENC": + "http://schemas.xmlsoap.org/soap/encoding/", + "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", + "xmlns:xsd": "http://www.w3.org/2001/XMLSchema", + "xmlns:ns2": "http://roblox.com/RCCServiceSoap", + "xmlns:ns1": "http://roblox.com/", + "xmlns:ns3": "http://roblox.com/RCCServiceSoap12", + }, + "SOAP-ENV:Body": { + "ns1:ExecuteEx": { + "ns1:jobID": { _text: "Test" }, + "ns1:script": { + "ns1:name": { _text: "Script" }, + "ns1:script": { _text: 'print("no")' }, + "ns1:arguments": { _text: "" }, + }, + }, + }, + }, + } + xml["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:ExecuteEx"][ + "ns1:jobID" + ]._text = jobid + xml["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:ExecuteEx"][ + "ns1:script" + ]["ns1:script"]._text = script + const body = convert.js2xml(xml, { compact: true, spaces: 4 }) - -async function Execute(jobid,script) { - return new Promise(async (resolve, reject) => { - var xml = { - _declaration: { _attributes: { version: '1.0', encoding: 'UTF - 8' } }, - 'SOAP-ENV:Envelope': { - _attributes: { - 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', - 'xmlns:SOAP-ENC': 'http://schemas.xmlsoap.org/soap/encoding/', - 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance', - 'xmlns:xsd': 'http://www.w3.org/2001/XMLSchema', - 'xmlns:ns2': 'http://roblox.com/RCCServiceSoap', - 'xmlns:ns1': 'http://roblox.com/', - 'xmlns:ns3': 'http://roblox.com/RCCServiceSoap12' - }, - 'SOAP-ENV:Body': { - 'ns1:ExecuteEx': { - 'ns1:jobID': { _text: 'Test' }, - 'ns1:script': { - 'ns1:name': { _text: 'Script' }, - 'ns1:script': { _text: 'print("no")' }, - 'ns1:arguments': { _text: '' } - } - } - } - } - } -xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:ExecuteEx']['ns1:jobID']._text = jobid -xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:ExecuteEx']['ns1:script']['ns1:script']._text = script - const body = convert.js2xml(xml, { compact: true, spaces: 4 }) - - try { - const result = await fetch(url, { method: 'POST', body }) - const data = await result.text() - const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) - return resolve( - convertedData - ) - } catch (error) { - return reject(error) - } - }) - + try { + const result = await fetch(url, { method: "POST", body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { + compact: true, + spaces: 4, + }) + return resolve(convertedData) + } catch (error) { + return reject(error) + } + }) } async function CloseJob(jobid) { - return new Promise(async (resolve, reject) => { - var xml = { - _declaration: { _attributes: { version: '1.0', encoding: 'UTF - 8' } }, - 'SOAP-ENV:Envelope': { - _attributes: { - 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', - 'xmlns:SOAP-ENC': 'http://schemas.xmlsoap.org/soap/encoding/', - 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance', - 'xmlns:xsd': 'http://www.w3.org/2001/XMLSchema', - 'xmlns:ns2': 'http://roblox.com/RCCServiceSoap', - 'xmlns:ns1': 'http://roblox.com/', - 'xmlns:ns3': 'http://roblox.com/RCCServiceSoap12' - }, - 'SOAP-ENV:Body': { - 'ns1:CloseJob': { - 'ns1:jobID': { _text: 'Test' } - } - } - } - } - xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:CloseJob']['ns1:jobID']._text = jobid - const body = convert.js2xml(xml, { compact: true, spaces: 4 }) - - try { - const result = await fetch(url, { method: 'POST', body }) - const data = await result.text() - const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) - return resolve( - convertedData - ) - } catch (error) { - return reject(error) - } - }) + return new Promise(async (resolve, reject) => { + var xml = { + _declaration: { + _attributes: { version: "1.0", encoding: "UTF - 8" }, + }, + "SOAP-ENV:Envelope": { + _attributes: { + "xmlns:SOAP-ENV": + "http://schemas.xmlsoap.org/soap/envelope/", + "xmlns:SOAP-ENC": + "http://schemas.xmlsoap.org/soap/encoding/", + "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", + "xmlns:xsd": "http://www.w3.org/2001/XMLSchema", + "xmlns:ns2": "http://roblox.com/RCCServiceSoap", + "xmlns:ns1": "http://roblox.com/", + "xmlns:ns3": "http://roblox.com/RCCServiceSoap12", + }, + "SOAP-ENV:Body": { + "ns1:CloseJob": { + "ns1:jobID": { _text: "Test" }, + }, + }, + }, + } + xml["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:CloseJob"][ + "ns1:jobID" + ]._text = jobid + const body = convert.js2xml(xml, { compact: true, spaces: 4 }) + + try { + const result = await fetch(url, { method: "POST", body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { + compact: true, + spaces: 4, + }) + return resolve(convertedData) + } catch (error) { + return reject(error) + } + }) } +async function RenewLease(jobid, expiration) { + return new Promise(async (resolve, reject) => { + var xml = { + _declaration: { + _attributes: { version: "1.0", encoding: "UTF-8" }, + }, + "SOAP-ENV:Envelope": { + _attributes: { + "xmlns:SOAP-ENV": + "http://schemas.xmlsoap.org/soap/envelope/", + "xmlns:ns1": "http://roblox.com/", + "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", + }, + "SOAP-ENV:Body": { + "ns1:RenewLease": { + "ns1:jobID": { + _attributes: { "xsi:type": "ns1:Job" }, + "ns1:id": { _text: "StringTest11" }, + "ns1:expirationInSeconds": { _text: "10" }, + "ns1:category": { _text: "0" }, + "ns1:cores": { _text: "1" }, + }, + "ns1:expirationInSeconds": { _text: "100" }, + }, + }, + }, + } + xml["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:RenewLease"][ + "ns1:jobID" + ]["ns1:id"]._text = jobid + xml["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:RenewLease"][ + "ns1:expirationInSeconds" + ]._text = expiration + const body = convert.js2xml(xml, { compact: true, spaces: 4 }) -async function RenewLease(jobid,expiration) { - return new Promise(async (resolve, reject) => { - var xml = { - _declaration: { _attributes: { version: '1.0', encoding: 'UTF-8' } }, - 'SOAP-ENV:Envelope': { - _attributes: { - 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', - 'xmlns:ns1': 'http://roblox.com/', - 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance' - }, - 'SOAP-ENV:Body': { - 'ns1:RenewLease': { - 'ns1:jobID': { - _attributes: { 'xsi:type': 'ns1:Job' }, - 'ns1:id': { _text: 'StringTest11' }, - 'ns1:expirationInSeconds': { _text: '10' }, - 'ns1:category': { _text: '0' }, - 'ns1:cores': { _text: '1' } - }, - 'ns1:expirationInSeconds': { _text: '100' } - } - } - } - } - xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:RenewLease']['ns1:jobID']['ns1:id']._text = jobid - xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:RenewLease']['ns1:expirationInSeconds']._text = expiration - const body = convert.js2xml(xml, { compact: true, spaces: 4 }) - - try { - const result = await fetch(url, { method: 'POST', body }) - const data = await result.text() - const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) - return resolve( - convertedData - ) - } catch (error) { - return reject(error) - } - }) + try { + const result = await fetch(url, { method: "POST", body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { + compact: true, + spaces: 4, + }) + return resolve(convertedData) + } catch (error) { + return reject(error) + } + }) } -async function GetExpiration(jobid){ - return new Promise(async (resolve, reject) => { - var xml = { - _declaration: { _attributes: { version: '1.0', encoding: 'UTF-8' } }, - 'SOAP-ENV:Envelope': { - _attributes: { - 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', - 'xmlns:ns1': 'http://roblox.com/' - }, - 'SOAP-ENV:Body': { 'ns1:GetExpiration': { 'ns1:jobID': { _text: 'Test' } } } - } - } - xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:GetExpiration']['ns1:jobID']._text = jobid - const body = convert.js2xml(xml, { compact: true, spaces: 4 }) - - try { - const result = await fetch(url, { method: 'POST', body }) - const data = await result.text() - const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) - return resolve( - convertedData - ) - } catch (error) { - return reject(error) - } - }) +async function GetExpiration(jobid) { + return new Promise(async (resolve, reject) => { + var xml = { + _declaration: { + _attributes: { version: "1.0", encoding: "UTF-8" }, + }, + "SOAP-ENV:Envelope": { + _attributes: { + "xmlns:SOAP-ENV": + "http://schemas.xmlsoap.org/soap/envelope/", + "xmlns:ns1": "http://roblox.com/", + }, + "SOAP-ENV:Body": { + "ns1:GetExpiration": { "ns1:jobID": { _text: "Test" } }, + }, + }, + } + xml["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:GetExpiration"][ + "ns1:jobID" + ]._text = jobid + const body = convert.js2xml(xml, { compact: true, spaces: 4 }) + + try { + const result = await fetch(url, { method: "POST", body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { + compact: true, + spaces: 4, + }) + return resolve(convertedData) + } catch (error) { + return reject(error) + } + }) } //var gameservertxt = fs.readFileSync('actualgameserver.txt','utf-8') //gameservertxt = gameservertxt.replace('function start(placeId, port, url)','function start(1111, port)') -async function CloseExpiredJobs(){ - return new Promise(async (resolve, reject) => { - var xml = xml = { - _declaration: { _attributes: { version: '1.0', encoding: 'UTF-8' } }, - 'SOAP-ENV:Envelope': { - _attributes: { - 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', - 'xmlns:ns1': 'http://roblox.com/' - }, - 'SOAP-ENV:Body': { 'ns1:CloseExpiredJobs': {} } - } - } - - const body = convert.js2xml(xml, { compact: true, spaces: 4 }) - - try { - const result = await fetch(url, { method: 'POST', body }) - const data = await result.text() - const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) - return resolve( - convertedData - ) - } catch (error) { - return reject(error) - } - }) +async function CloseExpiredJobs() { + return new Promise(async (resolve, reject) => { + var xml = (xml = { + _declaration: { + _attributes: { version: "1.0", encoding: "UTF-8" }, + }, + "SOAP-ENV:Envelope": { + _attributes: { + "xmlns:SOAP-ENV": + "http://schemas.xmlsoap.org/soap/envelope/", + "xmlns:ns1": "http://roblox.com/", + }, + "SOAP-ENV:Body": { "ns1:CloseExpiredJobs": {} }, + }, + }) + + const body = convert.js2xml(xml, { compact: true, spaces: 4 }) + + try { + const result = await fetch(url, { method: "POST", body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { + compact: true, + spaces: 4, + }) + return resolve(convertedData) + } catch (error) { + return reject(error) + } + }) } -async function CloseAllJobs(){ - return new Promise(async (resolve, reject) => { - var xml = xml = { - _declaration: { _attributes: { version: '1.0', encoding: 'UTF-8' } }, - 'SOAP-ENV:Envelope': { - _attributes: { - 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', - 'xmlns:ns1': 'http://roblox.com/' - }, - 'SOAP-ENV:Body': { 'ns1:CloseAllJobs': {} } - } - } - - const body = convert.js2xml(xml, { compact: true, spaces: 4 }) - - try { - const result = await fetch(url, { method: 'POST', body }) - const data = await result.text() - const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) - return resolve( - convertedData - ) - } catch (error) { - return reject(error) - } - }) +async function CloseAllJobs() { + return new Promise(async (resolve, reject) => { + var xml = (xml = { + _declaration: { + _attributes: { version: "1.0", encoding: "UTF-8" }, + }, + "SOAP-ENV:Envelope": { + _attributes: { + "xmlns:SOAP-ENV": + "http://schemas.xmlsoap.org/soap/envelope/", + "xmlns:ns1": "http://roblox.com/", + }, + "SOAP-ENV:Body": { "ns1:CloseAllJobs": {} }, + }, + }) + + const body = convert.js2xml(xml, { compact: true, spaces: 4 }) + + try { + const result = await fetch(url, { method: "POST", body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { + compact: true, + spaces: 4, + }) + return resolve(convertedData) + } catch (error) { + return reject(error) + } + }) } - -module.exports = {OpenJob, GetAllJobs,Execute,CloseJob,RenewLease,GetExpiration,CloseExpiredJobs,CloseAllJobs} - - - - - - - - - +module.exports = { + OpenJob, + GetAllJobs, + Execute, + CloseJob, + RenewLease, + GetExpiration, + CloseExpiredJobs, + CloseAllJobs, +} diff --git a/Back/rcctalk2018.js b/Back/rcctalk2018.js index 1c5ef18..f5c0ed0 100644 --- a/Back/rcctalk2018.js +++ b/Back/rcctalk2018.js @@ -1,24 +1,51 @@ -const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args)); -let controller = new AbortController(); -require('dotenv').config() +const fetch = (...args) => + import("node-fetch").then(({ default: fetch }) => fetch(...args)) +let controller = new AbortController() +require("dotenv").config() const RCC_HOST = process.env.RCC_HOST -var convert = require('xml-js'); +var convert = require("xml-js") - let url = 'http://'+RCC_HOST+':8000'; // change this to rcc soap +let url = "http://" + RCC_HOST + ":8000" // change this to rcc soap -async function OpenGame(jobid,port,ip,placeid,creatorid){ - return new Promise(async (resolve, reject) => { - let json = {"Mode":"GameServer","GameId":"game1","Settings":{"IsRobloxPlace":false,"PlaceId":1,"CreatorId":1,"GameId":"00000000-0000-0000-0000-000000000132","GsmInterval":50,"MaxPlayers":100,"MaxGameInstances":52,"ApiKey":"egg","GameCode":"AAAAAAAAAAAAAA-a","PreferredPlayerCapacity":10,"DatacenterId":1,"PlaceVisitAccessKey":"rbx_evt_ftp","UniverseId":13058,"PlaceFetchUrl":"https://mete0r.xyz/asset?id=11","MatchmakingContextId":1,"CreatorType":"User","PlaceVersion":123,"BaseUrl":"mete0r.xyz","MachineAddress":"localhost","JobId":"game1","PreferredPort":53640}} - json.GameId = jobid - json.Settings.PreferredPort = port - json.Settings.MachineAddress = ip - json.Settings.JobId = jobid - json.Settings.PlaceId = parseFloat(placeid) - json.Settings.UniverseId = json.Settings.PlaceId - json.Settings.CreatorId = creatorid - json.Settings.GameId = jobid +async function OpenGame(jobid, port, ip, placeid, creatorid) { + return new Promise(async (resolve, reject) => { + let json = { + Mode: "GameServer", + GameId: "game1", + Settings: { + IsRobloxPlace: false, + PlaceId: 1, + CreatorId: 1, + GameId: "00000000-0000-0000-0000-000000000132", + GsmInterval: 50, + MaxPlayers: 100, + MaxGameInstances: 52, + ApiKey: "egg", + GameCode: "AAAAAAAAAAAAAA-a", + PreferredPlayerCapacity: 10, + DatacenterId: 1, + PlaceVisitAccessKey: "rbx_evt_ftp", + UniverseId: 13058, + PlaceFetchUrl: "https://mete0r.xyz/asset?id=11", + MatchmakingContextId: 1, + CreatorType: "User", + PlaceVersion: 123, + BaseUrl: "mete0r.xyz", + MachineAddress: "localhost", + JobId: "game1", + PreferredPort: 53640, + }, + } + json.GameId = jobid + json.Settings.PreferredPort = port + json.Settings.MachineAddress = ip + json.Settings.JobId = jobid + json.Settings.PlaceId = parseFloat(placeid) + json.Settings.UniverseId = json.Settings.PlaceId + json.Settings.CreatorId = creatorid + json.Settings.GameId = jobid - let xml = ` + let xml = ` @@ -36,34 +63,64 @@ async function OpenGame(jobid,port,ip,placeid,creatorid){ ` - -//console.log(encodeURIComponent(JSON.stringify(json))) - try { - const result = await fetch(url+"/opengame/"+jobid+"/"+encodeURIComponent(JSON.stringify(json))) - const data = await result.text() - return resolve( - data - ) - } catch (error) { - return reject(error) - } - }) + //console.log(encodeURIComponent(JSON.stringify(json))) + try { + const result = await fetch( + url + + "/opengame/" + + jobid + + "/" + + encodeURIComponent(JSON.stringify(json)), + ) + const data = await result.text() + return resolve(data) + } catch (error) { + return reject(error) + } + }) } -async function OpenGame2020(jobid,port,ip,placeid,creatorid){ - return new Promise(async (resolve, reject) => { -let json = {"Mode":"GameServer","GameId":"game1","Settings":{"IsRobloxPlace":false,"PlaceId":1,"CreatorId":1,"GameId":"00000000-0000-0000-0000-000000000132","GsmInterval":50,"MaxPlayers":100,"MaxGameInstances":52,"ApiKey":"egg","GameCode":"AAAAAAAAAAAAAA-a","PreferredPlayerCapacity":10,"DatacenterId":1,"PlaceVisitAccessKey":"rbx_evt_ftp","UniverseId":13058,"PlaceFetchUrl":"https://mete0r.xyz/asset?id=11","MatchmakingContextId":1,"CreatorType":"User","PlaceVersion":123,"BaseUrl":"mete0r.xyz","MachineAddress":"localhost","JobId":"game1","PreferredPort":53640}} - json.GameId = jobid - json.Settings.PreferredPort = port - json.Settings.MachineAddress = ip - json.Settings.JobId = jobid - json.Settings.PlaceId = parseFloat(placeid) - json.Settings.UniverseId = json.Settings.PlaceId - json.Settings.CreatorId = creatorid - json.Settings.GameId = jobid - json.Settings.PlaceFetchUrl = "https://mete0r.xyz/asset?id="+parseFloat(placeid) +async function OpenGame2020(jobid, port, ip, placeid, creatorid) { + return new Promise(async (resolve, reject) => { + let json = { + Mode: "GameServer", + GameId: "game1", + Settings: { + IsRobloxPlace: false, + PlaceId: 1, + CreatorId: 1, + GameId: "00000000-0000-0000-0000-000000000132", + GsmInterval: 50, + MaxPlayers: 100, + MaxGameInstances: 52, + ApiKey: "egg", + GameCode: "AAAAAAAAAAAAAA-a", + PreferredPlayerCapacity: 10, + DatacenterId: 1, + PlaceVisitAccessKey: "rbx_evt_ftp", + UniverseId: 13058, + PlaceFetchUrl: "https://mete0r.xyz/asset?id=11", + MatchmakingContextId: 1, + CreatorType: "User", + PlaceVersion: 123, + BaseUrl: "mete0r.xyz", + MachineAddress: "localhost", + JobId: "game1", + PreferredPort: 53640, + }, + } + json.GameId = jobid + json.Settings.PreferredPort = port + json.Settings.MachineAddress = ip + json.Settings.JobId = jobid + json.Settings.PlaceId = parseFloat(placeid) + json.Settings.UniverseId = json.Settings.PlaceId + json.Settings.CreatorId = creatorid + json.Settings.GameId = jobid + json.Settings.PlaceFetchUrl = + "https://mete0r.xyz/asset?id=" + parseFloat(placeid) - let xml = ` + let xml = ` @@ -81,220 +138,249 @@ let json = {"Mode":"GameServer","GameId":"game1","Settings":{"IsRobloxPlace":fa ` - -//console.log(encodeURIComponent(JSON.stringify(json))) - try { - const result = await fetch(url+"/opengame2020/"+jobid+"/"+encodeURIComponent(JSON.stringify(json))) - const data = await result.text() - return resolve( - data - ) - } catch (error) { - return reject(error) - } - }) + //console.log(encodeURIComponent(JSON.stringify(json))) + try { + const result = await fetch( + url + + "/opengame2020/" + + jobid + + "/" + + encodeURIComponent(JSON.stringify(json)), + ) + const data = await result.text() + return resolve(data) + } catch (error) { + return reject(error) + } + }) } async function CloseJob(jobid) { - return new Promise(async (resolve, reject) => { - var xml = { - _declaration: { _attributes: { version: '1.0', encoding: 'UTF - 8' } }, - 'SOAP-ENV:Envelope': { - _attributes: { - 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', - 'xmlns:SOAP-ENC': 'http://schemas.xmlsoap.org/soap/encoding/', - 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance', - 'xmlns:xsd': 'http://www.w3.org/2001/XMLSchema', - 'xmlns:ns2': 'http://roblox.com/RCCServiceSoap', - 'xmlns:ns1': 'http://roblox.com/', - 'xmlns:ns3': 'http://roblox.com/RCCServiceSoap12' - }, - 'SOAP-ENV:Body': { - 'ns1:CloseJob': { - 'ns1:jobID': { _text: 'Test' } - } - } - } - } - xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:CloseJob']['ns1:jobID']._text = jobid - const body = convert.js2xml(xml, { compact: true, spaces: 4 }) - - try { - const result = await fetch(url+"/closejob/"+jobid) - const data = await result.text() - return resolve( - data - ) - } catch (error) { - return reject(error) - } - }) + return new Promise(async (resolve, reject) => { + var xml = { + _declaration: { + _attributes: { version: "1.0", encoding: "UTF - 8" }, + }, + "SOAP-ENV:Envelope": { + _attributes: { + "xmlns:SOAP-ENV": + "http://schemas.xmlsoap.org/soap/envelope/", + "xmlns:SOAP-ENC": + "http://schemas.xmlsoap.org/soap/encoding/", + "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", + "xmlns:xsd": "http://www.w3.org/2001/XMLSchema", + "xmlns:ns2": "http://roblox.com/RCCServiceSoap", + "xmlns:ns1": "http://roblox.com/", + "xmlns:ns3": "http://roblox.com/RCCServiceSoap12", + }, + "SOAP-ENV:Body": { + "ns1:CloseJob": { + "ns1:jobID": { _text: "Test" }, + }, + }, + }, + } + xml["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:CloseJob"][ + "ns1:jobID" + ]._text = jobid + const body = convert.js2xml(xml, { compact: true, spaces: 4 }) + + try { + const result = await fetch(url + "/closejob/" + jobid) + const data = await result.text() + return resolve(data) + } catch (error) { + return reject(error) + } + }) } -async function OpenRender(userid,closeup) { - return new Promise(async (resolve, reject) => { - try { - const result = await fetch(url+"/openrender/"+userid+"/"+closeup) - const data = await result.text() - //console.log(data) - if (data === '{"status": "error","error":"Already started"}'){ - return resolve( - JSON.parse(data) - ) - } - const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) - return resolve( - convertedData - ) - } catch (error) { - return reject(error) - } - }) +async function OpenRender(userid, closeup) { + return new Promise(async (resolve, reject) => { + try { + const result = await fetch( + url + "/openrender/" + userid + "/" + closeup, + ) + const data = await result.text() + //console.log(data) + if (data === '{"status": "error","error":"Already started"}') { + return resolve(JSON.parse(data)) + } + const convertedData = convert.xml2js(data, { + compact: true, + spaces: 4, + }) + return resolve(convertedData) + } catch (error) { + return reject(error) + } + }) } -async function OpenRenderAsset(assetid,type) { - return new Promise(async (resolve, reject) => { - try { - const result = await fetch(url+"/openrenderasset/"+assetid+"/"+type) - const data = await result.text() - //console.log(data) - if (data === '{"status": "error","error":"Already started"}'){ - return resolve( - JSON.parse(data) - ) - } - const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) - return resolve( - convertedData - ) - } catch (error) { - return reject(error) - } - }) +async function OpenRenderAsset(assetid, type) { + return new Promise(async (resolve, reject) => { + try { + const result = await fetch( + url + "/openrenderasset/" + assetid + "/" + type, + ) + const data = await result.text() + //console.log(data) + if (data === '{"status": "error","error":"Already started"}') { + return resolve(JSON.parse(data)) + } + const convertedData = convert.xml2js(data, { + compact: true, + spaces: 4, + }) + return resolve(convertedData) + } catch (error) { + return reject(error) + } + }) } -async function lol2(){ - const lol = await OpenRender(0) - console.log(lol['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:OpenJobResponse']['ns1:OpenJobResult'][0]['ns1:value']._text) +async function lol2() { + const lol = await OpenRender(0) + console.log( + lol["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:OpenJobResponse"][ + "ns1:OpenJobResult" + ][0]["ns1:value"]._text, + ) } -async function RenewLease(jobid,expiration) { - return new Promise(async (resolve, reject) => { - var xml = { - _declaration: { _attributes: { version: '1.0', encoding: 'UTF-8' } }, - 'SOAP-ENV:Envelope': { - _attributes: { - 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', - 'xmlns:ns1': 'http://roblox.com/', - 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance' - }, - 'SOAP-ENV:Body': { - 'ns1:RenewLease': { - 'ns1:jobID': { _text: 'Test' }, - 'ns1:expirationInSeconds': { _text: '100' } - } - } - } - } - xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:RenewLease']['ns1:jobID']._text = jobid - xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:RenewLease']['ns1:expirationInSeconds']._text = expiration - const body = convert.js2xml(xml, { compact: true, spaces: 4 }) - - try { - const result = await fetch(url+"/renewlease/"+jobid+"/"+expiration) - const data = await result.text() - return resolve( - data - ) - } catch (error) { - return reject(error) - } - }) +async function RenewLease(jobid, expiration) { + return new Promise(async (resolve, reject) => { + var xml = { + _declaration: { + _attributes: { version: "1.0", encoding: "UTF-8" }, + }, + "SOAP-ENV:Envelope": { + _attributes: { + "xmlns:SOAP-ENV": + "http://schemas.xmlsoap.org/soap/envelope/", + "xmlns:ns1": "http://roblox.com/", + "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", + }, + "SOAP-ENV:Body": { + "ns1:RenewLease": { + "ns1:jobID": { _text: "Test" }, + "ns1:expirationInSeconds": { _text: "100" }, + }, + }, + }, + } + xml["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:RenewLease"][ + "ns1:jobID" + ]._text = jobid + xml["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:RenewLease"][ + "ns1:expirationInSeconds" + ]._text = expiration + const body = convert.js2xml(xml, { compact: true, spaces: 4 }) + + try { + const result = await fetch( + url + "/renewlease/" + jobid + "/" + expiration, + ) + const data = await result.text() + return resolve(data) + } catch (error) { + return reject(error) + } + }) } -async function Execute(jobid,json) { - return new Promise(async (resolve, reject) => { - try { - const result = await fetch(url+"/executejson/"+jobid+"/"+encodeURIComponent(JSON.stringify(json))) - const data = await result.text() - return resolve( - data - ) - } catch (error) { - return reject(error) - } - }) +async function Execute(jobid, json) { + return new Promise(async (resolve, reject) => { + try { + const result = await fetch( + url + + "/executejson/" + + jobid + + "/" + + encodeURIComponent(JSON.stringify(json)), + ) + const data = await result.text() + return resolve(data) + } catch (error) { + return reject(error) + } + }) } async function GetAllJobs() { - return new Promise(async (resolve, reject) => { - const xmlData = (xml = { - _declaration: { - _attributes: { version: '1.0', encoding: 'UTF - 8' }, - }, - 'SOAP-ENV:Envelope': { - _attributes: { - 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', - 'xmlns:SOAP-ENC': 'http://schemas.xmlsoap.org/soap/encoding/', - 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance', - 'xmlns:xsd': 'http://www.w3.org/2001/XMLSchema', - 'xmlns:ns2': 'http://roblox.com/RCCServiceSoap', - 'xmlns:ns1': 'http://roblox.com/', - 'xmlns:ns3': 'http://roblox.com/RCCServiceSoap12', - }, - 'SOAP-ENV:Body': { 'ns1:GetAllJobsEx': {} }, - }, - }) - - const body = convert.js2xml(xmlData, { compact: true, spaces: 4 }) - - try { - const result = await fetch(url, { method: 'POST', body }) - const data = await result.text() - const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) - return resolve( - convertedData['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:GetAllJobsExResponse']['ns1:GetAllJobsExResult'] - ) - } catch (error) { - return reject(error) - } - }) + return new Promise(async (resolve, reject) => { + const xmlData = (xml = { + _declaration: { + _attributes: { version: "1.0", encoding: "UTF - 8" }, + }, + "SOAP-ENV:Envelope": { + _attributes: { + "xmlns:SOAP-ENV": + "http://schemas.xmlsoap.org/soap/envelope/", + "xmlns:SOAP-ENC": + "http://schemas.xmlsoap.org/soap/encoding/", + "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", + "xmlns:xsd": "http://www.w3.org/2001/XMLSchema", + "xmlns:ns2": "http://roblox.com/RCCServiceSoap", + "xmlns:ns1": "http://roblox.com/", + "xmlns:ns3": "http://roblox.com/RCCServiceSoap12", + }, + "SOAP-ENV:Body": { "ns1:GetAllJobsEx": {} }, + }, + }) + + const body = convert.js2xml(xmlData, { compact: true, spaces: 4 }) + + try { + const result = await fetch(url, { method: "POST", body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { + compact: true, + spaces: 4, + }) + return resolve( + convertedData["SOAP-ENV:Envelope"]["SOAP-ENV:Body"][ + "ns1:GetAllJobsExResponse" + ]["ns1:GetAllJobsExResult"], + ) + } catch (error) { + return reject(error) + } + }) } //RenewLease('game2',"69530318916789546987353800") -async function lol(){ -let res = await GetAllJobs() -//console.dir(res,{ depth: null }) -let exists = false -if (res != "{}"){ - if (Array.isArray(res['ns1:Job']) === false){ - console.log('asd') - //console.log(res['ns1:Job']['ns1:id']._text) - if (res['ns1:Job']['ns1:id']._text === 'game2'){ - exists = true - } - }else{ - res['ns1:Job'].forEach(element => { - if (element['ns1:id']?._text === 'game2'){ - exists = true - } - }) - } - - -} -console.log(exists) +async function lol() { + let res = await GetAllJobs() + //console.dir(res,{ depth: null }) + let exists = false + if (res != "{}") { + if (Array.isArray(res["ns1:Job"]) === false) { + console.log("asd") + //console.log(res['ns1:Job']['ns1:id']._text) + if (res["ns1:Job"]["ns1:id"]._text === "game2") { + exists = true + } + } else { + res["ns1:Job"].forEach(element => { + if (element["ns1:id"]?._text === "game2") { + exists = true + } + }) + } + } + console.log(exists) } //lol() //GetAllJobs() //OpenGame('game2','3333','127.0.0.1','2') -module.exports = {OpenGame,CloseJob,RenewLease,GetAllJobs,OpenRender,OpenRenderAsset,OpenGame2020,Execute} - - - - - - - - - +module.exports = { + OpenGame, + CloseJob, + RenewLease, + GetAllJobs, + OpenRender, + OpenRenderAsset, + OpenGame2020, + Execute, +} diff --git a/Back/routes/2018/game.js b/Back/routes/2018/game.js index 3a0b752..be0d602 100644 --- a/Back/routes/2018/game.js +++ b/Back/routes/2018/game.js @@ -1,110 +1,212 @@ const express = require("express") const router = express.Router() -const { requireAuth } = require('../../middleware/authmiddlewaregame') -const crypto = require('crypto'); -const fs = require('fs') -const key = fs.readFileSync('DefaultPrivateKey.pem') -const { getPort, checkPort, getRandomPort, waitForPort } = require('get-port-please') +const { requireAuth } = require("../../middleware/authmiddlewaregame") +const crypto = require("crypto") +const fs = require("fs") +const key = fs.readFileSync("DefaultPrivateKey.pem") +const { + getPort, + checkPort, + getRandomPort, + waitForPort, +} = require("get-port-please") const RCC_HOST = process.env.RCC_HOST -var sanitize = require('mongo-sanitize'); -const games = require('./../../model/games.js') +var sanitize = require("mongo-sanitize") +const games = require("./../../model/games.js") const signatures = require("./../signatures.js") -const rcc = require('../../model/rcc2018.js') -const rcctalk = require('../../rcctalk2018') -const User = require('../../model/user.js') +const rcc = require("../../model/rcc2018.js") +const rcctalk = require("../../rcctalk2018") +const User = require("../../model/user.js") function sleep(ms) { - return new Promise((resolve) => { - setTimeout(resolve, ms); - }); - } - const _2018placelauncher = async(req,res,next) => { - var enabled = req.config - if (enabled.GamesEnabled === false){ - return res.json({status:"error",error:"Games are disabled bad boy"}) - } - var joinJson = {"ClientPort":0,"MachineAddress":"localhost","ServerPort":25564,"PingUrl":"","PingInterval":120,"UserName":"default","SeleniumTestMode":false,"UserId":0,"SuperSafeChat":false,"CharacterAppearance":"http://shitncumblox.gq/game/charapp?name=default","ClientTicket":"","GameId":1,"PlaceId":1818,"MeasurementUrl":"","WaitingForCharacterGuid":"cad99b30-7983-434b-b24c-eac12595e5fd","BaseUrl":"http://www.mete0r.xyz/","ChatStyle":"ClassicAndBubble","VendorId":0,"ScreenShotInfo":"","VideoInfo":"GamesROBLOX, video, free game, online virtual world","CreatorId":0,"CreatorTypeEnum":"User","MembershipType":"None","AccountAge":365,"CookieStoreFirstTimePlayKey":"rbx_evt_ftp","CookieStoreFiveMinutePlayKey":"rbx_evt_fmp","CookieStoreEnabled":true,"IsRobloxPlace":false,"GenerateTeleportJoin":false,"IsUnknownOrUnder13":false,"SessionId":"c25fd620-bbaa-4fb2-b022-3f053cdd1abd|00000000-0000-0000-0000-000000000000|0|204.236.226.210|8|2016-08-17T01:05:05.7115837Z|0|null|null|null|null","DataCenterId":0,"UniverseId":0,"BrowserTrackerId":0,"UsePortraitMode":false,"FollowUserId":0,"CharacterAppearanceId":1} - if (!req.query.name && !req.query.placeId && !req.query.placeid){ - return res.json({status:"error",error:"no placeid bad"}) - } - if (req.userdocument.gamejoin2018){ - return res.json({"jobId":"Test","status":2,"joinScriptUrl":"http://mete0r.xyz/game/join.ashx?ver=2018&auth="+req.query.auth??req.cookies.jwt,"authenticationUrl":"http://mete0r.xyz/Login/Negotiate.ashx","authenticationTicket":"SomeTicketThatDosentCrash","message":""}) - } - var sanitizedplaceid = sanitize(req.query.name??req.query.placeId??req.query.placeid) - const game = await games.findOne({idofgame: sanitizedplaceid}).lean() - if (!game){ - return res.json({status:"error",error:"that game doesn't exist!"}) - } - if (game.version != "2018"){ - return next() - } - let instance = await rcc.findOne({PlaceId: sanitizedplaceid}).lean() - if (instance && instance.Status === 2){ + return new Promise(resolve => { + setTimeout(resolve, ms) + }) +} +const _2018placelauncher = async (req, res, next) => { + var enabled = req.config + if (enabled.GamesEnabled === false) { + return res.json({ + status: "error", + error: "Games are disabled bad boy", + }) + } + var joinJson = { + ClientPort: 0, + MachineAddress: "localhost", + ServerPort: 25564, + PingUrl: "", + PingInterval: 120, + UserName: "default", + SeleniumTestMode: false, + UserId: 0, + SuperSafeChat: false, + CharacterAppearance: "http://shitncumblox.gq/game/charapp?name=default", + ClientTicket: "", + GameId: 1, + PlaceId: 1818, + MeasurementUrl: "", + WaitingForCharacterGuid: "cad99b30-7983-434b-b24c-eac12595e5fd", + BaseUrl: "http://www.mete0r.xyz/", + ChatStyle: "ClassicAndBubble", + VendorId: 0, + ScreenShotInfo: "", + VideoInfo: + 'GamesROBLOX, video, free game, online virtual world', + CreatorId: 0, + CreatorTypeEnum: "User", + MembershipType: "None", + AccountAge: 365, + CookieStoreFirstTimePlayKey: "rbx_evt_ftp", + CookieStoreFiveMinutePlayKey: "rbx_evt_fmp", + CookieStoreEnabled: true, + IsRobloxPlace: false, + GenerateTeleportJoin: false, + IsUnknownOrUnder13: false, + SessionId: + "c25fd620-bbaa-4fb2-b022-3f053cdd1abd|00000000-0000-0000-0000-000000000000|0|204.236.226.210|8|2016-08-17T01:05:05.7115837Z|0|null|null|null|null", + DataCenterId: 0, + UniverseId: 0, + BrowserTrackerId: 0, + UsePortraitMode: false, + FollowUserId: 0, + CharacterAppearanceId: 1, + } + if (!req.query.name && !req.query.placeId && !req.query.placeid) { + return res.json({ status: "error", error: "no placeid bad" }) + } + if (req.userdocument.gamejoin2018) { + return res.json({ + jobId: "Test", + status: 2, + joinScriptUrl: + "http://mete0r.xyz/game/join.ashx?ver=2018&auth=" + + req.query.auth ?? req.cookies.jwt, + authenticationUrl: "http://mete0r.xyz/Login/Negotiate.ashx", + authenticationTicket: "SomeTicketThatDosentCrash", + message: "", + }) + } + var sanitizedplaceid = sanitize( + req.query.name ?? req.query.placeId ?? req.query.placeid, + ) + const game = await games.findOne({ idofgame: sanitizedplaceid }).lean() + if (!game) { + return res.json({ status: "error", error: "that game doesn't exist!" }) + } + if (game.version != "2018") { + return next() + } + let instance = await rcc.findOne({ PlaceId: sanitizedplaceid }).lean() + if (instance && instance.Status === 2) { + // if an rcc instance already exists we don't need to create a new one so we will just drag them into the existing game + joinJson.UserName = req.userdocument.username + joinJson.UserId = req.userdocument.userid + joinJson.CharacterAppearance = + "http://mete0r.xyz/v1.1/avatar-fetch?userId" + + req.userdocument.userid + joinJson.MachineAddress = RCC_HOST // need to put rcc host here lol + joinJson.ServerPort = instance.Port + joinJson.PlaceId = instance.PlaceId + joinJson.GameId = sanitizedplaceid + joinJson.CharacterAppearanceId = req.userdocument.userid + joinJson.MembershipType = req.userdocument.membership + joinJson.CreatorId = game.useridofowner + joinJson.SessionId = req.query.auth ?? req.cookies.jwt + const timestamp = Date.now() + joinJson.ClientTicket = timestamp + ";" // timestamp + //create signature 1 + const sign1 = crypto.createSign("SHA1") + sign1.update( + `${req.userdocument.userid}\n` /*userid*/ + + `${req.userdocument.username}\n` /*username*/ + + `http://mete0r.xyz/v1.1/avatar-fetch?userId=${req.userdocument.userid}\n` /*charapp*/ + + `game${sanitizedplaceid}\n` /*jobid*/ + + timestamp /*timestamp*/, + ) + var signature1 = sign1.sign(key, "base64") + joinJson.ClientTicket += signature1 + ";" - // if an rcc instance already exists we don't need to create a new one so we will just drag them into the existing game - joinJson.UserName = req.userdocument.username - joinJson.UserId = req.userdocument.userid - joinJson.CharacterAppearance = "http://mete0r.xyz/v1.1/avatar-fetch?userId" + req.userdocument.userid - joinJson.MachineAddress = RCC_HOST // need to put rcc host here lol - joinJson.ServerPort = instance.Port - joinJson.PlaceId = instance.PlaceId - joinJson.GameId = sanitizedplaceid - joinJson.CharacterAppearanceId = req.userdocument.userid - joinJson.MembershipType = req.userdocument.membership - joinJson.CreatorId = game.useridofowner - joinJson.SessionId = req.query.auth??req.cookies.jwt + //create signature 2 + const sign2 = crypto.createSign("SHA1") + sign2.update( + `${req.userdocument.userid}\n` /*userid*/ + + `game${sanitizedplaceid}\n` /*jobid*/ + + timestamp /*timestamp*/, + ) + var signature2 = sign2.sign(key, "base64") + joinJson.ClientTicket += signature2 - const timestamp = Date.now() - joinJson.ClientTicket = timestamp+";" // timestamp - //create signature 1 - const sign1 = crypto.createSign('SHA1'); - sign1.update(`${req.userdocument.userid}\n`/*userid*/+`${req.userdocument.username}\n`/*username*/+`http://mete0r.xyz/v1.1/avatar-fetch?userId=${req.userdocument.userid}\n`/*charapp*/+`game${sanitizedplaceid}\n`/*jobid*/+ timestamp/*timestamp*/) - var signature1 = sign1.sign(key, "base64") - joinJson.ClientTicket += signature1 + ";" - - //create signature 2 - const sign2 = crypto.createSign('SHA1'); - sign2.update(`${req.userdocument.userid}\n`/*userid*/+`game${sanitizedplaceid}\n`/*jobid*/+ timestamp/*timestamp*/) - var signature2 = sign2.sign(key, "base64") - joinJson.ClientTicket += signature2 - - req.userdocument.gamejoin2018 = JSON.stringify(joinJson) - req.userdocument.markModified('gamejoin2018') - await req.userdocument.save() - var joinScriptJson = {"jobId":"Test","status":2,"joinScriptUrl":"http://mete0r.xyz/game/join.ashx?ver=2018&auth="+joinJson.SessionId,"authenticationUrl":"http://mete0r.xyz/Login/Negotiate.ashx","authenticationTicket":"SomeTicketThatDosentCrash","message":""} + req.userdocument.gamejoin2018 = JSON.stringify(joinJson) + req.userdocument.markModified("gamejoin2018") + await req.userdocument.save() + var joinScriptJson = { + jobId: "Test", + status: 2, + joinScriptUrl: + "http://mete0r.xyz/game/join.ashx?ver=2018&auth=" + + joinJson.SessionId, + authenticationUrl: "http://mete0r.xyz/Login/Negotiate.ashx", + authenticationTicket: "SomeTicketThatDosentCrash", + message: "", + } + return res.send(JSON.stringify(joinScriptJson)) + } + if (instance && instance.Status === 1) { + var joinScriptJson = { + jobId: "Test", + status: 1, + joinScriptUrl: + "http://mete0r.xyz/game/join.ashx?ver=2018&auth=" + + joinJson.SessionId, + authenticationUrl: "http://mete0r.xyz/Login/Negotiate.ashx", + authenticationTicket: "SomeTicketThatDosentCrash", + message: "", + } + return res.send(JSON.stringify(joinScriptJson)) + } - return res.send(JSON.stringify(joinScriptJson)) - } - if (instance && instance.Status === 1){ - var joinScriptJson = {"jobId":"Test","status":1,"joinScriptUrl":"http://mete0r.xyz/game/join.ashx?ver=2018&auth="+joinJson.SessionId,"authenticationUrl":"http://mete0r.xyz/Login/Negotiate.ashx","authenticationTicket":"SomeTicketThatDosentCrash","message":""} - return res.send(JSON.stringify(joinScriptJson)) - } + var port = await getPort({ random: true }) + // launch job + rcctalk.OpenGame( + "game" + sanitizedplaceid, + port, + RCC_HOST, + sanitizedplaceid, + game.useridofowner, + ) + //console.dir(response,{ depth: null }) + //console.dir(response,{ depth: null }) + await rcc.create({ + PlaceId: sanitizedplaceid, + Port: port, + Status: 1, // 1 means loading + }) - var port = await getPort({random: true}) - // launch job - rcctalk.OpenGame("game"+sanitizedplaceid,port,RCC_HOST,sanitizedplaceid,game.useridofowner) - //console.dir(response,{ depth: null }) - //console.dir(response,{ depth: null }) + //console.log(newrenderscript) - await rcc.create({ - PlaceId: sanitizedplaceid, - Port: port, - Status: 1 // 1 means loading - }) + var joinScriptJson = { + jobId: "Test", + status: 1, + joinScriptUrl: + "http://mete0r.xyz/game/join.ashx?ver=2020&auth=" + + joinJson.SessionId, + authenticationUrl: "http://mete0r.xyz/Login/Negotiate.ashx", + authenticationTicket: "SomeTicketThatDosentCrash", + message: "", + } + return res.send(JSON.stringify(joinScriptJson)) +} - //console.log(newrenderscript) - - var joinScriptJson = {"jobId":"Test","status":1,"joinScriptUrl":"http://mete0r.xyz/game/join.ashx?ver=2020&auth="+joinJson.SessionId,"authenticationUrl":"http://mete0r.xyz/Login/Negotiate.ashx","authenticationTicket":"SomeTicketThatDosentCrash","message":""} - return res.send(JSON.stringify(joinScriptJson)) - - } - -router.all("/2018/join",requireAuth,_2018placelauncher,async (req, res) => { - return res.json({status:"error",error:"Version different than client requested."}) +router.all("/2018/join", requireAuth, _2018placelauncher, async (req, res) => { + return res.json({ + status: "error", + error: "Version different than client requested.", + }) }) //rcctalk.CloseJob('game2') -module.exports = {router: router, _2018placelauncher:_2018placelauncher} \ No newline at end of file +module.exports = { router: router, _2018placelauncher: _2018placelauncher } diff --git a/Back/routes/2020/game.js b/Back/routes/2020/game.js index d374c60..b2bdbfd 100644 --- a/Back/routes/2020/game.js +++ b/Back/routes/2020/game.js @@ -1,207 +1,327 @@ const express = require("express") const router = express.Router() -const { requireAuth } = require('../../middleware/authmiddlewaregame') -const crypto = require('crypto'); -const fs = require('fs') -const key = fs.readFileSync('PrivateKey2020.txt') -const { getPort, checkPort, getRandomPort, waitForPort } = require('get-port-please') +const { requireAuth } = require("../../middleware/authmiddlewaregame") +const crypto = require("crypto") +const fs = require("fs") +const key = fs.readFileSync("PrivateKey2020.txt") +const { + getPort, + checkPort, + getRandomPort, + waitForPort, +} = require("get-port-please") const RCC_HOST = process.env.RCC_HOST -var sanitize = require('mongo-sanitize'); -const games = require('./../../model/games.js') +var sanitize = require("mongo-sanitize") +const games = require("./../../model/games.js") const signatures = require("./../signatures.js") -const rcc = require('../../model/rcc2020.js') -const rcctalk = require('../../rcctalk2018') -const User = require('../../model/user.js') -const bodyParser = require('body-parser') +const rcc = require("../../model/rcc2020.js") +const rcctalk = require("../../rcctalk2018") +const User = require("../../model/user.js") +const bodyParser = require("body-parser") router.use(bodyParser.json()) function sleep(ms) { - return new Promise((resolve) => { - setTimeout(resolve, ms); - }); - } - -const _2020placelauncher = async(req,res,next) => { - var enabled = req.config - if (enabled.GamesEnabled === false){ - return res.json({status:"error",error:"Games are disabled bad boy"}) - } - if (req.headers?.['user-agent']?.includes("Android") === true || req.headers?.['user-agent']?.includes("iPhone") === true){ - console.log(req.headers) - console.log(req.userdocument.username) - } - - if (req.method === "POST"){ // mobile join-game - req.query.name = req.body.placeId - } - var joinJson = {"ClientPort":0,"MachineAddress":"localhost","ServerPort":25564,"PingUrl":"","PingInterval":120,"UserName":"default","SeleniumTestMode":false,"UserId":0,"SuperSafeChat":false,"CharacterAppearance":"http://shitncumblox.gq/game/charapp?name=default","ClientTicket":"","GameId":1,"PlaceId":1818,"MeasurementUrl":"","WaitingForCharacterGuid":"cad99b30-7983-434b-b24c-eac12595e5fd","BaseUrl":"http://www.mete0r.xyz/","ChatStyle":"ClassicAndBubble","VendorId":0,"ScreenShotInfo":"","VideoInfo":"GamesROBLOX, video, free game, online virtual world","CreatorId":0,"CreatorTypeEnum":"User","MembershipType":"None","AccountAge":365,"CookieStoreFirstTimePlayKey":"rbx_evt_ftp","CookieStoreFiveMinutePlayKey":"rbx_evt_fmp","CookieStoreEnabled":true,"IsRobloxPlace":false,"GenerateTeleportJoin":false,"IsUnknownOrUnder13":false,"SessionId":"c25fd620-bbaa-4fb2-b022-3f053cdd1abd|00000000-0000-0000-0000-000000000000|0|204.236.226.210|8|2016-08-17T01:05:05.7115837Z|0|null|null|null|null","DataCenterId":0,"UniverseId":0,"BrowserTrackerId":0,"UsePortraitMode":false,"FollowUserId":0,"CharacterAppearanceId":1} - if (!req.query.name && !req.query.placeId && !req.query.placeid){ - return res.json({status:"error",error:"no placeid bad"}) - } - if (req.userdocument.gamejoin2020){ - return res.json({"jobId":"Test","status":2,"joinScriptUrl":"http://mete0r.xyz/game/join.ashx?ver=2020&auth="+req.query.auth??req.cookies.jwt,"authenticationUrl":"http://mete0r.xyz/Login/Negotiate.ashx","authenticationTicket":"SomeTicketThatDosentCrash","message":""}) - } - var sanitizedplaceid = sanitize(req.query.name??req.query.placeId??req.query.placeid) - const game = await games.findOne({idofgame: sanitizedplaceid}).lean() - if (!game){ - return res.json({status:"error",error:"that game doesn't exist!"}) - } - if (game.version != "2020"){ - return next() - } - let instance = await rcc.findOne({PlaceId: sanitizedplaceid}).lean() - if (instance && instance.Status === 2){ - - - // if an rcc instance already exists we don't need to create a new one so we will just drag them into the existing game - joinJson.UserName = req.userdocument.username - joinJson.UserId = req.userdocument.userid - joinJson.CharacterAppearance = "http://mete0r.xyz/v1.1/avatar-fetch?userId=" + req.userdocument.userid - joinJson.MachineAddress = RCC_HOST // need to put rcc host here lol - joinJson.ServerPort = instance.Port - joinJson.PlaceId = instance.PlaceId - joinJson.GameId = sanitizedplaceid - joinJson.CharacterAppearanceId = req.userdocument.userid - joinJson.MembershipType = req.userdocument.membership - joinJson.CreatorId = game.useridofowner - joinJson.SessionId = req.query.auth??req.cookies.jwt - - const timestamp = Date.now() - joinJson.ClientTicket = timestamp+";" // timestamp - //create signature 1 - const sign1 = crypto.createSign('SHA1'); - sign1.update(`${req.userdocument.userid}\n`/*userid*/+`${req.userdocument.username}\n`/*username*/+`${"0"}\n`/*userid 2 that 0k wants for some reason what a retard*/+`game${sanitizedplaceid}\n`/*jobid*/+ timestamp/*timestamp*/) - var signature1 = sign1.sign(key, "base64") - joinJson.ClientTicket += signature1 + ";" - //create signature 2 - const sign2 = crypto.createSign('SHA1'); - sign2.update(`${req.userdocument.userid}\n`/*userid*/+`game${sanitizedplaceid}\n`/*jobid*/+ timestamp/*timestamp*/) - var signature2 = sign2.sign(key, "base64") - joinJson.ClientTicket += signature2 + ";4" - - if (req.method === "POST" && req.body.isTeleport){ // mobile join-game - const mobileJoin = - { - "ClientPort": 0, - "MachineAddress": RCC_HOST, - "ServerPort": instance.Port, - "ServerConnections": [ - { - "Address": RCC_HOST, - "Port": instance.Port - } - ], - "DirectServerReturn": true, - "TokenGenAlgorithm": 0, - "PepperId": 0, - "TokenValue": "vg", - "PingUrl": "", - "PingInterval": 0, - "UserName": req.userdocument.username, - "SeleniumTestMode": false, - "UserId": req.userdocument.userid, - "RobloxLocale": "", - "GameLocale": "", - "SuperSafeChat": false, - "CharacterAppearance": "http://mete0r.xyz/v1.1/avatar-fetch?userId=" + req.userdocument.userid, - "ClientTicket": joinJson.ClientTicket, - "GameId": ""+sanitizedplaceid, - "PlaceId": sanitizedplaceid, - "BaseUrl": "http://www.mete0r.xyz/", - "ChatStyle": "ClassicAndBubble", - "CreatorId": game.useridofowner, - "CreatorTypeEnum": "User", - "MembershipType": req.userdocument.membership, - "AccountAge": 365, - "CookieStoreFirstTimePlayKey": "rbx_evt_ftp", - "CookieStoreFiveMinutePlayKey": "rbx_evt_fmp", - "CookieStoreEnabled": false, - "IsUnknownOrUnder13": false, - "GameChatType": "AllUsers", - "SessionId": req.query.auth??req.cookies.jwt, - "AnalyticsSessionId": "", - "DataCenterId": 0, - "UniverseId": sanitizedplaceid, - "FollowUserId": 0, - "characterAppearanceId": req.userdocument.userid, - "CountryCode": "US", - "AlternateName": "", - "RandomSeed1": "57575745353", - "ClientPublicKeyData": "" - } - - console.log(mobileJoin) - return res.json({ - "jobId": "Test", - "status": 2, - "joinScriptUrl": `http://mete0r.xyz/game/join.ashx?ver=2020&auth=${req.query.auth??req.cookies.jwt}`, - "authenticationUrl": "http://mete0r.xyz/Login/Negotiate.ashx", - "authenticationTicket": "SomeTicketThatDosentCrash", - "message": "", - "joinScript": mobileJoin - }) - - } - - req.userdocument.gamejoin2020 = JSON.stringify(joinJson) - req.userdocument.markModified('gamejoin2020') - await req.userdocument.save() - var joinScriptJson = {"jobId":"Test","status":2,"joinScriptUrl":"http://mete0r.xyz/game/join.ashx?ver=2020&auth="+joinJson.SessionId,"authenticationUrl":"http://mete0r.xyz/Login/Negotiate.ashx","authenticationTicket":"SomeTicketThatDosentCrash","message":""} - - - return res.send(JSON.stringify(joinScriptJson)) - } - - if (instance && instance.Status === 1){ - var joinScriptJson = {"jobId":"Test","status":1,"joinScriptUrl":"http://mete0r.xyz/game/join.ashx?ver=2020&auth="+joinJson.SessionId,"authenticationUrl":"http://mete0r.xyz/Login/Negotiate.ashx","authenticationTicket":"SomeTicketThatDosentCrash","message":""} - - if (req.method === "POST" && req.body.isTeleport){ // mobile join-game - return res.json({ - "jobId": "Test", - "status": 0, - "joinScriptUrl": "http://mete0r.xyz/game/join.ashx?ver=2020&auth="+req.query.auth??req.cookies.jwt, - "authenticationUrl": "http://mete0r.xyz/Login/Negotiate.ashx", - "authenticationTicket": "SomeTicketThatDosentCrash", - "message": "" - }) - - } - return res.send(JSON.stringify(joinScriptJson)) - } - - var port = 53640 + Math.floor(Math.random() * 100) - // launch job - rcctalk.OpenGame2020("game"+sanitizedplaceid,port,RCC_HOST,sanitizedplaceid,game.useridofowner) - //console.dir(response,{ depth: null }) - - await rcc.create({ - PlaceId: sanitizedplaceid, - Port: port, - Status: 1 // 1 means loading - }) - - //console.log(newrenderscript) - - var joinScriptJson = {"jobId":"Test","status":1,"joinScriptUrl":"http://mete0r.xyz/game/join.ashx?ver=2020&auth="+joinJson.SessionId,"authenticationUrl":"http://mete0r.xyz/Login/Negotiate.ashx","authenticationTicket":"SomeTicketThatDosentCrash","message":""} - - if (req.method === "POST" && req.body.isTeleport){ // mobile join-game - return res.json({ - "jobId": "Test", - "status": 0, - "joinScriptUrl": "http://mete0r.xyz/game/join.ashx?ver=2020&auth="+req.query.auth??req.cookies.jwt, - "authenticationUrl": "http://mete0r.xyz/Login/Negotiate.ashx", - "authenticationTicket": "SomeTicketThatDosentCrash", - "message": "" - }) - - } - - return res.send(JSON.stringify(joinScriptJson)) + return new Promise(resolve => { + setTimeout(resolve, ms) + }) } -router.all(["/MTwentyTwenty.ashx","/2020/join","/join-game"],requireAuth,_2020placelauncher,async (req, res) => { - return res.json({status:"error",error:"Version different than client requested."}) -}) +const _2020placelauncher = async (req, res, next) => { + var enabled = req.config + if (enabled.GamesEnabled === false) { + return res.json({ + status: "error", + error: "Games are disabled bad boy", + }) + } + if ( + req.headers?.["user-agent"]?.includes("Android") === true || + req.headers?.["user-agent"]?.includes("iPhone") === true + ) { + console.log(req.headers) + console.log(req.userdocument.username) + } + + if (req.method === "POST") { + // mobile join-game + req.query.name = req.body.placeId + } + var joinJson = { + ClientPort: 0, + MachineAddress: "localhost", + ServerPort: 25564, + PingUrl: "", + PingInterval: 120, + UserName: "default", + SeleniumTestMode: false, + UserId: 0, + SuperSafeChat: false, + CharacterAppearance: "http://shitncumblox.gq/game/charapp?name=default", + ClientTicket: "", + GameId: 1, + PlaceId: 1818, + MeasurementUrl: "", + WaitingForCharacterGuid: "cad99b30-7983-434b-b24c-eac12595e5fd", + BaseUrl: "http://www.mete0r.xyz/", + ChatStyle: "ClassicAndBubble", + VendorId: 0, + ScreenShotInfo: "", + VideoInfo: + 'GamesROBLOX, video, free game, online virtual world', + CreatorId: 0, + CreatorTypeEnum: "User", + MembershipType: "None", + AccountAge: 365, + CookieStoreFirstTimePlayKey: "rbx_evt_ftp", + CookieStoreFiveMinutePlayKey: "rbx_evt_fmp", + CookieStoreEnabled: true, + IsRobloxPlace: false, + GenerateTeleportJoin: false, + IsUnknownOrUnder13: false, + SessionId: + "c25fd620-bbaa-4fb2-b022-3f053cdd1abd|00000000-0000-0000-0000-000000000000|0|204.236.226.210|8|2016-08-17T01:05:05.7115837Z|0|null|null|null|null", + DataCenterId: 0, + UniverseId: 0, + BrowserTrackerId: 0, + UsePortraitMode: false, + FollowUserId: 0, + CharacterAppearanceId: 1, + } + if (!req.query.name && !req.query.placeId && !req.query.placeid) { + return res.json({ status: "error", error: "no placeid bad" }) + } + if (req.userdocument.gamejoin2020) { + return res.json({ + jobId: "Test", + status: 2, + joinScriptUrl: + "http://mete0r.xyz/game/join.ashx?ver=2020&auth=" + + req.query.auth ?? req.cookies.jwt, + authenticationUrl: "http://mete0r.xyz/Login/Negotiate.ashx", + authenticationTicket: "SomeTicketThatDosentCrash", + message: "", + }) + } + var sanitizedplaceid = sanitize( + req.query.name ?? req.query.placeId ?? req.query.placeid, + ) + const game = await games.findOne({ idofgame: sanitizedplaceid }).lean() + if (!game) { + return res.json({ status: "error", error: "that game doesn't exist!" }) + } + if (game.version != "2020") { + return next() + } + let instance = await rcc.findOne({ PlaceId: sanitizedplaceid }).lean() + if (instance && instance.Status === 2) { + // if an rcc instance already exists we don't need to create a new one so we will just drag them into the existing game + joinJson.UserName = req.userdocument.username + joinJson.UserId = req.userdocument.userid + joinJson.CharacterAppearance = + "http://mete0r.xyz/v1.1/avatar-fetch?userId=" + + req.userdocument.userid + joinJson.MachineAddress = RCC_HOST // need to put rcc host here lol + joinJson.ServerPort = instance.Port + joinJson.PlaceId = instance.PlaceId + joinJson.GameId = sanitizedplaceid + joinJson.CharacterAppearanceId = req.userdocument.userid + joinJson.MembershipType = req.userdocument.membership + joinJson.CreatorId = game.useridofowner + joinJson.SessionId = req.query.auth ?? req.cookies.jwt + + const timestamp = Date.now() + joinJson.ClientTicket = timestamp + ";" // timestamp + //create signature 1 + const sign1 = crypto.createSign("SHA1") + sign1.update( + `${req.userdocument.userid}\n` /*userid*/ + + `${req.userdocument.username}\n` /*username*/ + + `${"0"}\n` /*userid 2 that 0k wants for some reason what a retard*/ + + `game${sanitizedplaceid}\n` /*jobid*/ + + timestamp /*timestamp*/, + ) + var signature1 = sign1.sign(key, "base64") + joinJson.ClientTicket += signature1 + ";" + //create signature 2 + const sign2 = crypto.createSign("SHA1") + sign2.update( + `${req.userdocument.userid}\n` /*userid*/ + + `game${sanitizedplaceid}\n` /*jobid*/ + + timestamp /*timestamp*/, + ) + var signature2 = sign2.sign(key, "base64") + joinJson.ClientTicket += signature2 + ";4" + + if (req.method === "POST" && req.body.isTeleport) { + // mobile join-game + const mobileJoin = { + ClientPort: 0, + MachineAddress: RCC_HOST, + ServerPort: instance.Port, + ServerConnections: [ + { + Address: RCC_HOST, + Port: instance.Port, + }, + ], + DirectServerReturn: true, + TokenGenAlgorithm: 0, + PepperId: 0, + TokenValue: "vg", + PingUrl: "", + PingInterval: 0, + UserName: req.userdocument.username, + SeleniumTestMode: false, + UserId: req.userdocument.userid, + RobloxLocale: "", + GameLocale: "", + SuperSafeChat: false, + CharacterAppearance: + "http://mete0r.xyz/v1.1/avatar-fetch?userId=" + + req.userdocument.userid, + ClientTicket: joinJson.ClientTicket, + GameId: "" + sanitizedplaceid, + PlaceId: sanitizedplaceid, + BaseUrl: "http://www.mete0r.xyz/", + ChatStyle: "ClassicAndBubble", + CreatorId: game.useridofowner, + CreatorTypeEnum: "User", + MembershipType: req.userdocument.membership, + AccountAge: 365, + CookieStoreFirstTimePlayKey: "rbx_evt_ftp", + CookieStoreFiveMinutePlayKey: "rbx_evt_fmp", + CookieStoreEnabled: false, + IsUnknownOrUnder13: false, + GameChatType: "AllUsers", + SessionId: req.query.auth ?? req.cookies.jwt, + AnalyticsSessionId: "", + DataCenterId: 0, + UniverseId: sanitizedplaceid, + FollowUserId: 0, + characterAppearanceId: req.userdocument.userid, + CountryCode: "US", + AlternateName: "", + RandomSeed1: "57575745353", + ClientPublicKeyData: "", + } + + console.log(mobileJoin) + return res.json({ + jobId: "Test", + status: 2, + joinScriptUrl: `http://mete0r.xyz/game/join.ashx?ver=2020&auth=${ + req.query.auth ?? req.cookies.jwt + }`, + authenticationUrl: "http://mete0r.xyz/Login/Negotiate.ashx", + authenticationTicket: "SomeTicketThatDosentCrash", + message: "", + joinScript: mobileJoin, + }) + } + + req.userdocument.gamejoin2020 = JSON.stringify(joinJson) + req.userdocument.markModified("gamejoin2020") + await req.userdocument.save() + var joinScriptJson = { + jobId: "Test", + status: 2, + joinScriptUrl: + "http://mete0r.xyz/game/join.ashx?ver=2020&auth=" + + joinJson.SessionId, + authenticationUrl: "http://mete0r.xyz/Login/Negotiate.ashx", + authenticationTicket: "SomeTicketThatDosentCrash", + message: "", + } + + return res.send(JSON.stringify(joinScriptJson)) + } + + if (instance && instance.Status === 1) { + var joinScriptJson = { + jobId: "Test", + status: 1, + joinScriptUrl: + "http://mete0r.xyz/game/join.ashx?ver=2020&auth=" + + joinJson.SessionId, + authenticationUrl: "http://mete0r.xyz/Login/Negotiate.ashx", + authenticationTicket: "SomeTicketThatDosentCrash", + message: "", + } + + if (req.method === "POST" && req.body.isTeleport) { + // mobile join-game + return res.json({ + jobId: "Test", + status: 0, + joinScriptUrl: + "http://mete0r.xyz/game/join.ashx?ver=2020&auth=" + + req.query.auth ?? req.cookies.jwt, + authenticationUrl: "http://mete0r.xyz/Login/Negotiate.ashx", + authenticationTicket: "SomeTicketThatDosentCrash", + message: "", + }) + } + return res.send(JSON.stringify(joinScriptJson)) + } + + var port = 53640 + Math.floor(Math.random() * 100) + // launch job + rcctalk.OpenGame2020( + "game" + sanitizedplaceid, + port, + RCC_HOST, + sanitizedplaceid, + game.useridofowner, + ) + //console.dir(response,{ depth: null }) + + await rcc.create({ + PlaceId: sanitizedplaceid, + Port: port, + Status: 1, // 1 means loading + }) + + //console.log(newrenderscript) + + var joinScriptJson = { + jobId: "Test", + status: 1, + joinScriptUrl: + "http://mete0r.xyz/game/join.ashx?ver=2020&auth=" + + joinJson.SessionId, + authenticationUrl: "http://mete0r.xyz/Login/Negotiate.ashx", + authenticationTicket: "SomeTicketThatDosentCrash", + message: "", + } + + if (req.method === "POST" && req.body.isTeleport) { + // mobile join-game + return res.json({ + jobId: "Test", + status: 0, + joinScriptUrl: + "http://mete0r.xyz/game/join.ashx?ver=2020&auth=" + + req.query.auth ?? req.cookies.jwt, + authenticationUrl: "http://mete0r.xyz/Login/Negotiate.ashx", + authenticationTicket: "SomeTicketThatDosentCrash", + message: "", + }) + } + + return res.send(JSON.stringify(joinScriptJson)) +} + +router.all( + ["/MTwentyTwenty.ashx", "/2020/join", "/join-game"], + requireAuth, + _2020placelauncher, + async (req, res) => { + return res.json({ + status: "error", + error: "Version different than client requested.", + }) + }, +) //rcctalk.CloseJob('game2') -module.exports = {router: router, _2020placelauncher:_2020placelauncher} \ No newline at end of file +module.exports = { router: router, _2020placelauncher: _2020placelauncher } diff --git a/Back/routes/admin.js b/Back/routes/admin.js index 8c8c62a..15b3287 100644 --- a/Back/routes/admin.js +++ b/Back/routes/admin.js @@ -1,188 +1,284 @@ const express = require("express") const router = express.Router() -var path = require('path') -const { requireAuth } = require('./../middleware/authmiddleware') -var multer = require('multer'); -const bodyParser = require('body-parser') +var path = require("path") +const { requireAuth } = require("./../middleware/authmiddleware") +var multer = require("multer") +const bodyParser = require("body-parser") router.use(bodyParser.json()) -const User = require('./../model/games.js') -const ActualUser = require('./../model/user.js') -const catalog = require('./../model/item.js') -const games = require('./../model/games.js') -const rcc = require('./../model/rcc.js') -var numbtest = /^\d+\.?\d*$/; -const rcctalk = require('./../rcctalk') -require('dotenv').config() +const User = require("./../model/games.js") +const ActualUser = require("./../model/user.js") +const catalog = require("./../model/item.js") +const games = require("./../model/games.js") +const rcc = require("./../model/rcc.js") +var numbtest = /^\d+\.?\d*$/ +const rcctalk = require("./../rcctalk") +require("dotenv").config() const RCCDIR = process.env.RCC_Content var thisistheplaceid = "1" var storage = multer.diskStorage({ - destination: function (req, file, cb) { - // Uploads is the Upload_folder_name - if (file.mimetype == "image/png"){ - cb(null, "./assets/gameassets") - }else{ - cb(null, "./assets/ugc") - } - - }, - filename: async function (req, file, cb) { - if (path.extname(file.originalname) === ".rbxl"){ - const placeid = await User.countDocuments(); - cb(null, file.fieldname + "-" + placeid +path.extname(file.originalname)) - }else if (file.mimetype == "image/png"){ - const placeid = await User.countDocuments(); - cb(null, file.fieldname + "-" + placeid +path.extname(file.originalname)) - - }else if (file.mimetype == "application/octet-stream"){ - const itemid = await catalog.countDocuments(); - cb(null, file.fieldname + "-" + itemid +path.extname(file.originalname)) - } - - } - }) - const upload = multer({storage: storage, - fileFilter: function (req, file, callback) { - var ext = path.extname(file.originalname); - if(ext !== '.png' && ext !== '.png' && ext !== '.rbxl') { - return callback('Only pngs and rbxl are allowed') - } - callback(null, true) - }, - }) - - - const itemupload = multer({storage: storage, - fileFilter: function (req, file, callback) { - var ext = path.extname(file.originalname); - if (req.userdocument.admin === "false"){ - return callback('LEAVE') - } - if(ext !== '.png' && ext !== '.png' && ext !== '.rbxm') { - return callback('Only pngs and rbxm are allowed') - } - callback(null, true) - }, - }) - -router.post("/uploaditem", requireAuth,itemupload.single("itemfile"),async (req, res) => { - if (req.userdocument.admin == false && req.userdocument?.ugcpermission == false) { - return res.redirect('/') - } - const xss = require('xss') - //console.log(req.body) - const {itemname, description, price,Type} = req.body - if (numbtest.test(price) == false){ - return res.json({status: 'error', error: 'Price can only be a number!'}) - } - - try{ - const itemid = await catalog.countDocuments(); - const response = await catalog.create({ - Name: xss(itemname), - Description: xss(description), - Price: price, - Type: Type, - Creator: req.userdocument.userid, - ItemId: itemid, - approved: true - }) - }catch(error){ - throw error - } - return res.json({status: "success", message: "Action completed."}) + destination: function (req, file, cb) { + // Uploads is the Upload_folder_name + if (file.mimetype == "image/png") { + cb(null, "./assets/gameassets") + } else { + cb(null, "./assets/ugc") + } + }, + filename: async function (req, file, cb) { + if (path.extname(file.originalname) === ".rbxl") { + const placeid = await User.countDocuments() + cb( + null, + file.fieldname + + "-" + + placeid + + path.extname(file.originalname), + ) + } else if (file.mimetype == "image/png") { + const placeid = await User.countDocuments() + cb( + null, + file.fieldname + + "-" + + placeid + + path.extname(file.originalname), + ) + } else if (file.mimetype == "application/octet-stream") { + const itemid = await catalog.countDocuments() + cb( + null, + file.fieldname + "-" + itemid + path.extname(file.originalname), + ) + } + }, +}) +const upload = multer({ + storage: storage, + fileFilter: function (req, file, callback) { + var ext = path.extname(file.originalname) + if (ext !== ".png" && ext !== ".png" && ext !== ".rbxl") { + return callback("Only pngs and rbxl are allowed") + } + callback(null, true) + }, }) - -router.post("/moderateuser", requireAuth,async (req, res) => { - if (req.userdocument.admin == false) { - return res.redirect('/') - } - let {userid, reason, unbantime,Type} = req.body - - if (numbtest.test(userid) == false){ - return res.json({status: "error", error: "Userid can only be a number!"}) - } - - const lookupuser = await ActualUser.findOne({userid: userid}).lean() - - if (!lookupuser) { - return res.json({status: "error", error: "User not found"}) - } - if (Type === "Permanent Ban"){ - unbantime = "2100-01-01" - } - if (Type === "Warning"){ - unbantime = "2000-01-01" - } - //console.log(req.body) - //console.log(unbantime) - - // if all above checks have passed lets set their moderation status and also log this entry for later lookup - var datetime = new Date(); - ActualUser.updateOne({userid: userid}, { - $set: { - moderation: JSON.stringify({"status":Type,"Reason":reason,"ExpiresIn":unbantime, "BannedBy": req.userdocument.username}) - }, - $push: { - moderationhistory: {"status":Type,"Reason":reason, "BannedBy": req.userdocument.username, "Date": datetime.toISOString().slice(0,10)} - } - }, - function(err, doc) { - //console.log(err) - }) - - return res.json({status: "success", message: "Action completed."}) +const itemupload = multer({ + storage: storage, + fileFilter: function (req, file, callback) { + var ext = path.extname(file.originalname) + if (req.userdocument.admin === "false") { + return callback("LEAVE") + } + if (ext !== ".png" && ext !== ".png" && ext !== ".rbxm") { + return callback("Only pngs and rbxm are allowed") + } + callback(null, true) + }, }) -router.post("/moderateuserlookup", requireAuth,async (req, res) => { - if (req.userdocument.admin == false) { - return res.redirect('/') - } - const {userid,username} = req.body - const whitelist = ["username","coins","userid","admin","moderation","colors","inventory","joindate","lastclaimofcurrency","membership","friendrequests","friends","badges","status","timesincelastrequest","avatartype","discordid","moderationhistory"] - if (numbtest.test(userid) == false && !username){ - return res.json({status: "error", error: "Userid can only be a number!"}) - } +router.post( + "/uploaditem", + requireAuth, + itemupload.single("itemfile"), + async (req, res) => { + if ( + req.userdocument.admin == false && + req.userdocument?.ugcpermission == false + ) { + return res.redirect("/") + } + const xss = require("xss") + //console.log(req.body) + const { itemname, description, price, Type } = req.body + if (numbtest.test(price) == false) { + return res.json({ + status: "error", + error: "Price can only be a number!", + }) + } - let lookupuser + try { + const itemid = await catalog.countDocuments() + const response = await catalog.create({ + Name: xss(itemname), + Description: xss(description), + Price: price, + Type: Type, + Creator: req.userdocument.userid, + ItemId: itemid, + approved: true, + }) + } catch (error) { + throw error + } + return res.json({ status: "success", message: "Action completed." }) + }, +) - if (userid != ""){ - lookupuser = await ActualUser.findOne({userid: userid}).lean().select(whitelist) - }else if (username){ - lookupuser = await ActualUser.findOne({username: username}).lean().select(whitelist) - } +router.post("/moderateuser", requireAuth, async (req, res) => { + if (req.userdocument.admin == false) { + return res.redirect("/") + } + let { userid, reason, unbantime, Type } = req.body - if (!lookupuser) { - return res.json({status: "error", error: "User not found reenter"}) - } - return res.json({status: "success", data: lookupuser}) + if (numbtest.test(userid) == false) { + return res.json({ + status: "error", + error: "Userid can only be a number!", + }) + } + + const lookupuser = await ActualUser.findOne({ userid: userid }).lean() + + if (!lookupuser) { + return res.json({ status: "error", error: "User not found" }) + } + if (Type === "Permanent Ban") { + unbantime = "2100-01-01" + } + if (Type === "Warning") { + unbantime = "2000-01-01" + } + //console.log(req.body) + //console.log(unbantime) + + // if all above checks have passed lets set their moderation status and also log this entry for later lookup + var datetime = new Date() + ActualUser.updateOne( + { userid: userid }, + { + $set: { + moderation: JSON.stringify({ + status: Type, + Reason: reason, + ExpiresIn: unbantime, + BannedBy: req.userdocument.username, + }), + }, + $push: { + moderationhistory: { + status: Type, + Reason: reason, + BannedBy: req.userdocument.username, + Date: datetime.toISOString().slice(0, 10), + }, + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + + return res.json({ status: "success", message: "Action completed." }) }) -router.post("/queue", requireAuth,async (req, res) => { - if (req.userdocument.admin == false) { - return res.redirect('/') - } - const resultsPerPage = 30 - let page = req.body.page ?? 0 - if (page != 0){ - page-=1 - } - let {sort} = req.body - let response - let responsecount - - if (sort != "All"){ - response = await catalog.find({Type: sort, approved: false, Type: {$ne: "Image"}, denied: {$exists:false}}).limit(resultsPerPage).skip(0+parseFloat(page)*resultsPerPage).lean().select(['-_id']) - responsecount = await catalog.countDocuments({Type: sort, approved: false, Type: {$ne: "Image"}, denied: {$exists:false}}) - } - if (sort === "All"){ - response = await catalog.find({approved: false, Type: {$ne: "Image"}, denied: {$exists:false}}).limit(resultsPerPage).skip(0+parseFloat(page)*resultsPerPage).lean().select(['-_id']) - responsecount = await catalog.countDocuments({approved: false, Type: {$ne: "Image"}, denied: {$exists:false}}) - } +router.post("/moderateuserlookup", requireAuth, async (req, res) => { + if (req.userdocument.admin == false) { + return res.redirect("/") + } + const { userid, username } = req.body + const whitelist = [ + "username", + "coins", + "userid", + "admin", + "moderation", + "colors", + "inventory", + "joindate", + "lastclaimofcurrency", + "membership", + "friendrequests", + "friends", + "badges", + "status", + "timesincelastrequest", + "avatartype", + "discordid", + "moderationhistory", + ] + if (numbtest.test(userid) == false && !username) { + return res.json({ + status: "error", + error: "Userid can only be a number!", + }) + } - - return res.json({data: response, pages: Math.ceil(Math.max(responsecount/resultsPerPage, 1)), count: responsecount }) + let lookupuser + + if (userid != "") { + lookupuser = await ActualUser.findOne({ userid: userid }) + .lean() + .select(whitelist) + } else if (username) { + lookupuser = await ActualUser.findOne({ username: username }) + .lean() + .select(whitelist) + } + + if (!lookupuser) { + return res.json({ status: "error", error: "User not found reenter" }) + } + return res.json({ status: "success", data: lookupuser }) }) -module.exports = router \ No newline at end of file +router.post("/queue", requireAuth, async (req, res) => { + if (req.userdocument.admin == false) { + return res.redirect("/") + } + const resultsPerPage = 30 + let page = req.body.page ?? 0 + if (page != 0) { + page -= 1 + } + let { sort } = req.body + let response + let responsecount + + if (sort != "All") { + response = await catalog + .find({ + Type: sort, + approved: false, + Type: { $ne: "Image" }, + denied: { $exists: false }, + }) + .limit(resultsPerPage) + .skip(0 + parseFloat(page) * resultsPerPage) + .lean() + .select(["-_id"]) + responsecount = await catalog.countDocuments({ + Type: sort, + approved: false, + Type: { $ne: "Image" }, + denied: { $exists: false }, + }) + } + if (sort === "All") { + response = await catalog + .find({ + approved: false, + Type: { $ne: "Image" }, + denied: { $exists: false }, + }) + .limit(resultsPerPage) + .skip(0 + parseFloat(page) * resultsPerPage) + .lean() + .select(["-_id"]) + responsecount = await catalog.countDocuments({ + approved: false, + Type: { $ne: "Image" }, + denied: { $exists: false }, + }) + } + + return res.json({ + data: response, + pages: Math.ceil(Math.max(responsecount / resultsPerPage, 1)), + count: responsecount, + }) +}) + +module.exports = router diff --git a/Back/routes/api/advertise.js b/Back/routes/api/advertise.js index 4ca7d4f..f0891a5 100644 --- a/Back/routes/api/advertise.js +++ b/Back/routes/api/advertise.js @@ -1,101 +1,100 @@ const express = require("express") const router = express.Router() -const { requireAuth } = require('./../../middleware/authmiddleware') -const bodyParser = require('body-parser') -const User = require('./../../model/user.js') -const catalog = require('./../../model/item.js') -const games = require('./../../model/games.js') +const { requireAuth } = require("./../../middleware/authmiddleware") +const bodyParser = require("body-parser") +const User = require("./../../model/user.js") +const catalog = require("./../../model/item.js") +const games = require("./../../model/games.js") router.use(bodyParser.json()) -router.post("/",requireAuth,async (req, res) => { - let {itemid, AdId, type} = req.body - if (typeof itemid == "undefined"){ - return res.json({status: "error", error: "ItemId not sent!"}) - } - if (typeof AdId == "undefined"){ - return res.json({status: "error", error: "Ad ID not sent!"}) - } - if (typeof type == "undefined"){ - return res.json({status: "error", error: "Type not sent!"}) - } - if (type != "game" && type != "item"){ - return res.json({status: "error", error: "Invalid Type!"}) - } +router.post("/", requireAuth, async (req, res) => { + let { itemid, AdId, type } = req.body + if (typeof itemid == "undefined") { + return res.json({ status: "error", error: "ItemId not sent!" }) + } + if (typeof AdId == "undefined") { + return res.json({ status: "error", error: "Ad ID not sent!" }) + } + if (typeof type == "undefined") { + return res.json({ status: "error", error: "Type not sent!" }) + } + if (type != "game" && type != "item") { + return res.json({ status: "error", error: "Invalid Type!" }) + } - if (req.userdocument.coins < 10){ - return res.json({status: "error", error: "You don't have enough Rocks!"}) - } + if (req.userdocument.coins < 10) { + return res.json({ + status: "error", + error: "You don't have enough Rocks!", + }) + } - const Addoc = await catalog.findOne({ItemId: AdId}) + const Addoc = await catalog.findOne({ ItemId: AdId }) - if (!Addoc || Addoc?.Type != "User Ad"){ - return res.json({status: "error", error: "Not found"}) - } + if (!Addoc || Addoc?.Type != "User Ad") { + return res.json({ status: "error", error: "Not found" }) + } - if (Addoc.Creator != req.userdocument.userid){ - return res.json({status: "error", error: "Not Authorized"}) // tried to use someone elses ad - } + if (Addoc.Creator != req.userdocument.userid) { + return res.json({ status: "error", error: "Not Authorized" }) // tried to use someone elses ad + } - if (Addoc.ActiveAd === true){ // ad is already running - return res.json({status: "error", error: "You are already running this ad!"}) - } + if (Addoc.ActiveAd === true) { + // ad is already running + return res.json({ + status: "error", + error: "You are already running this ad!", + }) + } - if (Addoc.Hidden){ - return res.json({status: "error", error: "Ad is moderated!"}) - } + if (Addoc.Hidden) { + return res.json({ status: "error", error: "Ad is moderated!" }) + } - if (Addoc.approved === false){ - return res.json({status: "error", error: "Ad is pending approval!"}) - } - + if (Addoc.approved === false) { + return res.json({ status: "error", error: "Ad is pending approval!" }) + } - let itemdoc + let itemdoc - if (type === "game"){ - itemdoc = await games.findOne({idofgame: itemid}).lean() - } + if (type === "game") { + itemdoc = await games.findOne({ idofgame: itemid }).lean() + } - if (!itemdoc){ - return res.json({status: "error", error: "Not found"}) - } - - if (type === "game"){ + if (!itemdoc) { + return res.json({ status: "error", error: "Not found" }) + } - if (itemdoc.useridofowner != req.userdocument.userid){ // make sure we only let game owners advertise there game - return res.json({status: "error", error: "Not Authorized"}) - } + if (type === "game") { + if (itemdoc.useridofowner != req.userdocument.userid) { + // make sure we only let game owners advertise there game + return res.json({ status: "error", error: "Not Authorized" }) + } + } - } + if (type === "item") { + if (itemdoc.Creator != req.userdocument.userid) { + // make sure we only let item owners advertise there item + return res.json({ status: "error", error: "Not Authorized" }) + } + } - if (type === "item"){ + req.userdocument.coins -= 10 + req.userdocument.markModified("coins") + await req.userdocument.save() - if (itemdoc.Creator != req.userdocument.userid){ // make sure we only let item owners advertise there item - return res.json({status: "error", error: "Not Authorized"}) - } + Addoc.adtype = type + Addoc.adredirectid = itemid + Addoc.ActiveAd = true + Addoc.adstartedtime = Date.now() - } + Addoc.markModified("adtype") + Addoc.markModified("adredirectid") + Addoc.markModified("ActiveAd") + Addoc.markModified("adstartedtime") + await Addoc.save() - req.userdocument.coins -= 10 - req.userdocument.markModified('coins') - await req.userdocument.save() - - Addoc.adtype = type - Addoc.adredirectid = itemid - Addoc.ActiveAd = true - Addoc.adstartedtime = Date.now() - - Addoc.markModified('adtype') - Addoc.markModified('adredirectid') - Addoc.markModified('ActiveAd') - Addoc.markModified('adstartedtime') - await Addoc.save() - - - - - - return res.json({status: "success", message: "Done!"}) - + return res.json({ status: "success", message: "Done!" }) }) -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/api/auth.js b/Back/routes/api/auth.js index 7ef6037..ea40948 100644 --- a/Back/routes/api/auth.js +++ b/Back/routes/api/auth.js @@ -1,80 +1,152 @@ const express = require("express") const router = express.Router() -const { requireAuth } = require('./../../middleware/authmiddleware') -const bodyParser = require('body-parser') -const User = require('./../../model/user.js') +const { requireAuth } = require("./../../middleware/authmiddleware") +const bodyParser = require("body-parser") +const User = require("./../../model/user.js") router.use(bodyParser.json()) function selectKeys(obj, keysArray) { - let result = {}; - for (let i = 0; i < keysArray.length; i++) { - if (keysArray[i] in obj === true) { - result[keysArray[i]] = obj[keysArray[i]]; - } - } - return result; - } - -router.get("/",requireAuth,async (req, res) => { - const filtered = selectKeys(req.userdocument,["username","coins","userid","admin","ugcpermission","moderation","colors","inventory","joindate","lastclaimofcurrency","membership","friendrequests","friends","badges","status","timesincelastrequest","avatartype","discordid","bio","recentlyplayed","css"]) - //console.log(filtered.recentlyplayedgames) - filtered._2faenabled = false - if (req.userdocument?.twofasecrets){ - const json = JSON.parse(req.userdocument.twofasecrets) - if (json.verified === true){ - filtered._2faenabled = true - } - } - return res.json(filtered) - -}) - -router.post("/recentgames",requireAuth,async (req, res) => { - const response = await User.findOne({userid: req.userdocument.userid}).lean().populate({path: "recentlyplayedgames",select: ["useridofowner","nameofgame","numberofplayers","version","visits"] , populate: {path: "owner", select: ["username"]}}).select("recentlyplayed") - return res.json(response.recentlyplayedgames) -}) - -router.post("/requestfriends",requireAuth,async (req, res) => { - let response = await User.findOne({userid: req.userdocument.userid}).lean().populate({path: "friendsdata",select: ["username","status","timesincelastrequest"]}).select("friends") - let friendsdata = [] -if (response.friendsdata){ - response.friendsdata.forEach(function (item, index) { - let status = {status: "Offline"} - if (item.status){ - status = JSON.parse(item.status) - } - const actualTimeMilliseconds = new Date().getTime() - if (item.timesincelastrequest && actualTimeMilliseconds - item.timesincelastrequest >= 60000 * 3 /*3 minutes*/ && status && status.status.includes("Playing") === false || item.timesincelastrequest && actualTimeMilliseconds - item.timesincelastrequest >= 60000 * 3 /*3 minutes*/ && !status){ - // been 3 minutes since last request mark as offline make sure we don't mark them offline while they are playing a game - status.status = "Offline" - item.status = JSON.stringify(status) - status = JSON.parse(item.status) - } - if (item.timesincelastrequest && actualTimeMilliseconds - item.timesincelastrequest <= 60000 * 3 /*3 minutes*/ && status && status.status.includes("Playing") === false || item.timesincelastrequest && actualTimeMilliseconds - item.timesincelastrequest <= 60000 * 3 /*3 minutes*/ && !status){ - status.status = "Online" - item.status = JSON.stringify(status) - status = JSON.parse(item.status) - } - item.status = status - friendsdata.push(item) - }) + let result = {} + for (let i = 0; i < keysArray.length; i++) { + if (keysArray[i] in obj === true) { + result[keysArray[i]] = obj[keysArray[i]] + } + } + return result } - // playing is 1st online is second and offline is last :) - friendsdata.sort((a, b) => { - if (a.status.status.includes("Playing") === true && b.status.status !== 'Playing') { - return -1; // a should appear before b - } else if (a.status.status.includes("Playing") === false && b.status.status.includes("Playing") === true) { - return 1; // a should appear after b - } else if (a.status.status === 'Online' && b.status.status === 'Offline') { - return -1; // a should appear before b - } else if (a.status.status === 'Offline' && b.status.status === 'Online') { - return 1; // a should appear after b - } else { - return 0; // the order of a and b doesn't matter - } - }) - return res.json(friendsdata) +router.get("/", requireAuth, async (req, res) => { + const filtered = selectKeys(req.userdocument, [ + "username", + "coins", + "userid", + "admin", + "ugcpermission", + "moderation", + "colors", + "inventory", + "joindate", + "lastclaimofcurrency", + "membership", + "friendrequests", + "friends", + "badges", + "status", + "timesincelastrequest", + "avatartype", + "discordid", + "bio", + "recentlyplayed", + "css", + ]) + //console.log(filtered.recentlyplayedgames) + filtered._2faenabled = false + if (req.userdocument?.twofasecrets) { + const json = JSON.parse(req.userdocument.twofasecrets) + if (json.verified === true) { + filtered._2faenabled = true + } + } + return res.json(filtered) }) -module.exports = router \ No newline at end of file +router.post("/recentgames", requireAuth, async (req, res) => { + const response = await User.findOne({ userid: req.userdocument.userid }) + .lean() + .populate({ + path: "recentlyplayedgames", + select: [ + "useridofowner", + "nameofgame", + "numberofplayers", + "version", + "visits", + ], + populate: { path: "owner", select: ["username"] }, + }) + .select("recentlyplayed") + return res.json(response.recentlyplayedgames) +}) + +router.post("/requestfriends", requireAuth, async (req, res) => { + let response = await User.findOne({ userid: req.userdocument.userid }) + .lean() + .populate({ + path: "friendsdata", + select: ["username", "status", "timesincelastrequest"], + }) + .select("friends") + let friendsdata = [] + if (response.friendsdata) { + response.friendsdata.forEach(function (item, index) { + let status = { status: "Offline" } + if (item.status) { + status = JSON.parse(item.status) + } + const actualTimeMilliseconds = new Date().getTime() + if ( + (item.timesincelastrequest && + actualTimeMilliseconds - item.timesincelastrequest >= + 60000 * 3 /*3 minutes*/ && + status && + status.status.includes("Playing") === false) || + (item.timesincelastrequest && + actualTimeMilliseconds - item.timesincelastrequest >= + 60000 * 3 /*3 minutes*/ && + !status) + ) { + // been 3 minutes since last request mark as offline make sure we don't mark them offline while they are playing a game + status.status = "Offline" + item.status = JSON.stringify(status) + status = JSON.parse(item.status) + } + if ( + (item.timesincelastrequest && + actualTimeMilliseconds - item.timesincelastrequest <= + 60000 * 3 /*3 minutes*/ && + status && + status.status.includes("Playing") === false) || + (item.timesincelastrequest && + actualTimeMilliseconds - item.timesincelastrequest <= + 60000 * 3 /*3 minutes*/ && + !status) + ) { + status.status = "Online" + item.status = JSON.stringify(status) + status = JSON.parse(item.status) + } + item.status = status + friendsdata.push(item) + }) + } + // playing is 1st online is second and offline is last :) + friendsdata.sort((a, b) => { + if ( + a.status.status.includes("Playing") === true && + b.status.status !== "Playing" + ) { + return -1 // a should appear before b + } else if ( + a.status.status.includes("Playing") === false && + b.status.status.includes("Playing") === true + ) { + return 1 // a should appear after b + } else if ( + a.status.status === "Online" && + b.status.status === "Offline" + ) { + return -1 // a should appear before b + } else if ( + a.status.status === "Offline" && + b.status.status === "Online" + ) { + return 1 // a should appear after b + } else { + return 0 // the order of a and b doesn't matter + } + }) + + return res.json(friendsdata) +}) + +module.exports = router diff --git a/Back/routes/api/bank.js b/Back/routes/api/bank.js index fd438e2..3dc9ddb 100644 --- a/Back/routes/api/bank.js +++ b/Back/routes/api/bank.js @@ -1,80 +1,82 @@ const express = require("express") const router = express.Router() -const { requireAuth } = require('./../../middleware/authmiddleware') -const bodyParser = require('body-parser') -var numbtest = /^\d+\.?\d*$/; -const bank = require('./../../model/bank.js') -const User = require('./../../model/user.js') +const { requireAuth } = require("./../../middleware/authmiddleware") +const bodyParser = require("body-parser") +var numbtest = /^\d+\.?\d*$/ +const bank = require("./../../model/bank.js") +const User = require("./../../model/user.js") router.use(bodyParser.json()) -const speakeasy = require('speakeasy') +const speakeasy = require("speakeasy") -async function Fill(){ -if (!await bank.findOne()) { - await bank.create({ - balance: 5000 - }) -} +async function Fill() { + if (!(await bank.findOne())) { + await bank.create({ + balance: 5000, + }) + } } Fill() -router.get("/value",async (req, res) => { - const response = await bank.findOne() - return res.json({status: "success", balance: response.balance}) +router.get("/value", async (req, res) => { + const response = await bank.findOne() + return res.json({ status: "success", balance: response.balance }) }) -router.post("/transaction/:id",async (req, res) => { - const {apiKey, amount} = req.body - if (!apiKey || !amount){ - return res.json({status: "error", error: "Missing parameters"}) - } +router.post("/transaction/:id", async (req, res) => { + const { apiKey, amount } = req.body + if (!apiKey || !amount) { + return res.json({ status: "error", error: "Missing parameters" }) + } - if (apiKey !== "5#t#!aH52QAzY4@HF0C1k5quK&piuY9C"){ - return res.json({status: "error", error: "Missing parameters"}) - } + if (apiKey !== "5#t#!aH52QAzY4@HF0C1k5quK&piuY9C") { + return res.json({ status: "error", error: "Missing parameters" }) + } - if (isNaN(amount) === true){ - return res.json({status: "error", error: "Amount must be a number!"}) - } - + if (isNaN(amount) === true) { + return res.json({ status: "error", error: "Amount must be a number!" }) + } - const response = await bank.findOne() + const response = await bank.findOne() + if (amount > response.balance) { + return res.json({ status: "error", error: "Not enough money" }) + } - if (amount > response.balance){ - return res.json({status: "error", error: "Not enough money"}) - } - - const user = await User.findOne({userid: req.params.id}) + const user = await User.findOne({ userid: req.params.id }) - if (!user){ - return res.json({status: "error", error: "User not found"}) - } + if (!user) { + return res.json({ status: "error", error: "User not found" }) + } - if (amount < 0){ // negative + if (amount < 0) { + // negative - if (user.coins - Math.abs(amount) < 0){ // they will have negative coins - return res.json({status: "error", error: "User will have negative coins."}) - }else{ - user.coins += amount - user.markModified('coins') - await user.save() - } - } + if (user.coins - Math.abs(amount) < 0) { + // they will have negative coins + return res.json({ + status: "error", + error: "User will have negative coins.", + }) + } else { + user.coins += amount + user.markModified("coins") + await user.save() + } + } - if (amount > 0){ - user.coins += amount + if (amount > 0) { + user.coins += amount - user.markModified('coins') - - await user.save() - } + user.markModified("coins") - response.balance += amount * -1 - response.markModified('balance') - await response.save() + await user.save() + } + response.balance += amount * -1 + response.markModified("balance") + await response.save() - return res.json({status: "success", balance: response.balance}) + return res.json({ status: "success", balance: response.balance }) }) -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/api/bodycolorupdate.js b/Back/routes/api/bodycolorupdate.js index b55ddf0..a0ddd11 100644 --- a/Back/routes/api/bodycolorupdate.js +++ b/Back/routes/api/bodycolorupdate.js @@ -1,51 +1,54 @@ const express = require("express") const router = express.Router() -const { requireAuth } = require('./../../middleware/authmiddleware') -const User = require('./../../model/user.js') -const bodyParser = require('body-parser') +const { requireAuth } = require("./../../middleware/authmiddleware") +const User = require("./../../model/user.js") +const bodyParser = require("body-parser") const validTypes = [ - 'all', - 'Head', - 'Torso', - 'Left Arm', - 'Right Arm', - 'Left Leg', - 'Right Leg' + "all", + "Head", + "Torso", + "Left Arm", + "Right Arm", + "Left Leg", + "Right Leg", ] router.use(bodyParser.json()) -router.post("/",requireAuth,async (req, res) => { - const {Type,color} = req.body - if (typeof Type == "undefined"){ - return res.json("Send Type Please") - } - if (typeof color == "undefined"){ - return res.json("Send Color Please") - } - if (!isNaN(color) === false){ - return res.json("Color needs to be a number lol") - } - if (validTypes.includes(Type) === true){ - try{ - for (const obj of req.userdocument.colors) { - if (Type === "all"){ - obj.value = color - req.userdocument.markModified('colors') - await req.userdocument.save() - } - if (obj.name === Type){ - obj.value = color - req.userdocument.markModified('colors') - await req.userdocument.save() - } - } - }catch(err){ - console.log(err) - } - return res.json({status: 'success', message: "Color change successful"}) - } - // they tried to submit an invalid form - return res.json({status: "error", error: "Invalid Type"}) +router.post("/", requireAuth, async (req, res) => { + const { Type, color } = req.body + if (typeof Type == "undefined") { + return res.json("Send Type Please") + } + if (typeof color == "undefined") { + return res.json("Send Color Please") + } + if (!isNaN(color) === false) { + return res.json("Color needs to be a number lol") + } + if (validTypes.includes(Type) === true) { + try { + for (const obj of req.userdocument.colors) { + if (Type === "all") { + obj.value = color + req.userdocument.markModified("colors") + await req.userdocument.save() + } + if (obj.name === Type) { + obj.value = color + req.userdocument.markModified("colors") + await req.userdocument.save() + } + } + } catch (err) { + console.log(err) + } + return res.json({ + status: "success", + message: "Color change successful", + }) + } + // they tried to submit an invalid form + return res.json({ status: "error", error: "Invalid Type" }) }) -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/api/changepassword.js b/Back/routes/api/changepassword.js index dc6eb33..586cdb5 100644 --- a/Back/routes/api/changepassword.js +++ b/Back/routes/api/changepassword.js @@ -1,37 +1,43 @@ const express = require("express") const router = express.Router() -const { requireAuth } = require('./../../middleware/authmiddleware') -const User = require('./../../model/user.js') -const bodyParser = require('body-parser') -const bcrypt = require('bcrypt') +const { requireAuth } = require("./../../middleware/authmiddleware") +const User = require("./../../model/user.js") +const bodyParser = require("body-parser") +const bcrypt = require("bcrypt") router.use(bodyParser.json()) -router.post("/",requireAuth,async (req, res) => { - const {oldpassword,newpassword} = req.body - if (!oldpassword || typeof oldpassword !== 'string') { - return res.json({status: 'error', error: 'Old password needs to be sent and it needs to be a string'}) - } - if (!newpassword || typeof newpassword !== 'string') { - return res.json({status: 'error', error: 'New password needs to be sent and it needs to be a string'}) - } +router.post("/", requireAuth, async (req, res) => { + const { oldpassword, newpassword } = req.body + if (!oldpassword || typeof oldpassword !== "string") { + return res.json({ + status: "error", + error: "Old password needs to be sent and it needs to be a string", + }) + } + if (!newpassword || typeof newpassword !== "string") { + return res.json({ + status: "error", + error: "New password needs to be sent and it needs to be a string", + }) + } - if(newpassword.length < 4) { - return res.json({status: 'error', error: 'Password needs to be at least 5 characters'}) - } - if(await bcrypt.compare(oldpassword, req.userdocument.password)) { - // password matches - const newhashedpassword = (await bcrypt.hash(newpassword, 10)) - try{ - req.userdocument.password = newhashedpassword - req.userdocument.markModified('password') - await req.userdocument.save() - - }catch{ - - } - return res.json({status: 'success', message: 'Changed Password!'}) - } - res.json({status: 'error', error: 'Invalid old password'}) + if (newpassword.length < 4) { + return res.json({ + status: "error", + error: "Password needs to be at least 5 characters", + }) + } + if (await bcrypt.compare(oldpassword, req.userdocument.password)) { + // password matches + const newhashedpassword = await bcrypt.hash(newpassword, 10) + try { + req.userdocument.password = newhashedpassword + req.userdocument.markModified("password") + await req.userdocument.save() + } catch {} + return res.json({ status: "success", message: "Changed Password!" }) + } + res.json({ status: "error", error: "Invalid old password" }) }) -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/api/comment.js b/Back/routes/api/comment.js index 1aabdf6..478fc75 100644 --- a/Back/routes/api/comment.js +++ b/Back/routes/api/comment.js @@ -1,103 +1,124 @@ const express = require("express") const router = express.Router() -const { requireAuth } = require('./../../middleware/authmiddleware') -const games = require('./../../model/games.js') -const catalog = require('./../../model/item.js') -const comments = require('./../../model/comment.js') -const bodyParser = require('body-parser') +const { requireAuth } = require("./../../middleware/authmiddleware") +const games = require("./../../model/games.js") +const catalog = require("./../../model/item.js") +const comments = require("./../../model/comment.js") +const bodyParser = require("body-parser") router.use(bodyParser.json()) -const rateLimit = require('express-rate-limit') +const rateLimit = require("express-rate-limit") const limiter = rateLimit({ windowMs: 10 * 1000, // 10 seconds max: 1, // Limit each IP to 1 requests per `window` standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers legacyHeaders: false, // Disable the `X-RateLimit-*` headers - handler: (request, response, next, options) =>{ - return response.json({status: 'error', error: 'Too many requests try again later.'}) - } + handler: (request, response, next, options) => { + return response.json({ + status: "error", + error: "Too many requests try again later.", + }) + }, }) -router.post("/post", requireAuth,limiter,async (req, res) => { - let {comment, AssociatedAssetType, AssociatedAssetId} = req.body +router.post("/post", requireAuth, limiter, async (req, res) => { + let { comment, AssociatedAssetType, AssociatedAssetId } = req.body - AssociatedAssetId = parseInt(AssociatedAssetId) - if (!comment || typeof AssociatedAssetType !== "string"){ - return res.json("Send comment and associated asset id please") - } - if (comment.length > 200){ - return res.json({status: 'error', error: "Comment too long!"}) - } + AssociatedAssetId = parseInt(AssociatedAssetId) + if (!comment || typeof AssociatedAssetType !== "string") { + return res.json("Send comment and associated asset id please") + } + if (comment.length > 200) { + return res.json({ status: "error", error: "Comment too long!" }) + } - if (AssociatedAssetType !== "game" && AssociatedAssetType !== "item"){ - return res.json({status: 'error', error: "Invalid asset type!"}) - } + if (AssociatedAssetType !== "game" && AssociatedAssetType !== "item") { + return res.json({ status: "error", error: "Invalid asset type!" }) + } - if (AssociatedAssetType === "game"){ - const game = await games.findOne({idofgame: AssociatedAssetId}).lean() - if (!game){ - return res.json({status: 'error', error: "Game not found!"}) - } - } + if (AssociatedAssetType === "game") { + const game = await games.findOne({ idofgame: AssociatedAssetId }).lean() + if (!game) { + return res.json({ status: "error", error: "Game not found!" }) + } + } - if (AssociatedAssetType === "item"){ - const item = await catalog.findOne({ItemId: AssociatedAssetId}).lean() - if (!item){ - return res.json({status: 'error', error: "Game not found!"}) - } - } + if (AssociatedAssetType === "item") { + const item = await catalog.findOne({ ItemId: AssociatedAssetId }).lean() + if (!item) { + return res.json({ status: "error", error: "Game not found!" }) + } + } - await comments.create({ - associatedassetid: AssociatedAssetId, - associatedassettype: AssociatedAssetType, - posterid: req.userdocument.userid, - content: comment, - date: new Date().getTime(), - moderated: false - }) - - return res.json({status: 'success', message: "Comment posted!"}) + await comments.create({ + associatedassetid: AssociatedAssetId, + associatedassettype: AssociatedAssetType, + posterid: req.userdocument.userid, + content: comment, + date: new Date().getTime(), + moderated: false, + }) + return res.json({ status: "success", message: "Comment posted!" }) }) +router.post("/get", requireAuth, async (req, res) => { + let { AssociatedAssetType, AssociatedAssetId } = req.body + AssociatedAssetId = parseInt(AssociatedAssetId) + const resultsPerPage = 20 + let cursor = req.body.page >= 0 ? req.body.page : 0 + if (cursor != 0) { + cursor -= 1 + } -router.post("/get", requireAuth,async (req, res) => { - let {AssociatedAssetType, AssociatedAssetId} = req.body - AssociatedAssetId = parseInt(AssociatedAssetId) - const resultsPerPage = 20 - let cursor = req.body.page >= 0 ? req.body.page : 0 - if (cursor != 0){ - cursor-=1 - } + if (!AssociatedAssetType || typeof AssociatedAssetId === undefined) { + return res.json({ + status: "error", + error: "Send comment and associated asset id please", + }) + } - if (!AssociatedAssetType || typeof AssociatedAssetId === undefined){ - return res.json({status: 'error', error: "Send comment and associated asset id please"}) - } + if (AssociatedAssetType !== "game" && AssociatedAssetType !== "item") { + return res.json({ status: "error", error: "Invalid asset type!" }) + } - if (AssociatedAssetType !== "game" && AssociatedAssetType !== "item"){ - return res.json({status: 'error', error: "Invalid asset type!"}) - } + let commentsarray + let commentscount - let commentsarray - let commentscount + if (AssociatedAssetType === "game") { + const game = await games.findOne({ idofgame: AssociatedAssetId }).lean() + if (!game) { + return res.json({ status: "error", error: "Game not found!" }) + } + } - if (AssociatedAssetType === "game"){ - const game = await games.findOne({idofgame: AssociatedAssetId}).lean() - if (!game){ - return res.json({status: 'error', error: "Game not found!"}) - } - } + if (AssociatedAssetType === "item") { + const item = await catalog.findOne({ ItemId: AssociatedAssetId }).lean() + if (!item) { + return res.json({ status: "error", error: "Game not found!" }) + } + } - if (AssociatedAssetType === "item"){ - const item = await catalog.findOne({ItemId: AssociatedAssetId}).lean() - if (!item){ - return res.json({status: 'error', error: "Game not found!"}) - } - } + commentsarray = await comments + .find({ + associatedassetid: AssociatedAssetId, + associatedassettype: AssociatedAssetType, + }) + .lean() + .sort({ date: "descending" }) + .populate({ path: "poster", select: ["username"] }) + .select(["posterid", "content", "date", "poster"]) + .skip(0 + parseFloat(cursor) * resultsPerPage) + .limit(resultsPerPage) + commentscount = await comments.countDocuments({ + associatedassetid: AssociatedAssetId, + associatedassettype: AssociatedAssetType, + }) - commentsarray = await comments.find({associatedassetid: AssociatedAssetId, associatedassettype: AssociatedAssetType}).lean().sort({date: 'descending'}).populate({path: "poster",select: ["username"]}).select(["posterid", "content", "date", "poster"]).skip(0+parseFloat(cursor)*resultsPerPage).limit(resultsPerPage) - commentscount = await comments.countDocuments({associatedassetid: AssociatedAssetId, associatedassettype: AssociatedAssetType}) - - return res.json({status: 'success', data: commentsarray, pages: Math.ceil(Math.max(commentscount/resultsPerPage, 1))}) + return res.json({ + status: "success", + data: commentsarray, + pages: Math.ceil(Math.max(commentscount / resultsPerPage, 1)), + }) }) -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/api/feed.js b/Back/routes/api/feed.js index 36dc460..71443b3 100644 --- a/Back/routes/api/feed.js +++ b/Back/routes/api/feed.js @@ -1,55 +1,69 @@ const express = require("express") const router = express.Router() -const { requireAuth } = require('./../../middleware/authmiddleware') -const User = require('./../../model/user.js') -const bodyParser = require('body-parser') +const { requireAuth } = require("./../../middleware/authmiddleware") +const User = require("./../../model/user.js") +const bodyParser = require("body-parser") router.use(bodyParser.json()) -router.post("/share",requireAuth,async (req, res) => { - let { sharevalue } = req.body - if (!sharevalue || typeof sharevalue !== 'string'){ - return res.json({status: "error", error: "Share value not sent!"}) - } - if (sharevalue.length > 100){ - return res.json({status: "error", error: "Share value too long!"}) - } - const date = new Date().getTime() - if (date - req.userdocument?.lastfeedsharetime < 3600000){ - return res.json({status: "error", error: "You can only share once an hour!"}) - } +router.post("/share", requireAuth, async (req, res) => { + let { sharevalue } = req.body + if (!sharevalue || typeof sharevalue !== "string") { + return res.json({ status: "error", error: "Share value not sent!" }) + } + if (sharevalue.length > 100) { + return res.json({ status: "error", error: "Share value too long!" }) + } + const date = new Date().getTime() + if (date - req.userdocument?.lastfeedsharetime < 3600000) { + return res.json({ + status: "error", + error: "You can only share once an hour!", + }) + } - let posterid = req.userdocument.userid - User.updateOne({userid: req.userdocument.userid}, { - $push: { - feed: {posterid, content: sharevalue, date, moderated: false} - }, - $set: { - lastfeedsharetime: date - } - }, - function(err, doc) { - }) - res.json({status: "success", message: "Done!"}) // the next operation could take some time and we wouldn't want the client to cancel during that!! - - if (req.userdocument.friends){ - //console.log(req.userdocument.friends) - for (let item of req.userdocument.friends) { - User.updateOne({userid: item.userid}, { - $push: { - feed: {posterid, content: sharevalue, date, moderated: false} - } - }, - function(err, doc) { - }) - } - } + let posterid = req.userdocument.userid + User.updateOne( + { userid: req.userdocument.userid }, + { + $push: { + feed: { posterid, content: sharevalue, date, moderated: false }, + }, + $set: { + lastfeedsharetime: date, + }, + }, + function (err, doc) {}, + ) + res.json({ status: "success", message: "Done!" }) // the next operation could take some time and we wouldn't want the client to cancel during that!! + if (req.userdocument.friends) { + //console.log(req.userdocument.friends) + for (let item of req.userdocument.friends) { + User.updateOne( + { userid: item.userid }, + { + $push: { + feed: { + posterid, + content: sharevalue, + date, + moderated: false, + }, + }, + }, + function (err, doc) {}, + ) + } + } }) -router.post("/fetch",requireAuth,async (req, res) => { - let feed = await User.findOne({userid: req.userdocument.userid}).lean().populate({path: "feed.userdata",select: ["username"]}).select('feed') - return res.json({status: "success", data: feed.feed}) +router.post("/fetch", requireAuth, async (req, res) => { + let feed = await User.findOne({ userid: req.userdocument.userid }) + .lean() + .populate({ path: "feed.userdata", select: ["username"] }) + .select("feed") + return res.json({ status: "success", data: feed.feed }) }) -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/api/friends.js b/Back/routes/api/friends.js index e0aca09..920230e 100644 --- a/Back/routes/api/friends.js +++ b/Back/routes/api/friends.js @@ -1,188 +1,241 @@ const express = require("express") const router = express.Router() -const { requireAuth } = require('./../../middleware/authmiddleware') -const games = require('./../../model/games.js') -const User = require('./../../model/user.js') -const bodyParser = require('body-parser') +const { requireAuth } = require("./../../middleware/authmiddleware") +const games = require("./../../model/games.js") +const User = require("./../../model/user.js") +const bodyParser = require("body-parser") router.use(bodyParser.json()) -router.post("/request-friendship", requireAuth,async (req, res) => { - const tofriend = req.body.recipientUserId +router.post("/request-friendship", requireAuth, async (req, res) => { + const tofriend = req.body.recipientUserId - if (!tofriend){ - return res.json({status:"error",error:"Recipent not sent!"}) - } - - const usertofriend = await User.findOne({userid: tofriend}).lean() - if (!usertofriend){ - return res.json({status:"error",error:"Can't find Recipent!"}) - } + if (!tofriend) { + return res.json({ status: "error", error: "Recipent not sent!" }) + } + const usertofriend = await User.findOne({ userid: tofriend }).lean() + if (!usertofriend) { + return res.json({ status: "error", error: "Can't find Recipent!" }) + } - if (usertofriend.friends){ - const friends = usertofriend.friends.some(word => word.userid == req.userdocument.userid) - if (friends === true){ + if (usertofriend.friends) { + const friends = usertofriend.friends.some( + word => word.userid == req.userdocument.userid, + ) + if (friends === true) { + return res.json({ + status: "error", + error: "You are already friends!", + }) + } + // already friends + } + if (req.userdocument.friendrequests) { + // check if the other user is already requesting to friend the player so then they both want to be firends so we can interperept this as an accept request - return res.json({status:"error",error:"You are already friends!"}) - } - // already friends - } - if (req.userdocument.friendrequests){ - // check if the other user is already requesting to friend the player so then they both want to be firends so we can interperept this as an accept request - - const bothwantobefriends = req.userdocument.friendrequests.some(word => word.userid == usertofriend.userid) - if (bothwantobefriends === true){ - console.log(tofriend) - User.updateOne({userid: req.userdocument.userid}, { - $push: { - friends: {userid: usertofriend.userid, username: usertofriend.username} - }, - $pull: { - friendrequests: {userid: usertofriend.userid, username: usertofriend.username} - } - }, - function(err, doc) { - - }) + const bothwantobefriends = req.userdocument.friendrequests.some( + word => word.userid == usertofriend.userid, + ) + if (bothwantobefriends === true) { + console.log(tofriend) + User.updateOne( + { userid: req.userdocument.userid }, + { + $push: { + friends: { + userid: usertofriend.userid, + username: usertofriend.username, + }, + }, + $pull: { + friendrequests: { + userid: usertofriend.userid, + username: usertofriend.username, + }, + }, + }, + function (err, doc) {}, + ) - User.updateOne({userid: tofriend}, { - $push: { - friends: {userid: req.userdocument.userid, username: req.userdocument.username} - }, - $pull: { - friendrequests: {userid: req.userdocument.userid, username: req.userdocument.username} - } - }, - function(err, doc) { - - }) + User.updateOne( + { userid: tofriend }, + { + $push: { + friends: { + userid: req.userdocument.userid, + username: req.userdocument.username, + }, + }, + $pull: { + friendrequests: { + userid: req.userdocument.userid, + username: req.userdocument.username, + }, + }, + }, + function (err, doc) {}, + ) - return res.json({status:"success",message:"You are now friends :D"}) - } - - } - if (usertofriend.friendrequests){ - const alreadyrequested = usertofriend.friendrequests.some(word => word.userid == req.userdocument.userid) - - // already friend requested - if (alreadyrequested === true){ - - return res.json({status:"error",error:"You already sent this request!"}) - } - } - User.updateOne({userid: usertofriend.userid}, { - $push: { - friendrequests: {userid: req.userdocument.userid, username: req.userdocument.username} - } - }, - function(err, doc) { - - }) - - return res.json({status:"success",message:"Friend request sent!"}) - + return res.json({ + status: "success", + message: "You are now friends :D", + }) + } + } + if (usertofriend.friendrequests) { + const alreadyrequested = usertofriend.friendrequests.some( + word => word.userid == req.userdocument.userid, + ) + // already friend requested + if (alreadyrequested === true) { + return res.json({ + status: "error", + error: "You already sent this request!", + }) + } + } + User.updateOne( + { userid: usertofriend.userid }, + { + $push: { + friendrequests: { + userid: req.userdocument.userid, + username: req.userdocument.username, + }, + }, + }, + function (err, doc) {}, + ) + return res.json({ status: "success", message: "Friend request sent!" }) }) -router.post("/decline-friend-request",requireAuth,async (req, res) => { - const tounfriend = req.body.recipientUserId - //console.log(tounfriend+" nerd") - if (!tounfriend){ - return res.json({status:"error",error:"Recipent not sent!"}) - } - const usertofriend = await User.findOne({userid: tounfriend}).lean() - if (!usertofriend){ - return res.json({status:"error",error:"Can't find Recipent!"}) - } - - const alreadyfriends = req.userdocument?.friends?.some(word => word.userid == tounfriend ) - if (alreadyfriends === true){ - // already friends with the person so they want ro remove their friend - User.updateOne({userid: tounfriend}, { - $pull: { - friends: {userid: req.userdocument.userid, username: req.userdocument.username} - } - }, - function(err, doc) { - //console.log(err) - }) - User.updateOne({userid: req.userdocument.userid}, { - $pull: { - friends: {userid:usertofriend.userid, username: usertofriend.username} - } - }, - function(err, doc) { - //console.log(err) - }) - return res.json({status:"error",error:"Unfriended friend!"}) - } +router.post("/decline-friend-request", requireAuth, async (req, res) => { + const tounfriend = req.body.recipientUserId + //console.log(tounfriend+" nerd") + if (!tounfriend) { + return res.json({ status: "error", error: "Recipent not sent!" }) + } + const usertofriend = await User.findOne({ userid: tounfriend }).lean() + if (!usertofriend) { + return res.json({ status: "error", error: "Can't find Recipent!" }) + } + const alreadyfriends = req.userdocument?.friends?.some( + word => word.userid == tounfriend, + ) + if (alreadyfriends === true) { + // already friends with the person so they want ro remove their friend + User.updateOne( + { userid: tounfriend }, + { + $pull: { + friends: { + userid: req.userdocument.userid, + username: req.userdocument.username, + }, + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + User.updateOne( + { userid: req.userdocument.userid }, + { + $pull: { + friends: { + userid: usertofriend.userid, + username: usertofriend.username, + }, + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + return res.json({ status: "error", error: "Unfriended friend!" }) + } + //otherwise the user isn't friends but still declines the friend request - //otherwise the user isn't friends but still declines the friend request - - User.updateOne({userid: tounfriend}, { - $pull: { - friendrequests: {userid: req.userdocument.userid, username: req.userdocument.username} - } - }, - function(err, doc) { - //console.log(err) - }) - User.updateOne({userid: req.userdocument.userid}, { - $pull: { - friendrequests: {userid: usertofriend.userid, username: usertofriend.username} - } - }, - function(err, doc) { - //console.log(err) - }) - - return res.json({status:"success",message:"Declined friend request!"}) - - + User.updateOne( + { userid: tounfriend }, + { + $pull: { + friendrequests: { + userid: req.userdocument.userid, + username: req.userdocument.username, + }, + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + User.updateOne( + { userid: req.userdocument.userid }, + { + $pull: { + friendrequests: { + userid: usertofriend.userid, + username: usertofriend.username, + }, + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + return res.json({ status: "success", message: "Declined friend request!" }) }) -router.post("/has-sent-request",requireAuth,async (req, res) => { - const tofriend = req.body.recipientUserId +router.post("/has-sent-request", requireAuth, async (req, res) => { + const tofriend = req.body.recipientUserId - if (!tofriend){ - return res.json({status:"error",error:"Recipent not sent!"}) - } - - const usertofriend = await User.findOne({userid: tofriend}).lean() - if (!usertofriend){ - return res.json({status:"error",error:"Can't find Recipent!"}) - } + if (!tofriend) { + return res.json({ status: "error", error: "Recipent not sent!" }) + } - const friends = usertofriend?.friends?.some(word => word.userid == req.userdocument.userid) - if (friends === true){ + const usertofriend = await User.findOne({ userid: tofriend }).lean() + if (!usertofriend) { + return res.json({ status: "error", error: "Can't find Recipent!" }) + } - return res.json({status:"error",error:"You are already friends!"}) - } - // already friends + const friends = usertofriend?.friends?.some( + word => word.userid == req.userdocument.userid, + ) + if (friends === true) { + return res.json({ status: "error", error: "You are already friends!" }) + } + // already friends - const alreadyrequested = usertofriend?.friendrequests?.some(word => word.userid == req.userdocument.userid) + const alreadyrequested = usertofriend?.friendrequests?.some( + word => word.userid == req.userdocument.userid, + ) - // already friend requested - if (alreadyrequested === true){ + // already friend requested + if (alreadyrequested === true) { + return res.json({ status: "success", message: true }) + } - return res.json({status:"success",message:true}) - } + const bothwantobefriends = req.userdocument?.friendrequests?.some( + word => word.userid == usertofriend.userid, + ) + if (bothwantobefriends === true) { + return res.json({ + status: "success", + message: "Other user wants to be friends.", + }) + } - const bothwantobefriends = req.userdocument?.friendrequests?.some(word => word.userid == usertofriend.userid) - if (bothwantobefriends === true){ - return res.json({status:"success",message:"Other user wants to be friends."}) - } - - return res.json({status:"success",message:false}) + return res.json({ status: "success", message: false }) }) +router.post("/friend-requests", requireAuth, async (req, res) => { + res.json({ data: req.userdocument?.friendrequests }) +}) -router.post('/friend-requests',requireAuth, async (req, res) => { - res.json({data: req.userdocument?.friendrequests}) -}); - -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/api/generatekey.js b/Back/routes/api/generatekey.js index 26c4b28..2a0757c 100644 --- a/Back/routes/api/generatekey.js +++ b/Back/routes/api/generatekey.js @@ -1,49 +1,48 @@ const express = require("express") const router = express.Router() -const { requireAuth } = require('./../../middleware/authmiddleware') -const bodyParser = require('body-parser') -const keys = require('./../../model/keys.js') +const { requireAuth } = require("./../../middleware/authmiddleware") +const bodyParser = require("body-parser") +const keys = require("./../../model/keys.js") router.use(bodyParser.json()) // hay this code hasn't been updated so it contains very old code because I haven't bothered to add key support since the last time they existed 2 months ago? function stringGen(len) { - var text = ""; - - var charset = "abcdefghijklmnopqrstuvwxyz0123456789"; - - for (var i = 0; i < len; i++) - text += charset.charAt(Math.floor(Math.random() * charset.length)); - - return text; - } + var text = "" -router.post("/",requireAuth,async (req, res) => { - if (req.userdocument.admin === true){ - var key = stringGen(10) - const response = await keys.create({ - Creator: req.userdocument.username, - Key: key, - Used: false - }) - return res.redirect(req.get('referer')); - } - if (req.userdocument.coins >= 100){ - // they have enough - req.userdocument.coins -= 100 - req.userdocument.markModified('coins') - await req.userdocument.save() - var key = stringGen(10) - const response = await keys.create({ - Creator: req.userdocument.username, - Key: key, - Used: false -}) -return res.redirect(req.get('referer')); + var charset = "abcdefghijklmnopqrstuvwxyz0123456789" - } + for (var i = 0; i < len; i++) + text += charset.charAt(Math.floor(Math.random() * charset.length)) - return res.redirect(req.get('referer')); + return text +} + +router.post("/", requireAuth, async (req, res) => { + if (req.userdocument.admin === true) { + var key = stringGen(10) + const response = await keys.create({ + Creator: req.userdocument.username, + Key: key, + Used: false, + }) + return res.redirect(req.get("referer")) + } + if (req.userdocument.coins >= 100) { + // they have enough + req.userdocument.coins -= 100 + req.userdocument.markModified("coins") + await req.userdocument.save() + var key = stringGen(10) + const response = await keys.create({ + Creator: req.userdocument.username, + Key: key, + Used: false, + }) + return res.redirect(req.get("referer")) + } + + return res.redirect(req.get("referer")) }) -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/api/groups.js b/Back/routes/api/groups.js index 815e811..c90dc09 100644 --- a/Back/routes/api/groups.js +++ b/Back/routes/api/groups.js @@ -1,182 +1,238 @@ const express = require("express") const router = express.Router() -const { requireAuth } = require('./../../middleware/authmiddleware') -const bodyParser = require('body-parser') -const groups = require('./../../model/groups.js') -var multer = require('multer'); -const fs = require('fs'); -const path = require('path') +const { requireAuth } = require("./../../middleware/authmiddleware") +const bodyParser = require("body-parser") +const groups = require("./../../model/groups.js") +var multer = require("multer") +const fs = require("fs") +const path = require("path") router.use(bodyParser.json()) -router.post("/", requireAuth,async (req, res) => { - let mygroups = await groups.find({"members.userId": req.userdocument.userid}).lean().select(["Name","Description","Public","groupid","ownerid","memberscount"]) - return res.json(mygroups) +router.post("/", requireAuth, async (req, res) => { + let mygroups = await groups + .find({ "members.userId": req.userdocument.userid }) + .lean() + .select([ + "Name", + "Description", + "Public", + "groupid", + "ownerid", + "memberscount", + ]) + return res.json(mygroups) }) -router.post("/:id", requireAuth,async (req, res) => { - const groupid = parseInt(req.params.id) - if (isNaN(groupid)){ - return res.json({status: "error", error: "Not found"}) - } +router.post("/:id", requireAuth, async (req, res) => { + const groupid = parseInt(req.params.id) + if (isNaN(groupid)) { + return res.json({ status: "error", error: "Not found" }) + } - let groupresponse = await groups.findOne({groupid}).lean().select(["Name","Description","Public","groupid","ownerid","memberscount","currentshout"]).populate({path: "owner",select: ["username", "userid"]}) + let groupresponse = await groups + .findOne({ groupid }) + .lean() + .select([ + "Name", + "Description", + "Public", + "groupid", + "ownerid", + "memberscount", + "currentshout", + ]) + .populate({ path: "owner", select: ["username", "userid"] }) - if (!groupresponse){ - return res.json({status: "error", error: "Not found"}) - } + if (!groupresponse) { + return res.json({ status: "error", error: "Not found" }) + } - return res.json({status: "success", data: groupresponse}) + return res.json({ status: "success", data: groupresponse }) }) -router.post("/:id/members", requireAuth,async (req, res) => { - const groupid = parseInt(req.params.id) - const {rank} = req.body - if (!rank){ - return res.json({status: "error", error: "Rank not sent"}) - } +router.post("/:id/members", requireAuth, async (req, res) => { + const groupid = parseInt(req.params.id) + const { rank } = req.body + if (!rank) { + return res.json({ status: "error", error: "Rank not sent" }) + } - const resultsPerPage = 5 - let page = req.body.page ?? 0 - if (page != 0){ - page-=1 - } - let skip = 0+parseFloat(page)*resultsPerPage + const resultsPerPage = 5 + let page = req.body.page ?? 0 + if (page != 0) { + page -= 1 + } + let skip = 0 + parseFloat(page) * resultsPerPage - if (isNaN(groupid)){ - return res.json({status: "error", error: "Not found"}) - } + if (isNaN(groupid)) { + return res.json({ status: "error", error: "Not found" }) + } - let groupresponse = await groups.findOne({groupid}).lean().select({"members": { "$slice" : [ skip, resultsPerPage ] }}).populate({path: "memberspoly",select: ["username", "userid"]}) + let groupresponse = await groups + .findOne({ groupid }) + .lean() + .select({ members: { $slice: [skip, resultsPerPage] } }) + .populate({ path: "memberspoly", select: ["username", "userid"] }) - if (!groupresponse){ - return res.json({status: "error", error: "Not found"}) - } + if (!groupresponse) { + return res.json({ status: "error", error: "Not found" }) + } - return res.json({status: "success", data: groupresponse.memberspoly}) + return res.json({ status: "success", data: groupresponse.memberspoly }) }) -async function validateImage(groupid,res){ - return new Promise(async (resolve) => { +async function validateImage(groupid, res) { + return new Promise(async resolve => { + try { + const myArrayBuffer = await fs.promises.readFile( + path.resolve(`assets/groupicons/icon-${groupid}.png`), + null, + ) + pngValidator(myArrayBuffer) + // success + } catch { + // file is invalid or corrupt + fs.unlink( + path.resolve(`assets/groupicons/icon-${groupid}.png`), + err => { + if (err) console.log(err) + }, + ) - try { - const myArrayBuffer = await fs.promises.readFile(path.resolve(`assets/groupicons/icon-${groupid}.png`), null) - pngValidator(myArrayBuffer); - // success - } catch { - // file is invalid or corrupt - fs.unlink(path.resolve(`assets/groupicons/icon-${groupid}.png`), (err => { - if (err) console.log(err) - })); - - return res.json({status: 'error', error: 'Image is invalid.'}) - } + return res.json({ status: "error", error: "Image is invalid." }) + } - resolve() - - }) + resolve() + }) } var storage = multer.diskStorage({ - destination: function (req, file, cb) { - // Uploads is the Upload_folder_name - cb(null, "./assets/groupicons") - - }, - filename: async function (req, file, cb) { - const groupid = await groups.countDocuments(); - cb(null, "icon-" + groupid + ".png") - - - } - }) - const uploadicon = multer({storage: storage, - fileFilter: function (req, file, callback) { - if(file.mimetype != 'image/png') { - return callback('Invalid file type') - } - callback(null, true) - }, - limits: { fileSize: 1024 * 1024 } // 1mb - }) - -router.post("/create", requireAuth,async (req, res) => { - if (req.userdocument.coins < 100){ - return res.json({status: "error", error: "You don't have enough Rocks!"}) - } - uploadicon.single("groupicon")(req, res, async function (err) { - if (err) { - if (err?.message === "File too large"){ - return res.status(400).send({status: 'error', error: "File too large! 1MB Limit"}) - } - if (err === "Invalid file type"){ - return res.status(400).send({status: 'error', error: "Invalid file type"}) - } - return res.status(400).send({status: 'error', error: err.message}) - } - - - var xss = require("xss") - const {groupname, description,publicgroup} = req.body - - if (!groupname){ - return res.json({status: 'error', error: 'Group name needs to be sent.'}) - } - if (!description){ - return res.json({status: 'error', error: 'Description needs to be sent.'}) - } - if (!publicgroup){ - return res.json({status: 'error', error: 'Public group needs to be sent.'}) - } - if (publicgroup != "true" && type != "false"){ - return res.json({status: 'error', error: 'Public group needs to be a true or false value.'}) - } - - const groupid = await groups.countDocuments(); - // check if the file they just uploaded is valid - await validateImage(groupid,res) - let IconApproved = req.userdocument.admin === false ? false : true - - await groups.create({ - Name: xss(groupname), - Description: xss(description), - Public: publicgroup, - IconApproved, - groupid, - ownerid: req.userdocument.userid, - memberscount: 1, - members: [{userId: req.userdocument.userid, rank: 3}], - Roles: [{RoleName: "Members", Permissions: {Shout: false, Kick: false, ChangeRoles: false, ModerateWall: false, ManageAllies: false}, Rank: 1}, {RoleName: "Admin", Permissions: {Shout: true, Kick: true, ChangeRoles: true, ModerateWall: true, ManageAllies: false}, Rank: 2}, {RoleName: "Owner", Permissions: {All: true}, Rank: 3}] - }) - - return res.json({status: "success", message: "Group created!"}) - - + destination: function (req, file, cb) { + // Uploads is the Upload_folder_name + cb(null, "./assets/groupicons") + }, + filename: async function (req, file, cb) { + const groupid = await groups.countDocuments() + cb(null, "icon-" + groupid + ".png") + }, }) +const uploadicon = multer({ + storage: storage, + fileFilter: function (req, file, callback) { + if (file.mimetype != "image/png") { + return callback("Invalid file type") + } + callback(null, true) + }, + limits: { fileSize: 1024 * 1024 }, // 1mb }) -router.post("/editgroup", requireAuth,async (req, res) => { - +router.post("/create", requireAuth, async (req, res) => { + if (req.userdocument.coins < 100) { + return res.json({ + status: "error", + error: "You don't have enough Rocks!", + }) + } + uploadicon.single("groupicon")(req, res, async function (err) { + if (err) { + if (err?.message === "File too large") { + return res + .status(400) + .send({ + status: "error", + error: "File too large! 1MB Limit", + }) + } + if (err === "Invalid file type") { + return res + .status(400) + .send({ status: "error", error: "Invalid file type" }) + } + return res.status(400).send({ status: "error", error: err.message }) + } + var xss = require("xss") + const { groupname, description, publicgroup } = req.body + + if (!groupname) { + return res.json({ + status: "error", + error: "Group name needs to be sent.", + }) + } + if (!description) { + return res.json({ + status: "error", + error: "Description needs to be sent.", + }) + } + if (!publicgroup) { + return res.json({ + status: "error", + error: "Public group needs to be sent.", + }) + } + if (publicgroup != "true" && type != "false") { + return res.json({ + status: "error", + error: "Public group needs to be a true or false value.", + }) + } + + const groupid = await groups.countDocuments() + // check if the file they just uploaded is valid + await validateImage(groupid, res) + let IconApproved = req.userdocument.admin === false ? false : true + + await groups.create({ + Name: xss(groupname), + Description: xss(description), + Public: publicgroup, + IconApproved, + groupid, + ownerid: req.userdocument.userid, + memberscount: 1, + members: [{ userId: req.userdocument.userid, rank: 3 }], + Roles: [ + { + RoleName: "Members", + Permissions: { + Shout: false, + Kick: false, + ChangeRoles: false, + ModerateWall: false, + ManageAllies: false, + }, + Rank: 1, + }, + { + RoleName: "Admin", + Permissions: { + Shout: true, + Kick: true, + ChangeRoles: true, + ModerateWall: true, + ManageAllies: false, + }, + Rank: 2, + }, + { RoleName: "Owner", Permissions: { All: true }, Rank: 3 }, + ], + }) + + return res.json({ status: "success", message: "Group created!" }) + }) }) -router.post("/postshout", requireAuth,async (req, res) => { - +router.post("/editgroup", requireAuth, async (req, res) => {}) -}) +router.post("/postshout", requireAuth, async (req, res) => {}) -router.post("/joingroup", requireAuth,async (req, res) => { - +router.post("/joingroup", requireAuth, async (req, res) => {}) -}) +router.post("/leavegroup", requireAuth, async (req, res) => {}) -router.post("/leavegroup", requireAuth,async (req, res) => { - +router.post("/exile", requireAuth, async (req, res) => {}) -}) - -router.post("/exile", requireAuth,async (req, res) => { - - -}) - -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/api/itemaction.js b/Back/routes/api/itemaction.js index 0225fd8..17e009a 100644 --- a/Back/routes/api/itemaction.js +++ b/Back/routes/api/itemaction.js @@ -1,82 +1,71 @@ const express = require("express") const router = express.Router() -const { requireAuth } = require('./../../middleware/authmiddleware') -const User = require('./../../model/user.js') -const bodyParser = require('body-parser') +const { requireAuth } = require("./../../middleware/authmiddleware") +const User = require("./../../model/user.js") +const bodyParser = require("body-parser") router.use(bodyParser.json()) -router.post("/", requireAuth,async (req, res) => { - const {action,itemid} = req.body - if (typeof action == "undefined"){ - return res.json("Send Action Please") - } - if (typeof itemid == "undefined"){ - return res.json("Send Itemid Please") - } - if (action === "wear"){ +router.post("/", requireAuth, async (req, res) => { + const { action, itemid } = req.body + if (typeof action == "undefined") { + return res.json("Send Action Please") + } + if (typeof itemid == "undefined") { + return res.json("Send Itemid Please") + } + if (action === "wear") { + for (const obj of req.userdocument.inventory) { + if (parseInt(obj.ItemId) === itemid) { + // they own it + // lets check if they already have it equipped + if (obj.Equipped === true) { + return res.json({ + status: "error", + error: "You already have this Equipped!", + }) + } + // they own it and don't have it equipped already so lets add it + try { + obj.Equipped = true + req.userdocument.markModified("inventory") + await req.userdocument.save() + } catch (err) { + console.log(err) + } + return res.json({ status: "ok", error: "Equipped!" }) + } + } + // they don't own it + return res.json({ status: "error", error: "You don't own this!" }) + } - for (const obj of req.userdocument.inventory) { - if (parseInt(obj.ItemId) === itemid){ - // they own it - // lets check if they already have it equipped + if (action === "remove") { + for (const obj of req.userdocument.inventory) { + if (parseInt(obj.ItemId) === itemid) { + // they own it + // lets check if they don't already don't it equipped - - - if (obj.Equipped === true){ - return res.json({status: 'error', error: "You already have this Equipped!"}) - } - // they own it and don't have it equipped already so lets add it - try{ - obj.Equipped = true - req.userdocument.markModified('inventory') - await req.userdocument.save() - }catch(err){ - console.log(err) - } - return res.json({status: 'ok', error: "Equipped!"}) - - - } - - - - } - // they don't own it - return res.json({status: 'error', error: "You don't own this!"}) - } - - - - if (action === "remove"){ - for (const obj of req.userdocument.inventory) { - if (parseInt(obj.ItemId) === itemid){ - // they own it - // lets check if they don't already don't it equipped - - if (obj.Equipped === false){ - return res.json({status: 'error', error: "You already don't this Equipped!"}) - } - // they own it and don't have it not equipped already lets remove it - try{ - obj.Equipped = false - req.userdocument.markModified('inventory') - await req.userdocument.save() - }catch(err){ - console.log(err) - } -return res.json({status: 'ok', error: "Equipped!"}) - - - - } - - - - } - // they don't own it - return res.json({status: 'error', error: "You don't own this!"}) - } + if (obj.Equipped === false) { + return res.json({ + status: "error", + error: "You already don't this Equipped!", + }) + } + // they own it and don't have it not equipped already lets remove it + try { + obj.Equipped = false + req.userdocument.markModified("inventory") + await req.userdocument.save() + } catch (err) { + console.log(err) + } + return res.json({ status: "ok", error: "Equipped!" }) + } + } + // they don't own it + return res.json({ status: "error", error: "You don't own this!" }) + } }) -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/api/moderate.js b/Back/routes/api/moderate.js index a126110..df3ea49 100644 --- a/Back/routes/api/moderate.js +++ b/Back/routes/api/moderate.js @@ -1,91 +1,115 @@ const express = require("express") const router = express.Router() -const { requireAuth } = require('./../../middleware/authmiddleware') -const items = require('./../../model/item.js') -const bodyParser = require('body-parser') -const fs = require('fs') -const path = require("path"); +const { requireAuth } = require("./../../middleware/authmiddleware") +const items = require("./../../model/item.js") +const bodyParser = require("body-parser") +const fs = require("fs") +const path = require("path") router.use(bodyParser.json()) -router.post("/", requireAuth,async (req, res) => { - let {itemid} = req.body - if (typeof itemid == "undefined"){ - return res.json({status: 'error', error: "itemid not sent!"}) - } - itemid = parseInt(itemid) - if (req.userdocument.admin == false && req.userdocument?.ugcpermission == false) { - return res.redirect('/') - } - const item = await items.findOne({ItemId: itemid}) +router.post("/", requireAuth, async (req, res) => { + let { itemid } = req.body + if (typeof itemid == "undefined") { + return res.json({ status: "error", error: "itemid not sent!" }) + } + itemid = parseInt(itemid) + if ( + req.userdocument.admin == false && + req.userdocument?.ugcpermission == false + ) { + return res.redirect("/") + } + const item = await items.findOne({ ItemId: itemid }) - if (item.Creator != req.userdocument.userid && req.userdocument.admin === false){ // basically we want ugc uploaders to be able to delete there own items but not other peoples items - return res.json({status: 'error', error: "You don't own this item!"}) - } - try{ - items.updateOne({ItemId: itemid}, { - $set: { - Hidden: true - } - }, - function(err, doc) { - //console.log(err) - }) - // delete the item from our servers - fs.unlink(path.resolve(path.resolve(__dirname, "../../assets/ugc/itemfile-"+itemid+".rbxm")), (err => { - if (err) console.log(err) - })); - }catch(err){ - console.log(err) - } - - return res.json({status: 'success'}) + if ( + item.Creator != req.userdocument.userid && + req.userdocument.admin === false + ) { + // basically we want ugc uploaders to be able to delete there own items but not other peoples items + return res.json({ status: "error", error: "You don't own this item!" }) + } + try { + items.updateOne( + { ItemId: itemid }, + { + $set: { + Hidden: true, + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + // delete the item from our servers + fs.unlink( + path.resolve( + path.resolve( + __dirname, + "../../assets/ugc/itemfile-" + itemid + ".rbxm", + ), + ), + err => { + if (err) console.log(err) + }, + ) + } catch (err) { + console.log(err) + } + return res.json({ status: "success" }) }) -router.post("/queue", requireAuth,async (req, res) => { - const {action,itemid} = req.body - if (typeof action == "undefined"){ - return res.json("Send Action Please") - } - if (typeof itemid == "undefined"){ - return res.json("Send Itemid Please") - } - if (req.userdocument.admin == false) { - return res.redirect('/') - } - const item = await items.findOne({ItemId: itemid}) +router.post("/queue", requireAuth, async (req, res) => { + const { action, itemid } = req.body + if (typeof action == "undefined") { + return res.json("Send Action Please") + } + if (typeof itemid == "undefined") { + return res.json("Send Itemid Please") + } + if (req.userdocument.admin == false) { + return res.redirect("/") + } + const item = await items.findOne({ ItemId: itemid }) - if (!item){ - return res.json({status: "error", error: "Send Itemid Please"}) - } + if (!item) { + return res.json({ status: "error", error: "Send Itemid Please" }) + } - console.log(action) + console.log(action) - if (action === "deny"){ - item.Hidden = true - item.denied = true - item.markModified("Hidden") - item.markModified("denied") - await item.save() - fs.unlink(path.resolve(path.resolve(__dirname, "../../assets/ugc/itemfile-"+itemid+".rbxm")), (err => { - if (err) console.log(err) - })); - } - if (action === "approve"){ - item.approved = true - item.markModified("approved") - await item.save() - if (item.Type === "Shirts" || item.Type === "Pants"){ - // we also have to approve the associated image - const image = await items.findOne({ItemId: parseInt(itemid)-1}) - image.approved = true - image.markModified("approved") - await image.save() - } - - } - // finish this LMAO pretty ez tho - return res.json({status: "success", message: "Done!"}) + if (action === "deny") { + item.Hidden = true + item.denied = true + item.markModified("Hidden") + item.markModified("denied") + await item.save() + fs.unlink( + path.resolve( + path.resolve( + __dirname, + "../../assets/ugc/itemfile-" + itemid + ".rbxm", + ), + ), + err => { + if (err) console.log(err) + }, + ) + } + if (action === "approve") { + item.approved = true + item.markModified("approved") + await item.save() + if (item.Type === "Shirts" || item.Type === "Pants") { + // we also have to approve the associated image + const image = await items.findOne({ ItemId: parseInt(itemid) - 1 }) + image.approved = true + image.markModified("approved") + await image.save() + } + } + // finish this LMAO pretty ez tho + return res.json({ status: "success", message: "Done!" }) }) -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/api/purchase.js b/Back/routes/api/purchase.js index f463e13..1f6f37a 100644 --- a/Back/routes/api/purchase.js +++ b/Back/routes/api/purchase.js @@ -1,83 +1,99 @@ const express = require("express") const router = express.Router() -const { requireAuth } = require('./../../middleware/authmiddleware') -const bodyParser = require('body-parser') -var numbtest = /^\d+\.?\d*$/; -const items = require('./../../model/item.js') -const User = require('./../../model/user.js') +const { requireAuth } = require("./../../middleware/authmiddleware") +const bodyParser = require("body-parser") +var numbtest = /^\d+\.?\d*$/ +const items = require("./../../model/item.js") +const User = require("./../../model/user.js") router.use(bodyParser.json()) -router.post("/", requireAuth,async (req, res) => { - if (!req.userdocument.discordid) { - return res.json({status: "error", error: "Discord link required for purchasing. Link your discord in the settings panel."}) - } - const {itemid} = req.body - if (typeof itemid == "undefined"){ - return res.json({status: "error", error: "You need sum itemids bozo"}) - } - if (numbtest.test(itemid) == false){ - return res.json({status: "error", error: "You need sum itemids bozo"}) - } +router.post("/", requireAuth, async (req, res) => { + if (!req.userdocument.discordid) { + return res.json({ + status: "error", + error: "Discord link required for purchasing. Link your discord in the settings panel.", + }) + } + const { itemid } = req.body + if (typeof itemid == "undefined") { + return res.json({ status: "error", error: "You need sum itemids bozo" }) + } + if (numbtest.test(itemid) == false) { + return res.json({ status: "error", error: "You need sum itemids bozo" }) + } + const itemdoc = await items.findOne({ ItemId: itemid }) //.lean() + if (typeof req.userdocument.inventory !== "undefined") { + // check if user already owns item + for (var v of req.userdocument.inventory) { + if (v.ItemId === itemdoc.ItemId) { + // they already own it + return res.json({ + status: "error", + error: "You already own this!", + }) + } + } + } + if ( + itemdoc.Type === "Mesh" || + itemdoc.Type === "Audio" || + itemdoc.Type === "Mesh" + ) { + return res.json({ status: "error", error: "You can't buy assets." }) + } - const itemdoc = await items.findOne({ItemId: itemid})//.lean() - if (typeof req.userdocument.inventory !== "undefined"){ - // check if user already owns item - for (var v of req.userdocument.inventory){ - if (v.ItemId === itemdoc.ItemId){ - // they already own it - return res.json({status: 'error', error: "You already own this!"}) - } - } - } - if (itemdoc.Type === "Mesh" || itemdoc.Type === "Audio" || itemdoc.Type === "Mesh"){ - return res.json({status: 'error', error: "You can't buy assets."}) - } + if (itemdoc.Hidden) { + return res.json({ status: "error", error: "You can't buy this." }) + } - if (itemdoc.Hidden){ - return res.json({status: 'error', error: "You can't buy this."}) - } - - - if (req.userdocument.coins >= itemdoc.Price){ - // has enough money to purcahse item - try{ - User.updateOne({userid: req.userdocument.userid}, { - $set: { - coins: req.userdocument.coins - itemdoc.Price - }, - $push: { - inventory: {Type: itemdoc.Type,ItemId: itemdoc.ItemId, ItemName: itemdoc.Name, Equipped: false} - } - }, - function(err, doc) { - //console.log(err) - }) - // give owner cash - User.updateOne({userid: itemdoc.Creator}, { - $inc: { - coins: itemdoc.Price - } - }, - function(err, doc) { - //console.log(err) - }) - - itemdoc.Sales += 1 - if (!itemdoc.Sales){ - itemdoc.Sales = 1 - } - //console.log(itemdoc.Sales) - itemdoc.markModified('Sales') - await itemdoc.save() - }catch{ - - } - return res.json({status: 'success', message: 'Purchase successful'}) - } - // too poor - return res.json({status: 'error', error: "You don't have enough rocks"}) + if (req.userdocument.coins >= itemdoc.Price) { + // has enough money to purcahse item + try { + User.updateOne( + { userid: req.userdocument.userid }, + { + $set: { + coins: req.userdocument.coins - itemdoc.Price, + }, + $push: { + inventory: { + Type: itemdoc.Type, + ItemId: itemdoc.ItemId, + ItemName: itemdoc.Name, + Equipped: false, + }, + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + // give owner cash + User.updateOne( + { userid: itemdoc.Creator }, + { + $inc: { + coins: itemdoc.Price, + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + itemdoc.Sales += 1 + if (!itemdoc.Sales) { + itemdoc.Sales = 1 + } + //console.log(itemdoc.Sales) + itemdoc.markModified("Sales") + await itemdoc.save() + } catch {} + return res.json({ status: "success", message: "Purchase successful" }) + } + // too poor + return res.json({ status: "error", error: "You don't have enough rocks" }) }) -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/api/renderthumbnail.js b/Back/routes/api/renderthumbnail.js index 5442061..3c2e503 100644 --- a/Back/routes/api/renderthumbnail.js +++ b/Back/routes/api/renderthumbnail.js @@ -1,249 +1,292 @@ const express = require("express") const router = express.Router() -const rcctalk = require('./../../thumbnailrcctalk') -const rcctalk2018 = require('./../../rcctalk2018') -const fs = require('fs') -const assetrenderscript = fs.readFileSync('assetthumbnailrenderer.lua','utf-8') -var path = require("path"); -const User = require('./../../model/user.js') -const item = require('./../../model/item.js') -var rgx = /^[0-9]*\.?[0-9]*$/; -router.use(express.json({limit: '200mb'})); -const { requireAuth } = require('./../../middleware/authmiddleware.js') -const { grabAuth } = require('./../../middleware/grabauth.js') -const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args)); -require('dotenv').config() +const rcctalk = require("./../../thumbnailrcctalk") +const rcctalk2018 = require("./../../rcctalk2018") +const fs = require("fs") +const assetrenderscript = fs.readFileSync("assetthumbnailrenderer.lua", "utf-8") +var path = require("path") +const User = require("./../../model/user.js") +const item = require("./../../model/item.js") +var rgx = /^[0-9]*\.?[0-9]*$/ +router.use(express.json({ limit: "200mb" })) +const { requireAuth } = require("./../../middleware/authmiddleware.js") +const { grabAuth } = require("./../../middleware/grabauth.js") +const fetch = (...args) => + import("node-fetch").then(({ default: fetch }) => fetch(...args)) +require("dotenv").config() const RCC_HOST = process.env.RCC_HOST -const rateLimit = require('express-rate-limit') +const rateLimit = require("express-rate-limit") const limiter = rateLimit({ windowMs: 2 * 1000, // 5 seconds max: 1, // Limit each IP to 1 requests per `window` standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers legacyHeaders: false, // Disable the `X-RateLimit-*` headers - handler: (request, response, next, options) =>{ - return response.sendFile(path.resolve("./assets/default.png")) - } + handler: (request, response, next, options) => { + return response.sendFile(path.resolve("./assets/default.png")) + }, }) -router.get("/",grabAuth,async (req, res) => { - if (!req.query.id && !req.query.userId) { - return res.status(400) - } - let headshot = false - if (req.query.type === "headshot"){ - headshot = true - } - let id = req.query.id??req.query.userId +router.get("/", grabAuth, async (req, res) => { + if (!req.query.id && !req.query.userId) { + return res.status(400) + } + let headshot = false + if (req.query.type === "headshot") { + headshot = true + } + let id = req.query.id ?? req.query.userId - var sanitizedid = id.match(rgx) + var sanitizedid = id.match(rgx) - const user = await User.findOne({userid: sanitizedid}).lean() - if (!user) { - return res.json({status: 'error', error: 'User does not exist'}) - } + const user = await User.findOne({ userid: sanitizedid }).lean() + if (!user) { + return res.json({ status: "error", error: "User does not exist" }) + } + // lets get our file path with sanitized id + let path2 = path.resolve( + __dirname, + "../../assets/userthumbnails/" + sanitizedid + ".png", + ) + if (headshot === true) { + path2 = path.resolve( + __dirname, + "../../assets/userthumbnailsheadshots/" + sanitizedid + ".png", + ) + } -// lets get our file path with sanitized id - let path2=path.resolve(__dirname, "../../assets/userthumbnails/"+sanitizedid+".png") - if (headshot === true){ - path2=path.resolve(__dirname, "../../assets/userthumbnailsheadshots/"+sanitizedid+".png") - } + fs.access(path2, fs.F_OK, async err => { + if (err) { + let newrender = await rcctalk2018.OpenRender(sanitizedid, headshot) + if (newrender.error) { + return res.sendFile(path.resolve("./assets/default.png")) + } + newrender = + newrender["SOAP-ENV:Envelope"]["SOAP-ENV:Body"][ + "ns1:OpenJobResponse" + ]["ns1:OpenJobResult"][0]["ns1:value"]._text - fs.access(path2, fs.F_OK,async (err) => { - if (err) { - + res.writeHead(200, { "Content-Type": "image/png" }) - let newrender = await rcctalk2018.OpenRender(sanitizedid,headshot) - if (newrender.error){ - return res.sendFile(path.resolve("./assets/default.png")) - } - newrender = newrender['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:OpenJobResponse']['ns1:OpenJobResult'][0]['ns1:value']._text + fs.writeFile(path2, newrender, "base64", function (err) { + if (err) { + console.log("error") + } + }) + return res.end(Buffer.from(newrender, "base64")) - res.writeHead(200, {'Content-Type': 'image/png'}) + // if this timeouts and rcc doesn't return the image feor some reason then send the default fallback + //return res.sendFile(path.resolve("./assets/default.png")) + } - fs.writeFile(path2,newrender,'base64',function(err){ - if (err) { - console.log("error") - } + //file exists + if ( + req.query.method && + req.userdocument && + req.userdocument.userid == sanitizedid + ) { + // don't allow unauthenticated users to regenerate avatars and don't allow authenticated users to regenerate other peoples avatars + if (req.query.method === "regenerate") { + fs.unlink(path2, async function (err) { + if (err) { + console.log(err) + } - }) - return res.end(Buffer.from(newrender, 'base64')) + let newrender = await rcctalk2018.OpenRender( + sanitizedid, + headshot, + ) + if (newrender.error) { + return res.sendFile( + path.resolve("./assets/default.png"), + ) + } + newrender = + newrender["SOAP-ENV:Envelope"]["SOAP-ENV:Body"][ + "ns1:OpenJobResponse" + ]["ns1:OpenJobResult"][0]["ns1:value"]._text - // if this timeouts and rcc doesn't return the image feor some reason then send the default fallback - //return res.sendFile(path.resolve("./assets/default.png")) - } - - //file exists - if (req.query.method && req.userdocument && req.userdocument.userid == sanitizedid){ // don't allow unauthenticated users to regenerate avatars and don't allow authenticated users to regenerate other peoples avatars - if (req.query.method === "regenerate"){ - fs.unlink(path2,async function (err) { - if (err){ - console.log(err) - } - - - let newrender = await rcctalk2018.OpenRender(sanitizedid,headshot) - if (newrender.error){ - return res.sendFile(path.resolve("./assets/default.png")) - } - newrender = newrender['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:OpenJobResponse']['ns1:OpenJobResult'][0]['ns1:value']._text - - res.writeHead(200, {'Content-Type': 'image/png'}) - - fs.writeFile(path2,newrender,'base64',function(err){ - if (err) { - console.log("error") - } - - }) - return res.end(Buffer.from(newrender, 'base64')) - - - - }); - } - }else{ - res.sendFile(path.resolve(path2)) - return - } - - - }) + res.writeHead(200, { "Content-Type": "image/png" }) + fs.writeFile(path2, newrender, "base64", function (err) { + if (err) { + console.log("error") + } + }) + return res.end(Buffer.from(newrender, "base64")) + }) + } + } else { + res.sendFile(path.resolve(path2)) + return + } + }) }) router.post("/rcc", (req, res) => { - var ip = req.headers['cf-connecting-ip'] || req.socket.remoteAddress - if (ip == RCC_HOST || ip == "::ffff:"+RCC_HOST) { - const {player, thumbnail} = req.body - let path2=path.resolve(__dirname, "../../assets/userthumbnails/"+player+".png") - fs.writeFile(path2,thumbnail,'base64',function(err){ - if (err) { - console.log("error") - // if writing fails we can still fallback - return res.sendFile(path.resolve("./../../assets/default.png")) - } - // if it succeeds then we can send the userthumbnail - // close the job after - rcctalk.CloseJob("Thumbnailfor"+player) - }) - } + var ip = req.headers["cf-connecting-ip"] || req.socket.remoteAddress + if (ip == RCC_HOST || ip == "::ffff:" + RCC_HOST) { + const { player, thumbnail } = req.body + let path2 = path.resolve( + __dirname, + "../../assets/userthumbnails/" + player + ".png", + ) + fs.writeFile(path2, thumbnail, "base64", function (err) { + if (err) { + console.log("error") + // if writing fails we can still fallback + return res.sendFile(path.resolve("./../../assets/default.png")) + } + // if it succeeds then we can send the userthumbnail + // close the job after + rcctalk.CloseJob("Thumbnailfor" + player) + }) + } }) +router.get(["/asset", "/asset.ashx"], grabAuth, async (req, res) => { + if (!req.query.id && !req.query.assetid) { + return res.status(400) + } + let id = req.query.id ?? req.query.assetid + var sanitizedid = id.match(rgx) + const user = await item.findOne({ ItemId: sanitizedid }).lean() + if (!user) { + return res.json({ status: "error", error: "Item does not exist" }) + } + if (user.Type === "Audio") { + return res.sendFile(path.resolve("./assets/images/audio.png")) + } + if (user.Hidden === true) { + // if item isn't supposed to have a thumbnail + return res.sendFile(path.resolve("./assets/moderated.png")) + } + if (user.approved === false && !req.query.nonapproved) { + return res.sendFile(path.resolve("./assets/approval.png")) + } + if (req.query.nonapproved && req?.userdocument?.admin === false) { + // we only want admins to be able to see non approved assets anyways + return res.sendFile(path.resolve("./assets/approval.png")) + } + if ( + req.query.nonapproved && + (user.Type === "Pants" || user.Type === "Shirts") + ) { + sanitizedid -= 1 + return res.sendFile( + path.resolve( + __dirname, + "../../assets/ugc/itemfile-" + sanitizedid + ".rbxm", + ), + ) + } + if (req.query.nonapproved && user.Type === "Video") { + return res.sendFile( + path.resolve( + __dirname, + "../../assets/ugc/itemfile-" + sanitizedid + ".rbxm", + ), + ) + } + if (user.Type === "Video") { + return res.sendFile(path.resolve("./assets/video.png")) + } + if (user.Type === "User Ad" || user.Type === "Gamepass") { + try { + await fs.promises.access( + path.resolve( + __dirname, + "../../assets/ugc/itemfile-" + sanitizedid + ".rbxm", + ), + fs.constants.W_OK, + ) + return res.sendFile( + path.resolve( + __dirname, + "../../assets/ugc/itemfile-" + sanitizedid + ".rbxm", + ), + ) + } catch { + return res.sendFile( + path.resolve("./assets/images/defaultadsky.png"), + ) + } + } -router.get(["/asset","/asset.ashx"],grabAuth,async (req, res) => { - if (!req.query.id && !req.query.assetid) { - return res.status(400) - } - let id = req.query.id??req.query.assetid + // lets get our file path with sanitized id + let path2 = path.resolve( + __dirname, + "../../assets/ugc/asset-" + sanitizedid + ".png", + ) - var sanitizedid = id.match(rgx) + fs.access(path2, fs.F_OK, async err => { + if (err) { + // get our renderscript with the new character app + var newrenderscript = assetrenderscript.replace( + "local asset = 0", + 'local asset = "' + sanitizedid + '"', + ) + //open a new job for our thumbnail render request + var response = await rcctalk.OpenJob( + "Thumbnailfor" + sanitizedid, + newrenderscript, + "120", + ) + if ( + response["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["SOAP-ENV:Fault"] + ) { + // if failed then print out error close job then send a fallback image + //console.dir(response,{ depth: null }) + rcctalk.CloseJob("Thumbnailfor" + sanitizedid) + return res.sendFile(path.resolve("./assets/default.png")) + } else { + // send image to user + // wait for image to be uploaded by rcc + function check() { + setTimeout(() => { + fs.access(path2, fs.constants.F_OK, error => { + if (error) { + check() + } else { + return res.sendFile(path2) + } + }) + }, 3000) + } + } + check() - const user = await item.findOne({ItemId: sanitizedid}).lean() - if (!user) { - return res.json({status: 'error', error: 'Item does not exist'}) - } - if (user.Type === "Audio"){ - return res.sendFile(path.resolve("./assets/images/audio.png")) - } - if (user.Hidden === true){ - // if item isn't supposed to have a thumbnail - return res.sendFile(path.resolve("./assets/moderated.png")) - } - if (user.approved === false && !req.query.nonapproved){ - return res.sendFile(path.resolve("./assets/approval.png")) - } - if (req.query.nonapproved && req?.userdocument?.admin === false){ // we only want admins to be able to see non approved assets anyways - return res.sendFile(path.resolve("./assets/approval.png")) - } - if (req.query.nonapproved && (user.Type === "Pants" || user.Type === "Shirts")){ - sanitizedid -= 1 - return res.sendFile(path.resolve(__dirname, "../../assets/ugc/itemfile-"+sanitizedid+".rbxm")) - } - if (req.query.nonapproved && user.Type === "Video"){ - return res.sendFile(path.resolve(__dirname, "../../assets/ugc/itemfile-"+sanitizedid+".rbxm")) - } - if (user.Type === "Video"){ - return res.sendFile(path.resolve("./assets/video.png")) - } - if (user.Type === "User Ad" || user.Type === "Gamepass"){ - try{ - await fs.promises.access(path.resolve(__dirname, "../../assets/ugc/itemfile-"+sanitizedid+".rbxm"), fs.constants.W_OK) - return res.sendFile(path.resolve(__dirname, "../../assets/ugc/itemfile-"+sanitizedid+".rbxm")) - }catch{ - return res.sendFile(path.resolve("./assets/images/defaultadsky.png")) - } - - } - - -// lets get our file path with sanitized id - let path2=path.resolve(__dirname, "../../assets/ugc/asset-"+sanitizedid+".png") - - fs.access(path2, fs.F_OK,async (err) => { - if (err) { - - - // get our renderscript with the new character app - var newrenderscript = assetrenderscript.replace('local asset = 0','local asset = "'+sanitizedid+'"') - //open a new job for our thumbnail render request - var response = await rcctalk.OpenJob("Thumbnailfor"+sanitizedid,newrenderscript,"120") - if (response['SOAP-ENV:Envelope']['SOAP-ENV:Body']['SOAP-ENV:Fault']){ - // if failed then print out error close job then send a fallback image - //console.dir(response,{ depth: null }) - rcctalk.CloseJob("Thumbnailfor"+sanitizedid) - return res.sendFile(path.resolve("./assets/default.png")) - }else{ - // send image to user - // wait for image to be uploaded by rcc - function check() { - setTimeout(() => { - fs.access(path2, fs.constants.F_OK, error => { - if (error) { - check() - } else { - return res.sendFile(path2) - } - }); - },3000) - } - } - check() - - // if this timeouts and rcc doesn't return the image feor some reason then send the default fallback - return res.sendFile(path.resolve("./assets/default.png")) - } - - res.sendFile(path.resolve(path2)) - return - - - - }) + // if this timeouts and rcc doesn't return the image feor some reason then send the default fallback + return res.sendFile(path.resolve("./assets/default.png")) + } + res.sendFile(path.resolve(path2)) + return + }) }) - - router.post("/rccasset", (req, res) => { - var ip = req.headers['cf-connecting-ip'] || req.socket.remoteAddress - if (ip == RCC_HOST || ip == "::ffff:"+RCC_HOST) { - const {asset, thumbnail} = req.body - console.log(asset) - let path2=path.resolve(__dirname, "../../assets/ugc/asset-"+asset+".png") - fs.writeFile(path2,thumbnail,'base64',function(err){ - if (err) { - console.log("error") - // if writing fails we can still fallback - return res.sendFile(path.resolve("./../../assets/default.png")) - } - // if it succeeds then we can send the userthumbnail - // close the job after - rcctalk.CloseJob("Thumbnailforasset"+asset) - }) - } + var ip = req.headers["cf-connecting-ip"] || req.socket.remoteAddress + if (ip == RCC_HOST || ip == "::ffff:" + RCC_HOST) { + const { asset, thumbnail } = req.body + console.log(asset) + let path2 = path.resolve( + __dirname, + "../../assets/ugc/asset-" + asset + ".png", + ) + fs.writeFile(path2, thumbnail, "base64", function (err) { + if (err) { + console.log("error") + // if writing fails we can still fallback + return res.sendFile(path.resolve("./../../assets/default.png")) + } + // if it succeeds then we can send the userthumbnail + // close the job after + rcctalk.CloseJob("Thumbnailforasset" + asset) + }) + } }) -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/api/requestad.js b/Back/routes/api/requestad.js index ddbfc1c..ed8ed46 100644 --- a/Back/routes/api/requestad.js +++ b/Back/routes/api/requestad.js @@ -1,40 +1,50 @@ const express = require("express") const router = express.Router() -const { requireAuth } = require('./../../middleware/authmiddleware') -const bodyParser = require('body-parser') -const catalog = require('./../../model/item.js') +const { requireAuth } = require("./../../middleware/authmiddleware") +const bodyParser = require("body-parser") +const catalog = require("./../../model/item.js") //const path = require('path'); router.use(bodyParser.json()) // only supports skyscraper ads for now -router.get("/",async (req, res) => { +router.get("/", async (req, res) => { + const activeAdCount = await catalog.countDocuments({ ActiveAd: true }) - const activeAdCount = await catalog.countDocuments({ActiveAd: true}) + //console.log(activeAdCount) - //console.log(activeAdCount) + let random = Math.floor(Math.random() * activeAdCount) - let random = Math.floor(Math.random() * activeAdCount) + const Addoc = await catalog.findOne({ ActiveAd: true }).skip(random) + if (!Addoc) { + // no ads are running! + return res.json({ + imageUrl: "/assets/images/defaultadsky.png", + redirectUrl: "#", + AdID: 0, + }) + } - const Addoc = await catalog.findOne({ActiveAd: true}).skip(random) - if (!Addoc){ - // no ads are running! - return res.json({imageUrl: "/assets/images/defaultadsky.png", redirectUrl: "#", AdID: 0}) - } + if ( + Addoc.adstartedtime <= + new Date(new Date().getTime() - 24 * 60 * 60 * 1000).getTime() || + Addoc.Hidden + ) { + // more than 24 hours old invalidate ad OR ad was moderated + Addoc.ActiveAd = false + Addoc.markModified("ActiveAd") + await Addoc.save() + } + let redirectUrl - if (Addoc.adstartedtime <= new Date(new Date().getTime() - (24 * 60 * 60 * 1000)).getTime() || Addoc.Hidden){ - // more than 24 hours old invalidate ad OR ad was moderated - Addoc.ActiveAd = false - Addoc.markModified('ActiveAd') - await Addoc.save() - } - let redirectUrl + if (Addoc.adtype === "game") { + redirectUrl = "/games/" + Addoc.adredirectid + } - if (Addoc.adtype === "game"){ - redirectUrl = "/games/"+Addoc.adredirectid - } - - return res.json({imageUrl: "/api/thumbnailrender/asset?id="+Addoc.ItemId, redirectUrl, AdID: Addoc.ItemId}) - + return res.json({ + imageUrl: "/api/thumbnailrender/asset?id=" + Addoc.ItemId, + redirectUrl, + AdID: Addoc.ItemId, + }) }) -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/api/updategameinfo.js b/Back/routes/api/updategameinfo.js index 7fdcd75..fa78da1 100644 --- a/Back/routes/api/updategameinfo.js +++ b/Back/routes/api/updategameinfo.js @@ -1,270 +1,316 @@ const express = require("express") const router = express.Router() -const bodyParser = require('body-parser') -const rcc = require('./../../model/rcc.js') -const rcc2018 = require('./../../model/rcc2018.js') -const rcc2020 = require('./../../model/rcc2020.js') -const games = require('./../../model/games.js') -const rcctalk = require('./../../rcctalk') -const rcctalk2018 = require('./../../rcctalk2018') -const User = require('../../model/user.js') +const bodyParser = require("body-parser") +const rcc = require("./../../model/rcc.js") +const rcc2018 = require("./../../model/rcc2018.js") +const rcc2020 = require("./../../model/rcc2020.js") +const games = require("./../../model/games.js") +const rcctalk = require("./../../rcctalk") +const rcctalk2018 = require("./../../rcctalk2018") +const User = require("../../model/user.js") router.use(bodyParser.json()) -require('dotenv').config() +require("dotenv").config() const RCC_HOST = process.env.RCC_HOST router.post("/api/updategameinfo", async (req, res) => { - var ip = req.headers['cf-connecting-ip'] || req.socket.remoteAddress - if (ip == RCC_HOST || ip == "::ffff:"+RCC_HOST) { - const {game,players} = req.body - //const instance = await rcc.findOne({PlaceId: game}).lean() + var ip = req.headers["cf-connecting-ip"] || req.socket.remoteAddress + if (ip == RCC_HOST || ip == "::ffff:" + RCC_HOST) { + const { game, players } = req.body + //const instance = await rcc.findOne({PlaceId: game}).lean() - games.updateOne({idofgame: game}, { - $set: { - numberofplayers: parseInt(players).toString() - } - }, - function(err, doc) { - //console.log(err) - }) + games.updateOne( + { idofgame: game }, + { + $set: { + numberofplayers: parseInt(players).toString(), + }, + }, + function (err, doc) { + //console.log(err) + }, + ) - res.send("good") - } + res.send("good") + } }) -router.all(["/api/updategameinfo/updatevisits","/game/placevisit.ashx"], async (req, res) => { - var ip = req.headers['cf-connecting-ip'] || req.socket.remoteAddress - if (ip == RCC_HOST || ip == "::ffff:"+RCC_HOST) { - let {game} = req.body - if (req.query.AssociatedPlaceID){ - game = req.query.AssociatedPlaceID - } - //const instance = await rcc.findOne({PlaceId: game}).lean() +router.all( + ["/api/updategameinfo/updatevisits", "/game/placevisit.ashx"], + async (req, res) => { + var ip = req.headers["cf-connecting-ip"] || req.socket.remoteAddress + if (ip == RCC_HOST || ip == "::ffff:" + RCC_HOST) { + let { game } = req.body + if (req.query.AssociatedPlaceID) { + game = req.query.AssociatedPlaceID + } + //const instance = await rcc.findOne({PlaceId: game}).lean() - games.updateOne({idofgame: game}, { - $inc: { - visits: 1 - } - }, - function(err, doc) { - //console.log(err) - }) + games.updateOne( + { idofgame: game }, + { + $inc: { + visits: 1, + }, + }, + function (err, doc) { + //console.log(err) + }, + ) - res.send("good") - } -}) + res.send("good") + } + }, +) router.all("/api/updategameinfo/gameloaded", async (req, res) => { - var ip = req.headers['cf-connecting-ip'] || req.socket.remoteAddress - if (ip == RCC_HOST || ip == "::ffff:"+RCC_HOST) { - let {game} = req.body - const gamedoc = await games.findOne({idofgame: game}).lean() - if (gamedoc.version === "2020"){ + var ip = req.headers["cf-connecting-ip"] || req.socket.remoteAddress + if (ip == RCC_HOST || ip == "::ffff:" + RCC_HOST) { + let { game } = req.body + const gamedoc = await games.findOne({ idofgame: game }).lean() + if (gamedoc.version === "2020") { + rcc2020.updateOne( + { PlaceId: game }, + { + $set: { + Status: 2, + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + } + if (gamedoc.version === "2018") { + rcc2018.updateOne( + { PlaceId: game }, + { + $set: { + Status: 2, + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + } + if (gamedoc.version === "2016") { + rcc.updateOne( + { PlaceId: game }, + { + $set: { + Status: 2, + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + } - rcc2020.updateOne({PlaceId: game}, { - $set: { - Status: 2 - } - }, - function(err, doc) { - //console.log(err) - }) - - } - if (gamedoc.version === "2018"){ - - rcc2018.updateOne({PlaceId: game}, { - $set: { - Status: 2 - } - }, - function(err, doc) { - //console.log(err) - }) - - } - if (gamedoc.version === "2016"){ - - rcc.updateOne({PlaceId: game}, { - $set: { - Status: 2 - } - }, - function(err, doc) { - //console.log(err) - }) - - } - - - res.send("good") - } + res.send("good") + } }) - router.post("/api/updategameinfo/closejob", async (req, res) => { - var ip = req.headers['cf-connecting-ip'] || req.socket.remoteAddress - if (ip == RCC_HOST || ip == "::ffff:"+RCC_HOST) { - console.log("closed") - let {game} = req.body - if(typeof game === 'string'){ - game = game.replace('game','') - } - //const instance = await rcc.findOne({PlaceId: game}).lean() - games.updateOne({idofgame: game}, { - $set: { - numberofplayers: "0" - } - }, - function(err, doc) { - //console.log(err) - }) - games.updateOne({idofgame: game}, { - $set: { - players: [] - } - }, - function(err, doc) { - //console.log(err) - }) - const gamedoc = await games.findOne({idofgame: game}).lean() - try{ - if (gamedoc.version === "2018"){ - await rcc2018.deleteOne({PlaceId: game}) - rcctalk2018.CloseJob("game"+game) - } - }catch{} - try{ - if (gamedoc.version === "2020"){ - await rcc2020.deleteOne({PlaceId: game}) - rcctalk2018.CloseJob("game"+game) - } - }catch{} - try{ - if (gamedoc.version === "2016"){ - await rcc.deleteOne({PlaceId: game}) - - rcctalk.CloseJob("game"+game) - } - }catch{} + var ip = req.headers["cf-connecting-ip"] || req.socket.remoteAddress + if (ip == RCC_HOST || ip == "::ffff:" + RCC_HOST) { + console.log("closed") + let { game } = req.body + if (typeof game === "string") { + game = game.replace("game", "") + } + //const instance = await rcc.findOne({PlaceId: game}).lean() + games.updateOne( + { idofgame: game }, + { + $set: { + numberofplayers: "0", + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + games.updateOne( + { idofgame: game }, + { + $set: { + players: [], + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + const gamedoc = await games.findOne({ idofgame: game }).lean() + try { + if (gamedoc.version === "2018") { + await rcc2018.deleteOne({ PlaceId: game }) + rcctalk2018.CloseJob("game" + game) + } + } catch {} + try { + if (gamedoc.version === "2020") { + await rcc2020.deleteOne({ PlaceId: game }) + rcctalk2018.CloseJob("game" + game) + } + } catch {} + try { + if (gamedoc.version === "2016") { + await rcc.deleteOne({ PlaceId: game }) -res.send("good") - } + rcctalk.CloseJob("game" + game) + } + } catch {} + + res.send("good") + } }) router.get("/api/updategameinfo/closealljobs", async (req, res) => { - var ip = req.headers['cf-connecting-ip'] || req.socket.remoteAddress - if (ip == RCC_HOST || ip == "::ffff:"+RCC_HOST) { - console.log("closed all") - //const instance = await rcc.findOne({PlaceId: game}).lean() + var ip = req.headers["cf-connecting-ip"] || req.socket.remoteAddress + if (ip == RCC_HOST || ip == "::ffff:" + RCC_HOST) { + console.log("closed all") + //const instance = await rcc.findOne({PlaceId: game}).lean() - await rcc.deleteMany({}) - games.updateMany({version: "2016"}, { - $set: { - numberofplayers: "0" - } - }, - function(err, doc) { - //console.log(err) - }) - games.updateMany({version: "2016"}, { - $set: { - players: [] - } - }, - function(err, doc) { - //console.log(err) - }) - rcctalk.CloseAllJobs() -res.send("good") - } + await rcc.deleteMany({}) + games.updateMany( + { version: "2016" }, + { + $set: { + numberofplayers: "0", + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + games.updateMany( + { version: "2016" }, + { + $set: { + players: [], + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + rcctalk.CloseAllJobs() + res.send("good") + } }) router.all(["/api/updategameinfo/updatepresence"], async (req, res) => { - var ip = req.headers['cf-connecting-ip'] || req.socket.remoteAddress - if (ip == RCC_HOST || ip == "::ffff:"+RCC_HOST) { - let {game,player,name,action} = req.body - game = await games.findOne({idofgame: game}) - if (action === "joining" || action === "connect"){ - const updatedcount = parseFloat(game.numberofplayers)+1 - games.updateOne({idofgame: game.idofgame}, { - $push: { - players: {userid: player, name: name} - }, - $set: { - numberofplayers: updatedcount.toString() - } - }, - function(err, doc) { - //console.log(err) - }) - User.updateOne({userid: player}, { - $set: { - status: JSON.stringify({status: "Playing "+game.nameofgame,id: game.idofgame}) - }, - $addToSet: { - recentlyplayed: {id: game.idofgame} - }, - }, - function(err, doc) { - //console.log(err) - }) - User.updateOne({userid: player}, { - $set: { - status: JSON.stringify({status: "Playing "+game.nameofgame,id: game.idofgame}) - }, - $push: { - recentlyplayed: {$each: [], $slice: -10}// limit for recently played is 10 so slice anything older than that - }, - }, - function(err, doc) { - //console.log(err) - }) - if (game.version === "2018" || game.version === "2020"){ - rcctalk2018.RenewLease("game"+game.idofgame,"69530318916789546987353800") // if someone joins we want to renew the lease so it doesn't expire - // mostly just for stopping people from spamming urls and keeping games loaded - } - if (game.version === "2020"){ // 2020 doesn't do visits for some reason - games.updateOne({idofgame: game.idofgame}, { - $inc: { - visits: 1 - } - }, - function(err, doc) { - //console.log(err) - }) - } + var ip = req.headers["cf-connecting-ip"] || req.socket.remoteAddress + if (ip == RCC_HOST || ip == "::ffff:" + RCC_HOST) { + let { game, player, name, action } = req.body + game = await games.findOne({ idofgame: game }) + if (action === "joining" || action === "connect") { + const updatedcount = parseFloat(game.numberofplayers) + 1 + games.updateOne( + { idofgame: game.idofgame }, + { + $push: { + players: { userid: player, name: name }, + }, + $set: { + numberofplayers: updatedcount.toString(), + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + User.updateOne( + { userid: player }, + { + $set: { + status: JSON.stringify({ + status: "Playing " + game.nameofgame, + id: game.idofgame, + }), + }, + $addToSet: { + recentlyplayed: { id: game.idofgame }, + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + User.updateOne( + { userid: player }, + { + $set: { + status: JSON.stringify({ + status: "Playing " + game.nameofgame, + id: game.idofgame, + }), + }, + $push: { + recentlyplayed: { $each: [], $slice: -10 }, // limit for recently played is 10 so slice anything older than that + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + if (game.version === "2018" || game.version === "2020") { + rcctalk2018.RenewLease( + "game" + game.idofgame, + "69530318916789546987353800", + ) // if someone joins we want to renew the lease so it doesn't expire + // mostly just for stopping people from spamming urls and keeping games loaded + } + if (game.version === "2020") { + // 2020 doesn't do visits for some reason + games.updateOne( + { idofgame: game.idofgame }, + { + $inc: { + visits: 1, + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + } + } + if (action === "leaving" || action === "disconnect") { + const updatedcount = parseFloat(game.numberofplayers) - 1 + games.updateOne( + { idofgame: game.idofgame }, + { + $pull: { + players: { userid: player, name: name }, + }, + $set: { + numberofplayers: updatedcount.toString(), + }, + }, + function (err, doc) { + //console.log(err) + }, + ) - } + User.updateOne( + { userid: player }, + { + $set: { + status: JSON.stringify({ status: "Offline" }), + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + } - if (action === "leaving"|| action === "disconnect"){ - const updatedcount = parseFloat(game.numberofplayers)-1 - games.updateOne({idofgame: game.idofgame}, { - $pull: { - players: {userid: player, name: name} - }, - $set: { - numberofplayers: updatedcount.toString() - } - }, - function(err, doc) { - //console.log(err) - }) - - - User.updateOne({userid: player}, { - $set: { - status: JSON.stringify({status: "Offline"}) - } - }, - function(err, doc) { - //console.log(err) - }) - } - - -res.send("good") - } + res.send("good") + } }) -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/api/updateusermembership.js b/Back/routes/api/updateusermembership.js index 831ff99..3859005 100644 --- a/Back/routes/api/updateusermembership.js +++ b/Back/routes/api/updateusermembership.js @@ -1,57 +1,58 @@ const express = require("express") const router = express.Router() -const user = require('./../..//model/user.js') -const { requireAuth } = require('./../../middleware/authmiddleware') +const user = require("./../..//model/user.js") +const { requireAuth } = require("./../../middleware/authmiddleware") -router.post("/buymembership",requireAuth,async (req, res) => { +router.post("/buymembership", requireAuth, async (req, res) => { + if (req.userdocument?.membership != "None") { + return res.json({ + status: "error", + error: "You already have membership!", + }) + } - if (req.userdocument?.membership != "None"){ - return res.json({status:"error",error:"You already have membership!"}) - } + if (req.userdocument.coins >= 200) { + req.userdocument.coins -= 200 + req.userdocument.membership = "BuildersClub" - if (req.userdocument.coins >= 200){ + req.userdocument.markModified("coins") + req.userdocument.markModified("membership") + await req.userdocument.save() - req.userdocument.coins -= 200 - req.userdocument.membership = "BuildersClub" + return res.json({ + status: "success", + message: "You have builders club now!", + }) + } - req.userdocument.markModified('coins') - req.userdocument.markModified('membership') - await req.userdocument.save() - - return res.json({status:"success",message:"You have builders club now!"}) - - } - - return res.json({status: "error",error:"Not enough rocks!"}) + return res.json({ status: "error", error: "Not enough rocks!" }) }) -router.post("/:id",async (req, res) => { - var id = req.params.id; - if (isNaN(parseFloat(id)) === true){ - return res.json({error: true}) - } +router.post("/:id", async (req, res) => { + var id = req.params.id + if (isNaN(parseFloat(id)) === true) { + return res.json({ error: true }) + } - var key = req.query.key; - if (isNaN(parseFloat(key)) === true){ - return res.json({error: true}) - } - if (key !== "33808292371407362400921749206284699231416675010973"){ - return res.json({error: true}) - } + var key = req.query.key + if (isNaN(parseFloat(key)) === true) { + return res.json({ error: true }) + } + if (key !== "33808292371407362400921749206284699231416675010973") { + return res.json({ error: true }) + } - const response = await user.findOne({userid: id}) - - if (!response){ - console.log(response) - return res.json({error: true}) - } - - response.membership = req.query.newmembership - response.markModified('membership') - await response.save() - return res.json({error: false}) + const response = await user.findOne({ userid: id }) + if (!response) { + console.log(response) + return res.json({ error: true }) + } + response.membership = req.query.newmembership + response.markModified("membership") + await response.save() + return res.json({ error: false }) }) -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/api/userinfo.js b/Back/routes/api/userinfo.js index afc09d5..4686f13 100644 --- a/Back/routes/api/userinfo.js +++ b/Back/routes/api/userinfo.js @@ -1,116 +1,162 @@ const express = require("express") const router = express.Router() -const user = require('./../..//model/user.js') +const user = require("./../..//model/user.js") const games = require("./../../model/games.js") const RelativeTime = require("@yaireo/relative-time") const relativeTime = new RelativeTime() -router.get("/:id",async (req, res) => { - var id = req.params.id; - if (isNaN(parseFloat(id)) === true){ - return res.json({error: true}) - } - const response = await user.findOne({userid: id}).lean() +router.get("/:id", async (req, res) => { + var id = req.params.id + if (isNaN(parseFloat(id)) === true) { + return res.json({ error: true }) + } + const response = await user.findOne({ userid: id }).lean() - if (!response){ - return res.json({error: true, message: "404"}) - } - - let status = {status: "Offline"} - if (response.status){ - status = JSON.parse(response.status) - } - const actualTimeMilliseconds = new Date().getTime() - if (response.timesincelastrequest && actualTimeMilliseconds - response.timesincelastrequest >= 60000 * 3 /*3 minutes*/ && status && status.status.includes("Playing") === false || response.timesincelastrequest && actualTimeMilliseconds - response.timesincelastrequest >= 60000 * 3 /*3 minutes*/ && !status){ - // been 3 minutes since last request mark as offline make sure we don't mark them offline while they are playing a game - status.status = "Offline" - response.status = JSON.stringify(status) - status = JSON.parse(response.status) - } - if (response.timesincelastrequest && actualTimeMilliseconds - response.timesincelastrequest <= 60000 * 3 /*3 minutes*/ && status && status.status.includes("Playing") === false || response.timesincelastrequest && actualTimeMilliseconds - response.timesincelastrequest <= 60000 * 3 /*3 minutes*/ && !status){ - status.status = "Online" - response.status = JSON.stringify(status) - status = JSON.parse(response.status) - } - - return res.json({error:false, userinfo: {joindate: response.joindate, joindateepoch:new Date(response._id.getTimestamp()).getTime(), lastonline: relativeTime.from(new Date(response.timesincelastrequest)), lastonlineepoch: response.timesincelastrequest, coins: response.coins, username: response.username,userid: response.userid,friends: response.friends, admin: response.admin, discordid: response.discordid, membership: response.membership, inventory: response.inventory, bio: response.bio, status,followers: response.followers?.length, css: response.css, aboutme: response.aboutme}}) + if (!response) { + return res.json({ error: true, message: "404" }) + } + let status = { status: "Offline" } + if (response.status) { + status = JSON.parse(response.status) + } + const actualTimeMilliseconds = new Date().getTime() + if ( + (response.timesincelastrequest && + actualTimeMilliseconds - response.timesincelastrequest >= + 60000 * 3 /*3 minutes*/ && + status && + status.status.includes("Playing") === false) || + (response.timesincelastrequest && + actualTimeMilliseconds - response.timesincelastrequest >= + 60000 * 3 /*3 minutes*/ && + !status) + ) { + // been 3 minutes since last request mark as offline make sure we don't mark them offline while they are playing a game + status.status = "Offline" + response.status = JSON.stringify(status) + status = JSON.parse(response.status) + } + if ( + (response.timesincelastrequest && + actualTimeMilliseconds - response.timesincelastrequest <= + 60000 * 3 /*3 minutes*/ && + status && + status.status.includes("Playing") === false) || + (response.timesincelastrequest && + actualTimeMilliseconds - response.timesincelastrequest <= + 60000 * 3 /*3 minutes*/ && + !status) + ) { + status.status = "Online" + response.status = JSON.stringify(status) + status = JSON.parse(response.status) + } + return res.json({ + error: false, + userinfo: { + joindate: response.joindate, + joindateepoch: new Date(response._id.getTimestamp()).getTime(), + lastonline: relativeTime.from( + new Date(response.timesincelastrequest), + ), + lastonlineepoch: response.timesincelastrequest, + coins: response.coins, + username: response.username, + userid: response.userid, + friends: response.friends, + admin: response.admin, + discordid: response.discordid, + membership: response.membership, + inventory: response.inventory, + bio: response.bio, + status, + followers: response.followers?.length, + css: response.css, + aboutme: response.aboutme, + }, + }) }) -router.get("/:id/creations",async (req, res) => { - var id = req.params.id; - if (isNaN(parseFloat(id)) === true){ - return res.json({error: true}) - } - const response = await user.findOne({userid: id}).lean() +router.get("/:id/creations", async (req, res) => { + var id = req.params.id + if (isNaN(parseFloat(id)) === true) { + return res.json({ error: true }) + } + const response = await user.findOne({ userid: id }).lean() - if (!response){ - return res.status(404).json({error: true, message: "Not found"}) - } - - const gameresponse = await games.find({useridofowner: id}).lean().select(['idofgame', 'version', 'nameofgame', 'numberofplayers', 'visits', 'useridofowner']) - - return res.json(gameresponse) + if (!response) { + return res.status(404).json({ error: true, message: "Not found" }) + } + const gameresponse = await games + .find({ useridofowner: id }) + .lean() + .select([ + "idofgame", + "version", + "nameofgame", + "numberofplayers", + "visits", + "useridofowner", + ]) + return res.json(gameresponse) }) -router.get("/:id/visits",async (req, res) => { - var id = req.params.id; - if (isNaN(parseFloat(id)) === true){ - return res.json({error: true}) - } - const response = await user.findOne({userid: id}).lean() +router.get("/:id/visits", async (req, res) => { + var id = req.params.id + if (isNaN(parseFloat(id)) === true) { + return res.json({ error: true }) + } + const response = await user.findOne({ userid: id }).lean() - if (!response){ - return res.status(404).json({error: true, message: "Not found"}) - } - - const visits = await games.aggregate([ - { $match: { useridofowner: parseFloat(id) } }, - { - "$group": { - "_id": null, - "visits": { - '$sum': "$visits" - } - } - } - ]) - - return res.json({error: false,visits: visits[0]?.visits || 0}) + if (!response) { + return res.status(404).json({ error: true, message: "Not found" }) + } + const visits = await games.aggregate([ + { $match: { useridofowner: parseFloat(id) } }, + { + $group: { + _id: null, + visits: { + $sum: "$visits", + }, + }, + }, + ]) + return res.json({ error: false, visits: visits[0]?.visits || 0 }) }) +router.get("/usernametoid/:id", async (req, res) => { + var id = req.params.id -router.get("/usernametoid/:id",async (req, res) => { + const response = await user + .findOne({ username: { $regex: id, $options: "i" } }) + .lean() - var id = req.params.id; + if (!response) { + console.log(response) + return res.json({ error: true }) + } - const response = await user.findOne({username: {'$regex': id,$options:'i'}}).lean() - - if (!response){ - console.log(response) - return res.json({error: true}) - } - - return res.json({error:false, userid: response.userid}) + return res.json({ error: false, userid: response.userid }) }) -router.get("/discordidtouserid/:id",async (req, res) => { +router.get("/discordidtouserid/:id", async (req, res) => { + var id = req.params.id - var id = req.params.id; + const response = await user.findOne({ discordid: id }).lean() - const response = await user.findOne({discordid: id}).lean() + if (!response) { + console.log(response) + return res.json({ error: true }) + } - if (!response){ - console.log(response) - return res.json({error: true}) - } - - return res.json({error:false, userid: response.userid}) + return res.json({ error: false, userid: response.userid }) }) -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/api/verify.js b/Back/routes/api/verify.js index ca6d62e..a7d9c41 100644 --- a/Back/routes/api/verify.js +++ b/Back/routes/api/verify.js @@ -1,33 +1,35 @@ const express = require("express") const router = express.Router() -const { requireAuth } = require('./../../middleware/authmiddleware') -const games = require('./../../model/games.js') -const bodyParser = require('body-parser') +const { requireAuth } = require("./../../middleware/authmiddleware") +const games = require("./../../model/games.js") +const bodyParser = require("body-parser") router.use(bodyParser.json()) -router.post("/", requireAuth,async (req, res) => { - const {gameid} = req.body - if (typeof gameid == "undefined"){ - return res.json("Send gameid Please") - } - if (req.userdocument.admin == false) { - return res.redirect('/') - } - try{ - games.updateOne({idofgame: gameid}, { - $set: { - featured: true - } - }, - function(err, doc) { - //console.log(err) - }) - }catch(err){ - console.log(err) - } - - return res.json({status: 'ok'}) +router.post("/", requireAuth, async (req, res) => { + const { gameid } = req.body + if (typeof gameid == "undefined") { + return res.json("Send gameid Please") + } + if (req.userdocument.admin == false) { + return res.redirect("/") + } + try { + games.updateOne( + { idofgame: gameid }, + { + $set: { + featured: true, + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + } catch (err) { + console.log(err) + } + return res.json({ status: "ok" }) }) -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/assets.js b/Back/routes/assets.js index 32d30e0..6855b1c 100644 --- a/Back/routes/assets.js +++ b/Back/routes/assets.js @@ -1,130 +1,190 @@ const { response } = require("express") const express = require("express") const router = express.Router() -const fs = require('fs') -var path = require('path'); -const crypto = require('crypto'); -require('dotenv').config() +const fs = require("fs") +var path = require("path") +const crypto = require("crypto") +require("dotenv").config() const RCC_HOST = process.env.RCC_HOST -const User = require('../model/user.js') +const User = require("../model/user.js") const catalog = require("../model/item") -const games = require('./../model/games.js') -const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args)); +const games = require("./../model/games.js") +const fetch = (...args) => + import("node-fetch").then(({ default: fetch }) => fetch(...args)) //redirect hmmmm -var rgx = /^[0-9]*\.?[0-9]*$/; -router.get("/",async (req, res) => { -if (req.query.name){ - const user = await User.findOne({userid: req.query.name}).lean() - if (!user) { - return res.json({status: 'error', error: 'User not found!'}) - } +var rgx = /^[0-9]*\.?[0-9]*$/ +router.get("/", async (req, res) => { + if (req.query.name) { + const user = await User.findOne({ userid: req.query.name }).lean() + if (!user) { + return res.json({ status: "error", error: "User not found!" }) + } - if (req.query.rcc){ - var empty = [] - for (var key of user.colors) { - empty.push(key.value) - } - return res.json(empty) - } + if (req.query.rcc) { + var empty = [] + for (var key of user.colors) { + empty.push(key.value) + } + return res.json(empty) + } - - res.type('application/xml'); - var colorsxml = ` + res.type("application/xml") + var colorsxml = + ` null nil - `+user.colors.find(x => x.name === 'Head').value+` - `+user.colors.find(x => x.name === 'Left Arm').value+` - `+user.colors.find(x => x.name === 'Left Leg').value+` + ` + + user.colors.find(x => x.name === "Head").value + + ` + ` + + user.colors.find(x => x.name === "Left Arm").value + + ` + ` + + user.colors.find(x => x.name === "Left Leg").value + + ` Body Colors - `+user.colors.find(x => x.name === 'Right Arm').value+` - `+user.colors.find(x => x.name === 'Right Leg').value+` - `+user.colors.find(x => x.name === 'Torso').value+` + ` + + user.colors.find(x => x.name === "Right Arm").value + + ` + ` + + user.colors.find(x => x.name === "Right Leg").value + + ` + ` + + user.colors.find(x => x.name === "Torso").value + + ` true ` - return res.send(colorsxml) -} - if (req.query.method || /*req.headers?.["requester"] === "Server" &&*/ req.headers?.["assettype"] === "Place"){ - var ip = req.headers['cf-connecting-ip'] || req.socket.remoteAddress - console.log(ip) - var sanitizedid = req.query.id.match(rgx) - if (ip === RCC_HOST || ip === "::ffff:"+RCC_HOST){ - fs.access("./assets/ugc/gamefile-"+sanitizedid+".rbxl", fs.F_OK, (err) => { - if (err) { - - res.status(404).send("not found") - return - } - - - //file exists - res.sendFile(path.resolve("./assets/ugc/gamefile-"+sanitizedid+".rbxl")) - return - }) - } - }else{ - if (!req.query.id){ - req.query.id = req.query.assetversionid - } - if (isNaN(parseFloat(req.query.id)) === true){ - res.writeHead(302, {'Location': 'https://assetdelivery.roblox.com/v1/asset?id=' + req.query.id}); - return res.end(); - } - var sanitizedid = parseFloat(req.query.id) - const response = await catalog.findOne({ItemId: sanitizedid}).lean() - var ip = req.headers['cf-connecting-ip'] || req.socket.remoteAddress - if (response?.approved === false && (ip != RCC_HOST || ip === "::ffff:"+RCC_HOST) && !req.query.nonapproved){ - return res.status(401).end() - } - //this will only allow numbers in our system so that we don't allow nodejs to expose our whole server filesystem - fs.access("./assets/ugc/itemfile-"+sanitizedid+".rbxm", fs.F_OK,async (err) => { - //console.log("./assets/ugc/itemfile-"+sanitizedid+".rbxm") - if (err) { - if (req.headers?.['user-agent']?.includes("Android") === true || req.headers?.['user-agent']?.includes("iPhone") === true){ - const response = await fetch('https://assetdelivery.roblox.com/v1/assetId/' + req.query.id,{headers: {'User-Agent': 'Roblox/WinInet'}}); - const data = await response.json(); - if (data){ - if (data.location){ - res.writeHead(302, {'Location': data.location}); - res.end(); - return - } - } - } - if (req.query.id === "507766666"){ // 2018 r15 animation use legacy - res.writeHead(302, {'Location': 'https://assetdelivery.roblox.com/v1/asset?id=' + req.query.id + '&version=3'}); - return res.end() - } - if (req.query.id === "507766388"){ - res.writeHead(302, {'Location': 'https://assetdelivery.roblox.com/v1/asset?id=' + req.query.id + '&version=2'}); - return res.end() - } - if (req.query.id === "62633901"){ - return res.sendFile(path.resolve('./assets/ugc/common/itemfile-'+sanitizedid+".rbxm")) - } - res.writeHead(302, {'Location': 'https://assetdelivery.roblox.com/v1/asset?id=' + req.query.id}); - res.end(); - return - } + return res.send(colorsxml) + } + if ( + req.query.method || + /*req.headers?.["requester"] === "Server" &&*/ req.headers?.[ + "assettype" + ] === "Place" + ) { + var ip = req.headers["cf-connecting-ip"] || req.socket.remoteAddress + console.log(ip) + var sanitizedid = req.query.id.match(rgx) + if (ip === RCC_HOST || ip === "::ffff:" + RCC_HOST) { + fs.access( + "./assets/ugc/gamefile-" + sanitizedid + ".rbxl", + fs.F_OK, + err => { + if (err) { + res.status(404).send("not found") + return + } - res.sendFile(path.resolve('./assets/ugc/itemfile-'+sanitizedid+".rbxm")) - return + //file exists + res.sendFile( + path.resolve( + "./assets/ugc/gamefile-" + sanitizedid + ".rbxl", + ), + ) + return + }, + ) + } + } else { + if (!req.query.id) { + req.query.id = req.query.assetversionid + } + if (isNaN(parseFloat(req.query.id)) === true) { + res.writeHead(302, { + Location: + "https://assetdelivery.roblox.com/v1/asset?id=" + + req.query.id, + }) + return res.end() + } + var sanitizedid = parseFloat(req.query.id) + const response = await catalog.findOne({ ItemId: sanitizedid }).lean() + var ip = req.headers["cf-connecting-ip"] || req.socket.remoteAddress + if ( + response?.approved === false && + (ip != RCC_HOST || ip === "::ffff:" + RCC_HOST) && + !req.query.nonapproved + ) { + return res.status(401).end() + } + //this will only allow numbers in our system so that we don't allow nodejs to expose our whole server filesystem + fs.access( + "./assets/ugc/itemfile-" + sanitizedid + ".rbxm", + fs.F_OK, + async err => { + //console.log("./assets/ugc/itemfile-"+sanitizedid+".rbxm") + if (err) { + if ( + req.headers?.["user-agent"]?.includes("Android") === + true || + req.headers?.["user-agent"]?.includes("iPhone") === true + ) { + const response = await fetch( + "https://assetdelivery.roblox.com/v1/assetId/" + + req.query.id, + { headers: { "User-Agent": "Roblox/WinInet" } }, + ) + const data = await response.json() + if (data) { + if (data.location) { + res.writeHead(302, { Location: data.location }) + res.end() + return + } + } + } + if (req.query.id === "507766666") { + // 2018 r15 animation use legacy + res.writeHead(302, { + Location: + "https://assetdelivery.roblox.com/v1/asset?id=" + + req.query.id + + "&version=3", + }) + return res.end() + } + if (req.query.id === "507766388") { + res.writeHead(302, { + Location: + "https://assetdelivery.roblox.com/v1/asset?id=" + + req.query.id + + "&version=2", + }) + return res.end() + } + if (req.query.id === "62633901") { + return res.sendFile( + path.resolve( + "./assets/ugc/common/itemfile-" + + sanitizedid + + ".rbxm", + ), + ) + } + res.writeHead(302, { + Location: + "https://assetdelivery.roblox.com/v1/asset?id=" + + req.query.id, + }) + res.end() + return + } - - - - }) - } - - + res.sendFile( + path.resolve( + "./assets/ugc/itemfile-" + sanitizedid + ".rbxm", + ), + ) + return + }, + ) + } }) - - - -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/avatar.js b/Back/routes/avatar.js index 86a203b..f412585 100644 --- a/Back/routes/avatar.js +++ b/Back/routes/avatar.js @@ -1,20 +1,19 @@ const express = require("express") const router = express.Router() -const { requireAuth } = require('./../middleware/authmiddleware') -const User = require('./../model/user.js') - -router.post("/updateavatartype", requireAuth,async (req, res) => { - let newavatartype - if (req.userdocument?.avatartype === "R15"){ - newavatartype = "R6" - }else{ - newavatartype = "R15" - } - req.userdocument.avatartype = newavatartype - req.userdocument.markModified('avatartype') - await req.userdocument.save() - return res.json({status: "success", message: "Done!"}) +const { requireAuth } = require("./../middleware/authmiddleware") +const User = require("./../model/user.js") +router.post("/updateavatartype", requireAuth, async (req, res) => { + let newavatartype + if (req.userdocument?.avatartype === "R15") { + newavatartype = "R6" + } else { + newavatartype = "R15" + } + req.userdocument.avatartype = newavatartype + req.userdocument.markModified("avatartype") + await req.userdocument.save() + return res.json({ status: "success", message: "Done!" }) }) -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/catalog.js b/Back/routes/catalog.js index 4c18242..5c879e1 100644 --- a/Back/routes/catalog.js +++ b/Back/routes/catalog.js @@ -1,101 +1,188 @@ const express = require("express") const router = express.Router() -const { requireAuth } = require('./../middleware/authmiddleware') -const User = require('./../model/item.js') -const bodyParser = require('body-parser') +const { requireAuth } = require("./../middleware/authmiddleware") +const User = require("./../model/item.js") +const bodyParser = require("body-parser") router.use(bodyParser.json()) router.post("/fetch", async (req, res) => { - const resultsPerPage = 30 - let page = req.body.page ?? 0 - if (page != 0){ - page-=1 - } - let {filter, sort} = req.body - //console.log(req.body) - try{ - if (filter === "Best Selling"){ - if (sort != "All"){ - response = await User.find({Type: sort,Hidden: {$exists:false}}).limit(resultsPerPage).skip(0+parseFloat(page)*resultsPerPage).sort({Sales: "descending"}).lean().select(['-_id']) - responsecount = await User.countDocuments({Type: sort, Hidden: {$exists:false}}) - } - if (sort === "All"){ - response = await User.find({Hidden: {$exists:false}, Type: { $ne: "User Ad" } }).limit(resultsPerPage).skip(0+parseFloat(page)*resultsPerPage).sort({Sales: "descending"}).lean().select(['-_id']) - responsecount = await User.countDocuments({Hidden: {$exists:false}, Type: { $ne: "User Ad" }}) - } - }else{ - if (sort != "All"){ - response = await User.find({Type: sort, Hidden: {$exists:false}}).limit(resultsPerPage).skip(0+parseFloat(page)*resultsPerPage).lean().select(['-_id']) - responsecount = await User.countDocuments({Type: sort, Hidden: {$exists:false}}) - } - if (sort === "All"){ - response = await User.find({Hidden: {$exists:false}, Type: { $ne: "User Ad" }}).limit(resultsPerPage).skip(0+parseFloat(page)*resultsPerPage).lean().select(['-_id']) - responsecount = await User.countDocuments({Hidden: {$exists:false}, Type: { $ne: "User Ad" }}) - } - } - - //console.log(response.length) - res.json({data: response, pages: Math.ceil(Math.max(responsecount/resultsPerPage, 1))}) - } catch (error) { - res.json({status: "error", error:"idk"}) - } + const resultsPerPage = 30 + let page = req.body.page ?? 0 + if (page != 0) { + page -= 1 + } + let { filter, sort } = req.body + //console.log(req.body) + try { + if (filter === "Best Selling") { + if (sort != "All") { + response = await User.find({ + Type: sort, + Hidden: { $exists: false }, + }) + .limit(resultsPerPage) + .skip(0 + parseFloat(page) * resultsPerPage) + .sort({ Sales: "descending" }) + .lean() + .select(["-_id"]) + responsecount = await User.countDocuments({ + Type: sort, + Hidden: { $exists: false }, + }) + } + if (sort === "All") { + response = await User.find({ + Hidden: { $exists: false }, + Type: { $ne: "User Ad" }, + }) + .limit(resultsPerPage) + .skip(0 + parseFloat(page) * resultsPerPage) + .sort({ Sales: "descending" }) + .lean() + .select(["-_id"]) + responsecount = await User.countDocuments({ + Hidden: { $exists: false }, + Type: { $ne: "User Ad" }, + }) + } + } else { + if (sort != "All") { + response = await User.find({ + Type: sort, + Hidden: { $exists: false }, + }) + .limit(resultsPerPage) + .skip(0 + parseFloat(page) * resultsPerPage) + .lean() + .select(["-_id"]) + responsecount = await User.countDocuments({ + Type: sort, + Hidden: { $exists: false }, + }) + } + if (sort === "All") { + response = await User.find({ + Hidden: { $exists: false }, + Type: { $ne: "User Ad" }, + }) + .limit(resultsPerPage) + .skip(0 + parseFloat(page) * resultsPerPage) + .lean() + .select(["-_id"]) + responsecount = await User.countDocuments({ + Hidden: { $exists: false }, + Type: { $ne: "User Ad" }, + }) + } + } + //console.log(response.length) + res.json({ + data: response, + pages: Math.ceil(Math.max(responsecount / resultsPerPage, 1)), + }) + } catch (error) { + res.json({ status: "error", error: "idk" }) + } }) +router.get("/iteminfo/:id", async (req, res) => { + var id = req.params.id -router.get('/iteminfo/:id', async (req, res) => { - var id = req.params.id; + if (isNaN(parseFloat(id)) === true) { + return res.json({ status: "error", error: "Must be number" }) + } + const response = await User.findOne({ ItemId: id }).lean() - if (isNaN(parseFloat(id)) === true){ - return res.json({status: "error", error: "Must be number"}) - } - const response = await User.findOne({ItemId: id}).lean() - - if (!response){ - return res.json({status: "error", error: "Not found"}) - } - return res.json({error: false, iteminfo: response}) - -}); + if (!response) { + return res.json({ status: "error", error: "Not found" }) + } + return res.json({ error: false, iteminfo: response }) +}) router.post("/search", async (req, res) => { - const resultsPerPage = 30 - let page = req.body.page ?? 0 - if (page != 0){ - page-=1 - } - let {filter, sort, searchquery} = req.body - function escapeRegex(text) { - return text?.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); - } - const regex = new RegExp(escapeRegex(searchquery), 'gi'); - //console.log(req.body) - try{ - if (filter === "Best Selling"){ - if (sort != "All"){ - response = await User.find({Name: regex,Type: sort,Hidden: {$exists:false}}).limit(resultsPerPage).skip(0+parseFloat(page)*resultsPerPage).sort({Sales: "descending"}).lean().select(['-_id']) - responsecount = await User.countDocuments({Type: sort, Hidden: {$exists:false}}) - } - if (sort === "All"){ - response = await User.find({Name: regex,Hidden: {$exists:false}}).limit(resultsPerPage).skip(0+parseFloat(page)*resultsPerPage).sort({Sales: "descending"}).lean().select(['-_id']) - responsecount = await User.countDocuments({Hidden: {$exists:false}}) - } - }else{ - if (sort != "All"){ - response = await User.find({Name: regex,Type: sort, Hidden: {$exists:false}}).limit(resultsPerPage).skip(0+parseFloat(page)*resultsPerPage).lean().select(['-_id']) - responsecount = await User.countDocuments({Type: sort, Hidden: {$exists:false}}) - } - if (sort === "All"){ - response = await User.find({Name: regex,Hidden: {$exists:false}}).limit(resultsPerPage).skip(0+parseFloat(page)*resultsPerPage).lean().select(['-_id']) - responsecount = await User.countDocuments({Hidden: {$exists:false}}) - } - } - - //console.log(response.length) - res.json({data: response, pages: Math.ceil(Math.max(responsecount/resultsPerPage, 1))}) - } catch (error) { - res.json({status: "error", error:"idk"}) - } + const resultsPerPage = 30 + let page = req.body.page ?? 0 + if (page != 0) { + page -= 1 + } + let { filter, sort, searchquery } = req.body + function escapeRegex(text) { + return text?.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&") + } + const regex = new RegExp(escapeRegex(searchquery), "gi") + //console.log(req.body) + try { + if (filter === "Best Selling") { + if (sort != "All") { + response = await User.find({ + Name: regex, + Type: sort, + Hidden: { $exists: false }, + }) + .limit(resultsPerPage) + .skip(0 + parseFloat(page) * resultsPerPage) + .sort({ Sales: "descending" }) + .lean() + .select(["-_id"]) + responsecount = await User.countDocuments({ + Type: sort, + Hidden: { $exists: false }, + }) + } + if (sort === "All") { + response = await User.find({ + Name: regex, + Hidden: { $exists: false }, + }) + .limit(resultsPerPage) + .skip(0 + parseFloat(page) * resultsPerPage) + .sort({ Sales: "descending" }) + .lean() + .select(["-_id"]) + responsecount = await User.countDocuments({ + Hidden: { $exists: false }, + }) + } + } else { + if (sort != "All") { + response = await User.find({ + Name: regex, + Type: sort, + Hidden: { $exists: false }, + }) + .limit(resultsPerPage) + .skip(0 + parseFloat(page) * resultsPerPage) + .lean() + .select(["-_id"]) + responsecount = await User.countDocuments({ + Type: sort, + Hidden: { $exists: false }, + }) + } + if (sort === "All") { + response = await User.find({ + Name: regex, + Hidden: { $exists: false }, + }) + .limit(resultsPerPage) + .skip(0 + parseFloat(page) * resultsPerPage) + .lean() + .select(["-_id"]) + responsecount = await User.countDocuments({ + Hidden: { $exists: false }, + }) + } + } + + //console.log(response.length) + res.json({ + data: response, + pages: Math.ceil(Math.max(responsecount / resultsPerPage, 1)), + }) + } catch (error) { + res.json({ status: "error", error: "idk" }) + } }) -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/clientsettings.js b/Back/routes/clientsettings.js index 6cf8e0e..9db53ce 100644 --- a/Back/routes/clientsettings.js +++ b/Back/routes/clientsettings.js @@ -5,12 +5,4827 @@ const router = express.Router() res.json() })*/ -router.get(["/Setting/QuietGet/ClientAppSettings","//Setting/QuietGet/ClientSharedSettings","/Setting/QuietGet/ClientSharedSettings","/Setting/QuietGet/RCCService","/Setting/QuietGet/AndroidAppSettings","/Setting/QuietGet/iOSAppSettings","/Setting/QuietGet/StudioAppSettings"], (req, res) => { - return res.json({ "FFlagNewPlayerListScript": "True", "FFlagCoreScriptShowVisibleAgeV2": "False", "DFFlagFindFirstChildOfClassEnabled": "True", "FFlagStudioCSGAssets": "True", "FFlagCSGLoadBlocking": "False", "FFlagCSGPhysicsLevelOfDetailEnabled": "True", "FFlagFormFactorDeprecated": "False", "FFlagFontSmoothScalling": "True", "FFlagAlternateFontKerning": "True", "FFlagFontSourceSans": "True", "FFlagRenderNewFonts": "True", "FFlagDMFeatherweightEnabled": "True", "FFlagRenderFeatherweightEnabled": "True", "FFlagRenderFeatherweightUseGeometryGenerator": "True", "FFlagScaleExplosionLifetime": "True", "FFlagEnableNonleathalExplosions": "True", "DFFlagHttpCurlHandle301": "True", "FFlagSearchToolboxByDataModelSearchString": "True", "FFlagClientABTestingEnabled": "False", "FFlagStudioSmoothTerrainForNewPlaces": "True", "FFlagUsePGSSolver": "True", "FFlagSimplifyKeyboardInputPath": "False", "FFlagNewInGameDevConsole": "True", "FFlagTextFieldUTF8": "True", "FFlagTypesettersReleaseResources": "True", "FFlagLuaBasedBubbleChat": "True", "FFlagUseCanManageApiToDetermineConsoleAccess": "False", "FFlagConsoleCodeExecutionEnabled": "True", "DFFlagCustomEmitterInstanceEnabled": "True", "FFlagCustomEmitterRenderEnabled": "True", "FFlagCustomEmitterLuaTypesEnabled": "True", "FFlagStudioInSyncWebKitAuthentication": "False", "FFlagGlowEnabled": "True", "FFlagUseNewAppBridgeInputWindows": "False", "DFFlagUseNewFullscreenLogic": "True", "FFlagRenderMaterialsOnMobile": "True", "FFlagMaterialPropertiesEnabled": "True", "FFlagSurfaceLightEnabled": "True", "FFlagStudioPropertyErrorOutput": "True", "DFFlagUseR15Character": "True", "DFFlagEnableHipHeight": "True", "DFFlagUseStarterPlayerCharacter": "True", "DFFlagFilteringEnabledDialogFix": "True", "FFlagCSGMeshColorToolsEnabled": "True", "FFlagStudioEnableGameAnimationsTab": "True", "DFFlagScriptExecutionContextApi": "True", "FFlagStudioVariableIntellesense": "True", "FFlagLuaDebugger": "True", "FFlagUseUserListMenu": "True", "FFlagEnableSetCoreTopbarEnabled": "True", "FFlagPlayerDropDownEnabled": "True", "FFlagSetCoreMoveChat": "True", "FFlagSetCoreDisableChatBar": "True", "FFlagGraphicsGL3": "True", "DFFlagUserUseLuaVehicleController": "True", "FFlagTextBoxUnicodeAware": "True", "FFlagLetLegacyScriptsWork": "True", "FFlagDep": "True", "DFFlagDisableBackendInsertConnection": "True", "FFlagPhysicsAnalyzerEnabled": "True", "DFFlagGetGroupsAsyncEnabled": "True", "DFFlagGetFocusedTextBoxEnabled": "True", "DFFlagTextBoxIsFocusedEnabled": "True", "DFFlagGetCharacterAppearanceEnabled": "True", "FFlagNewLayoutAndConstraintsEnabled": "True", "GoogleAnalyticsAccountPropertyID": "UA-43420590-3", "GoogleAnalyticsAccountPropertyIDPlayer": "UA-43420590-14", "AllowVideoPreRoll": "True", "FLogAsserts": "0", "FLogCloseDataModel": "3", "CaptureQTStudioCountersEnabled": "True", "CaptureMFCStudioCountersEnabled": "True", "CaptureCountersIntervalInMinutes": "5", "FLogServiceVectorResize": "4", "FLogServiceCreation": "4", "AxisAdornmentGrabSize": "12", "FFlagProcessAllPacketsPerStep": "True", "FFlagUS14116": "True", "FFlagBlockBlockNarrowPhaseRefactor": "True", "FFlagEnableRubberBandSelection": "True", "FFlagQtStudioScreenshotEnabled": "True", "FFlagFixNoPhysicsGlitchWithGyro": "True", "FLogFullRenderObjects": "0", "PublishedProjectsPageHeight": "535", "PublishedProjectsPageUrl": "/ide/publish", "StartPageUrl": "/ide/welcome", "FFlagOpenNewWindowsInDefaultBrowser": "True", "FFlagOnScreenProfiler": "True", "FFlagInitializeNewPlace": "True", "PrizeAssetIDs": "", "PrizeAwarderURL": "/ostara/boon", "MinNumberScriptExecutionsToGetPrize": "500", "FFlagDebugCrashEnabled": "False", "FLogHangDetection": "3", "FFlagCharAnimationStats": "False", "FFlagRenderOpenGLForcePOTTextures": "True", "FFlagUseNewCameraZoomPath": "True", "FFlagQTStudioPublishFailure": "True", "ExcludeContactWithInteriorTerrainMinusYFace": "True", "FFlagFixUphillClimb": "True", "FFlagUseAveragedFloorHeight": "True", "PublishedProjectsPageWidth": "950", "FFlagRenderFastClusterEverywhere": "True", "FLogPlayerShutdownLuaTimeoutSeconds": "1", "FFlagQtFixToolDragging": "True", "FFlagSelectPartOnUndoRedo": "True", "FFlagStatusBarProgress": "True", "FFlagStudioCheckForUpgrade": "True", "FFlagStudioInsertModelCounterEnabled": "True", "FFlagStudioAuthenticationFailureCounterEnabled": "True", "FFlagRenderCheckTextureContentProvider": "True", "FFlagRenderLightGridEnabled": "True", "FFlagStudioLightGridAPIVisible": "True", "FFlagBetterSleepingJobErrorComputation": "True", "FLogDXVideoMemory": "4", "FFlagRenderNoLegacy": "True", "FFlagStudioLightGridOnForNewPlaces": "True", "FFlagPhysicsSkipRedundantJoinAll": "True", "FFlagTerrainOptimizedLoad": "True", "FFlagTerrainOptimizedStorage": "True", "FFlagTerrainOptimizedCHS": "True", "FFlagRenderGLES2": "True", "FFlagStudioMacAddressValidationEnabled": "True", "FFlagDoNotPassSunkEventsToPlayerMouse": "True", "FFlagQtAutoSave": "True", "FFlagRenderLoopExplicit": "True", "FFlagStudioUseBinaryFormatForPlay": "True", "FFlagPhysicsRemoveWorldAssemble_US16512": "True", "FFlagNativeSafeChatRendering": "True", "FFlagRenderNewMegaCluster": "True", "FFlagAutoJumpForTouchDevices": "True", "FLogOutlineBrightnessMin": "50", "FLogOutlineBrightnessMax": "160", "FLogOutlineThickness": "40", "FFlagDE5511FixEnabled": "True", "FFlagDE4423Fixed": "True", "FFlagSymmetricContact": "True", "FFlagLocalMD5": "True", "FFlagStudioCookieParsingDisabled": "False", "FFlagLastWakeTimeSleepingJobError": "True", "FFlagPhysicsAllowAutoJointsWithSmallParts_DE6056": "True", "FFlagPhysicsLockGroupDraggerHitPointOntoSurface_DE6174": "True", "FFlagOutlineControlEnabled": "True", "FFlagAllowCommentedScriptSigs": "True", "FFlagDataModelUseBinaryFormatForSave": "True", "FFlagStudioUseBinaryFormatForSave": "True", "FFlagDebugAdornableCrash": "True", "FFlagOverlayDataModelEnabled": "True", "DFFlagFixInstanceParentDesyncBug": "True", "FFlagPromoteAssemblyModifications": "False", "DFFlagCreateHumanoidRootNode": "True", "FFlagStudioCookieDesegregation": "True", "FFlagResponsiveJump": "True", "FFlagGoogleAnalyticsTrackingEnabled": "True", "FFlagNoCollideLadderFilter": "True", "FFlagFlexibleTipping": "True", "FFlagUseStrongerBalancer": "True", "FFlagClampControllerVelocityMag": "True", "DFFlagUseSaferChatMetadataLoading": "True", "FFlagSinkActiveGuiObjectMouseEvents": "False", "FLogLuaBridge": "2", "DFFlagPromoteAssemblyModifications": "True", "FFlagDeferredContacts": "True", "FFlagFRMUse60FPSLockstepTable": "True", "FFlagFRMAdjustForMultiCore": "True", "FFlagPhysics60HZ": "True", "FFlagQtRightClickContextMenu": "True", "FFlagUseTopmostSettingToBringWindowToFront": "True", "FFlagNewLightAPI": "True", "FFlagRenderLightGridShadows": "True", "FFlagRenderLightGridShadowsSmooth": "True", "DFFlagSanitizeKeyframeUrl": "True", "DFFlagDisableGetKeyframeSequence": "False", "FFlagCreateServerScriptServiceInStudio": "True", "FFlagCreateServerStorageInStudio": "True", "FFlagCreateReplicatedStorageInStudio": "True", "FFlagFilterEmoteChat": "True", "DFFlagUseCharacterRootforCameraTarget": "True", "FFlagImageRectEnabled": "True", "FFlagNewWaterMaterialEnable": "True", "DFFlagUserHttpAPIEnabled": "True", "DFIntUserHttpAccessUserId0": "0", "FFlagUserHttpAPIVisible": "True", "FFlagCameraChangeHistory": "True", "FFlagDE4640Fixed": "True", "FFlagShowStreamingEnabledProp": "True", "FFlagOptimizedDragger": "True", "FFlagRenderNewMaterials": "True", "FFlagRenderAnisotropy": "True", "FFlagStudioInitializeViewOnPaint": "True", "DFFlagPartsStreamingEnabled": "True", "FFlagStudioLuaDebugger": "True", "FFlagStudioLocalSpaceDragger": "True", "FFlagGuiRotationEnabled": "True", "FFlagDataStoreEnabled": "True", "DFFlagDisableTeleportConfirmation": "True", "DFFlagAllowTeleportFromServer": "True", "DFFlagNonBlockingTeleport": "True", "FFlagD3D9CrashOnError": "False", "FFlagRibbonBarEnabled": "True", "SFFlagInfiniteTerrain": "True", "FFlagStudioScriptBlockAutocomplete": "True", "FFlagRenderFixAnchoredLag": "True", "DFFlagAllowAllUsersToUseHttpService": "True", "GoogleAnalyticsAccountPropertyIDClient": "", "FFlagSurfaceGuiVisible": "True", "FFlagStudioIntellesenseEnabled": "True", "FFlagAsyncPostMachineInfo": "True", "FFlagModuleScriptsVisible": "True", "FFlagModelPluginsEnabled": "True", "FFlagGetUserIdFromPluginEnabled": "True", "FFlagStudioPluginUIActionEnabled": "True", "DFFlagRemoveAdornFromBucketInDtor": "True", "FFlagRapidJSONEnabled": "True", "DFFlagDE6959Fixed": "True", "DFFlagScopedMutexOnJSONParser": "True", "FFlagSupressNavOnTextBoxFocus": "True", "DFFlagExplicitPostContentType": "True", "DFFlagAddPlaceIdToAnimationRequests": "True", "FFlagCreatePlaceEnabled": "True", "DFFlagClientAdditionalPOSTHeaders": "True", "FFlagEnableAnimationExport": "True", "DFFlagAnimationAllowProdUrls": "True", "FFlagGetUserIDFromPluginEnabled": "True", "FFlagStudioContextualHelpEnabled": "True", "FFlagLogServiceEnabled": "True", "FFlagQtPlaySoloOptimization": "True", "FFlagStudioBuildGui": "True", "DFFlagListenForZVectorChanges": "True", "DFFlagUserInputServiceProcessOnRender": "True", "FFlagDE7421Fixed": "True", "FFlagStudioExplorerActionsEnabledInScriptView": "True", "FFlagHumanoidNetworkOptEnabled": "False", "DFFlagEnableNPCServerAnimation": "True", "DFFlagDataStoreUseUForGlobalDataStore": "True", "DFFlagDataStoreAllowedForEveryone": "True", "DFFlagBadTypeOnConnectErrorEnabled": "True", "FFlagStudioRemoveUpdateUIThread": "True", "FFlagPhysicsSkipUnnecessaryContactCreation": "False", "FFlagUseNewHumanoidCache": "True", "FFlagSecureReceiptsBackendEnabled": "True", "FFlagOrderedDataStoreEnabled": "True", "FFlagStudioLuaDebuggerGA": "True", "FFlagNPSSetScriptDocsReadOnly": "True", "FFlagRDBGHashStringComparison": "True", "FFlagStudioDebuggerVisitDescendants": "True", "FFlagDeprecateScriptInfoService": "True", "FFlagIntellisenseScriptContextDatamodelSearchingEnabled": "True", "FFlagSecureReceiptsFrontendEnabled": "True", "DFFlagCreatePlaceEnabledForEveryone": "True", "FFlagCreatePlaceInPlayerInventoryEnabled": "True", "DFFlagAddRequestIdToDeveloperProductPurchases": "True", "DFFlagUseYPCallInsteadOfPCallEnabled": "True", "FFlagStudioMouseOffsetFixEnabled": "True", "DFFlagPlaceValidation": "True", "FFlagReconstructAssetUrl": "True", "FFlagUseNewSoundEngine": "True", "FIntMinMillisecondLengthForLongSoundChannel": "5000", "FFlagStudioHideInsertedServices": "True", "FFlagStudioAlwaysSetActionEnabledState": "True", "FFlagRenderNew": "True", "FIntRenderNewPercentWin": "100", "FIntRenderNewPercentMac": "100", "FLogGraphics": "6", "DFFlagDisallowHopperServerScriptReplication": "True", "FFlagInterpolationFix": "False", "FFlagHeartbeatAt60Hz": "False", "DFFlagFixProcessReceiptValueTypes": "True", "DFFlagPhysicsSkipUnnecessaryContactCreation": "True", "FFlagStudioLiveCoding": "True", "FFlagPlayerHumanoidStep60Hz": "True", "DFFlagCrispFilteringEnabled": "False", "SFFlagProtocolSynchronization": "True", "FFlagUserInputServicePipelineStudio": "True", "FFlagUserInputServicePipelineWindowsClient": "True", "FFlagUserInputServicePipelineMacClient": "True", "FFlagStudioKeyboardMouseConfig": "True", "DFFlagLogServiceEnabled": "True", "DFFlagLoadAnimationsThroughInsertService": "True", "FFlagFRMFogEnabled": "True", "FLogBrowserActivity": "3", "DFFlagPhysicsPacketAlwaysUseCurrentTime": "True", "FFlagFixedStudioRotateTool": "True", "FFlagRibbonBarEnabledGA": "True", "FFlagRenderSafeChat": "False", "DFFlagPhysicsAllowSimRadiusToDecreaseToOne": "True", "DFFlagPhysicsAggressiveSimRadiusReduction": "True", "DFFlagLuaYieldErrorNoResumeEnabled": "True", "DFFlagEnableJointCache": "False", "DFFlagOnCloseTimeoutEnabled": "True", "FFlagStudioQuickInsertEnabled": "True", "FFlagStudioPropertiesRespectCollisionToggle": "True", "FFlagTweenServiceUsesRenderStep": "True", "FFlagUseNewSoundEngine3dFix": "True", "FFlagDebugUseDefaultGlobalSettings": "True", "FFlagStudioMiddleMouseTrackCamera": "False", "FFlagTurnOffiOSNativeControls": "True", "DFFlagUseNewHumanoidHealthGui": "True", "DFFlagLoggingConsoleEnabled": "True", "DFFlagAllowModuleLoadingFromAssetId": "True", "FFlagStudioZoomExtentsExplorerFixEnabled": "True", "FFlagLuaDebuggerBreakOnError": "True", "FFlagRetentionTrackingEnabled": "True", "FFlagShowAlmostAllItemsInExplorer": "True", "FFlagStudioFindInAllScriptsEnabled": "True", "FFlagImprovedNameOcclusion": "True", "FFlagHumanoidMoveToDefaultValueEnabled": "True", "FFlagEnableDisplayDistances": "True", "FFlagUseMinMaxZoomDistance": "True", "SFFlagAllowPhysicsPacketCompression": "False", "FFlagStudioOneClickColorPickerEnabled": "True", "DFFlagHumanoidMoveToDefaultValueEnabled": "True", "VideoPreRollWaitTimeSeconds": "45", "FFlagBalancingRateLimit": "True", "FFlagLadderCheckRate": "True", "FFlagStateSpecificAutoJump": "True", "SFFlagOneWaySimRadiusReplication": "True", "DFFlagApiDictionaryCompression": "True", "SFFlagPathBasedPartMovement": "True", "FFlagEnsureInputIsCorrectState": "False", "DFFlagLuaLoadStringStrictSecurity": "True", "DFFlagCrossPacketCompression": "True", "FFlagWorkspaceLoadStringEnabledHidden": "True", "FFlagStudioPasteAsSiblingEnabled": "True", "FFlagStudioDuplicateActionEnabled": "True", "FFlagPreventInterpolationOnCFrameChange": "True", "FLogNetworkPacketsReceive": "5", "FFlagPlayPauseFix": "True", "DFFlagCrashOnNetworkPacketError": "False", "FFlagHumanoidStateInterfaces": "True", "FFlagRenderDownloadAssets": "True", "FFlagBreakOnErrorConfirmationDialog": "True", "FFlagStudioAnalyticsEnabled": "True", "FFlagAutoRotateFlag": "True", "DFFlagUseImprovedLadderClimb": "True", "FFlagUseCameraOffset": "True", "FFlagRenderBlobShadows": "True", "DFFlagWebParserDisableInstances": "False", "FFlagStudioNewWiki": "True", "DFFlagLogPacketErrorDetails": "False", "FFlagLimitHorizontalDragForce": "True", "DFFlagCreateSeatWeldOnServer": "True", "FFlagGraphicsUseRetina": "True", "FFlagDynamicEnvmapEnabled": "True", "DFFlagDeferredTouchReplication": "True", "DFFlagCreatePlayerGuiEarlier": "True", "DFFlagProjectileOwnershipOptimization": "True", "DFFlagLoadSourceForCoreScriptsBeforeInserting": "False", "GoogleAnalyticsLoadStudio": "1", "DFFlagTaskSchedulerFindJobOpt": "True", "SFFlagPreventInterpolationOnCFrameChange": "True", "DFIntNumPhysicsPacketsPerStep": "2", "DFFlagDataStoreUrlEncodingEnabled": "True", "FFlagShowWebPlaceNameOnTabWhenOpeningFromWeb": "True", "DFFlagTrackTimesScriptLoadedFromLinkedSource": "True", "FFlagToggleDevConsoleThroughChatCommandEnabled": "True", "FFlagEnableFullMonitorsResolution": "True", "DFFlagAlwaysUseHumanoidMass": "True", "DFFlagUseStrongerGroundControl": "True", "DFFlagCorrectlyReportSpeedOnRunStart": "True", "FFlagLuaDebuggerImprovedToolTip": "True", "FFlagLuaDebuggerPopulateFuncName": "True", "FFlagLuaDebuggerNewCodeFlow": "True", "DFFlagValidateCharacterAppearanceUrl": "false", "FFlagStudioQuickAccessCustomization": "True", "DFFlagTaskSchedulerUpdateJobPriorityOnWake": "True", "DFFlagTaskSchedulerNotUpdateErrorOnPreStep": "True", "FFlagWikiSelectionSearch": "True", "DFIntTaskSchedularBatchErrorCalcFPS": "1200", "FFlagSuppressNavOnTextBoxFocus": "False", "FFlagEnabledMouseIconStack": "True", "DFFlagFastClone": "True", "DFFlagLuaNoTailCalls": "True", "DFFlagFilterStreamingProps": "True", "DFFlagNetworkOwnerOptEnabled": "True", "DFFlagPathfindingEnabled": "True", "FFlagEnableiOSSettingsLeave": "True", "FFlagUseFollowCamera": "True", "FFlagDefaultToFollowCameraOnTouch": "True", "DFFlagAllowMoveToInMouseLookMove": "True", "DFFlagAllowHumanoidDecalTransparency": "True", "DFFlagSupportCsrfHeaders": "True", "DFFlagConfigureInsertServiceFromSettings": "True", "FFlagPathfindingClientComputeEnabled": "True", "DFFlagLuaResumeSupportsCeeCalls": "True", "DFFlagPhysicsSenderErrorCalcOpt": "True", "DFFlagClearPlayerReceivingServerLogsOnLeave": "True", "DFFlagConsoleCodeExecutionEnabled": "True", "DFFlagCSGDictionaryReplication": "True", "FFlagCSGToolsEnabled": "True", "FFlagCSGDictionaryServiceEnabled": "True", "FFlagCSGMeshRenderEnable": "True", "FFlagCSGChangeHistory": "True", "FFlagCSGMeshColorEnable": "True", "FFlagCSGScaleEnabled": "True", "FFlagCylinderUsesConstantTessellation": "True", "FFlagStudioDraggersScaleFixes": "True", "FFlagCSGDecalsEnabled": "True", "FFlagCSGMigrateChildData": "True", "SFFlagBinaryStringReplicationFix": "True", "FFlagHummanoidScaleEnable": "True", "FFlagStudioDataModelIsStudioFix": "True", "DFFlagWebParserEnforceASCIIEnabled": "True", "DFFlagScriptDefaultSourceIsEmpty": "True", "FFlagFixCaptureFocusInput": "True", "FFlagFireUserInputServiceEventsAfterDMEvents": "True", "FFlagVectorErrorOnNilArithmetic": "True", "DFFlagUseImageColor": "True", "FFlagStopNoPhysicsStrafe": "True", "DFFlagDebugLogNetworkErrorToDB": "False", "FFlagLowQMaterialsEnable": "True", "FFLagEnableFullMonitorsResolution": "True", "FFlagStudioChildProcessCleanEnabled": "True", "DFFlagAllowFullModelsWhenLoadingModules": "True", "DFFlagRealWinInetHttpCacheBypassingEnabled": "True", "FFlagNewUniverseInfoEndpointEnabled": "True", "FFlagGameExplorerEnabled": "True", "FFlagStudioUseBinaryFormatForModelPublish": "True", "FFlagGraphicsFeatureLvlStatsEnable": "True", "FFlagStudioEnableWebKitPlugins": "True", "DFFlagSendHumanoidTouchedSignal": "True", "DFFlagReduceHumanoidBounce": "True", "DFFlagUseNewSounds": "True", "FFlagFixHumanoidRootPartCollision": "True", "FFlagEnableAndroidMenuLeave": "True", "FFlagOnlyProcessGestureEventsWhenSunk": "True", "FFlagAdServiceReportImpressions": "True", "FFlagStudioUseExtendedHTTPTimeout": "True", "FFlagStudioSeparateActionByActivationMethod": "False", "DFFlagPhysicsSenderThrottleBasedOnBufferHealth": "True", "DFFlagGetGroupInfoEnabled": "True", "DFFlagGetGroupRelationsEnabled": "True", "SFFlagTopRepContSync": "True", "FFlagStudioUseBinaryFormatForModelSave": "True", "EnableFullMonitorsResolution": "True", "DFFlagRenderSteppedServerExceptionEnabled": "True", "FFlagUseWindowSizeFromGameSettings": "True", "DFFlagCheckStudioApiAccess": "True", "FFlagGameExplorerPublishEnabled": "True", "DFFlagKeepXmlIdsBetweenLoads": "True", "DFFlagReadXmlCDataEnabled": "True", "FFlagStudioRemoveToolSounds": "True", "FFlagStudioOneStudGridDefault": "True", "FFlagStudioPartSymmetricByDefault": "True", "FFlagStudioIncreasedBaseplateSize": "True", "FFlagSkipSilentAudioOps": "True", "SFFlagGuid64Bit": "False", "FIntValidateLauncherPercent": "0", "FFlagCSGDataLossFixEnabled": "True", "DFStringRobloxAnalyticsURL": "https://www.mete0r.xyz/", "DFFlagRobloxAnalyticsTrackingEnabled": "False", "FFlagStudioOpenLastSaved": "False", "FFlagStudioShowTutorialsByDefault": "True", "FFlagStudioForceToolboxSize": "True", "FFlagStudioExplorerDisabledByDefault": "True", "FFlagStudioDefaultWidgetSizeChangesEnabled": "True", "FFlagStudioUseScriptAnalyzer": "True", "FFlagNoClimbPeople": "True", "DFFlagAnimationFormatAssetId": "True", "FFlagGetCorrectScreenResolutionFaster": "True", "DFFlagFixTouchEndedReporting": "False", "FFlagStudioTeleportPlaySolo": "True", "FFlagStudioDE7928FixEnabled": "True", "FFlagDE8768FixEnabled": "True", "FFlagStudioDE9108FixEnabled": "True", "FFlagStudioPlaySoloMapDebuggerData": "True", "FFlagLuaDebuggerCloneDebugger": "True", "FFlagRenderLightgridInPerformEnable": "True", "SFFlagStateBasedAnimationReplication": "True", "FFlagVolumeControlInGameEnabled": "True", "FFlagGameConfigurerUseStatsService": "True", "FFlagStudioUseHttpAuthentication": "True", "FFlagDetectTemplatesWhenSettingUpGameExplorerEnabled": "True", "FFlagEntityNameEditingEnabled": "True", "FFlagNewCreatePlaceFlowEnabled": "True", "FFlagFakePlayableDevices": "False", "FFlagMutePreRollSoundService": "True", "DFFlagBodyMoverParentingFix": "True", "DFFlagBroadcastServerOnAllInterfaces": "True", "HttpUseCurlPercentageWinClient": "100", "HttpUseCurlPercentageMacClient": "100", "HttpUseCurlPercentageWinStudio": "100", "HttpUseCurlPercentageMacStudio": "100", "SFFlagReplicatedFirstEnabled": "True", "DFFlagCSGShrinkForMargin": "True", "FFlagPhysicsBulletConnectorPointRecalc": "True", "DFIntBulletContactBreakThresholdPercent": "200", "DFIntBulletContactBreakOrthogonalThresholdPercent": "200", "FFlagPhysicsBulletConnectorMatching": "True", "FFlagPhysicsBulletUseProximityMatching": "False", "FFlagPhysicsCSGUsesBullet": "True", "DFFlagCSGPhysicsDeserializeRefactor": "True", "FFlagWedgeEnableDecalOnTop": "True", "FFlagFrustumTestGUI": "True", "FFlagFeatureLvlsDX11BeforeDeviceCreate": "True", "FFlagStudioPasteSyncEnabled": "True", "FFlagResetMouseCursorOnToolUnequip": "True", "DFFlagUpdateCameraTarget": "True", "DFFlagFixGhostClimb": "True", "DFFlagUseStarterPlayer": "True", "FFlagStudioFindCrashFixEnabled": "True", "FFlagFixPartOffset": "True", "DFFlagLuaCloseUpvalues": "True", "FFlagRenderTextureCompositorUseBudgetForSize": "True", "FFlagAllowOutOfBoxAssets": "False", "FFlagRemoveTintingWhenActiveIsFalseOnImageButton": "True", "FFlagStudioModuleScriptDefaultContents": "True", "FFlagStudioHomeKeyChangeEnabled": "True", "FFlagStudioOpenStartPageForLogin": "True", "FFlagStudioNativeKeepSavedChanges": "True", "FFlagSerializeCurrentlyOpenPlaceWhenPublishingGame": "True", "FFlagGameNameLabelEnabled": "True", "FFlagStudioValidateBootstrapper": "True", "FFlagRakNetReadFast": "True", "DFFlagPhysicsSenderSleepingUpdate": "True", "FFlagUseShortShingles": "True", "FFlagKKTChecks": "False", "DFFlagUseApiProxyThrottling": "True", "DFFlagValidateSetCharacter": "True", "DFFlagUpdateHumanoidSimBodyInComputeForce": "True", "DFFlagNetworkPendingItemsPreserveTimestamp": "True", "FFlagStudioCSGRotationalFix": "True", "FFlagNewLoadingScreen": "True", "FFlagScrollingFrameOverridesButtonsOnTouch": "True", "DFFlagStreamLargeAudioFiles": "True", "DFFlagNewLuaChatScript": "True", "DFFlagLoopedDefaultHumanoidAnimation": "True", "FFlagSoundsRespectDelayedStop": "False", "DFFlagCSGPhysicsErrorCatchingEnabled": "True", "DFFlagFireStoppedAnimSignal": "True", "FFlagStudioFixToolboxReload": "True", "FFlagCSGDecalsV2": "True", "FFlagLocalOptimizer": "True", "DFFlagClearFailedUrlsWhenClearingCacheEnabled": "True", "DFFlagSupportNamedAssetsShortcutUrl": "True", "DFFlagUseW3CURIParser": "True", "DFFlagContentProviderHttpCaching": "True", "FFlagNoWallClimb": "False", "FFlagSmoothMouseLock": "False", "DFFlagCSGPhysicsNanPrevention": "True", "FFlagStudioDE9818FixEnabled": "True", "FFlagGameExplorerImagesEnabled": "True", "FFlagStudioInsertOrientationFix": "True", "FFlagStudioTabOrderingEnabled": "True", "FFlagFramerateDeviationDroppedReport": "True", "FFlagModuleScriptsPerVmEnabled": "False", "FFlagGameExplorerImagesInsertEnabled": "True", "FFlagTexturePropertyWidgetEnabled": "True", "FFlagReloadAllImagesOnDataReload": "True", "FFlagModuleScriptsPerVmEnabledFix2": "True", "DFFlagFixBufferZoneContainsCheck": "False", "FFlagStudioPlaceAssetFromToolbox": "True", "FFlagChannelMasterMuting": "True", "FFlagStudioUseDelayedSyntaxCheck": "True", "FFlagStudioCommandLineSaveEditText": "True", "FFlagStudioAddHelpInContextMenu": "True", "DFIntHttpCacheCleanMinFilesRequired": "10000", "DFIntHttpCacheCleanMaxFilesToKeep": "7500", "FFlagCSGVoxelizer": "True", "DFFlagCheckApiAccessInTransactionProcessing": "True", "FFlagBindPurchaseValidateCallbackInMarketplaceService": "True", "FFlagSetDataModelUniverseIdAfterPublishing": "True", "FFlagOpenScriptWorksOnModulesEnabled": "True", "FFlagStudioRibbonBarNewLayout": "True", "FFlagStudioRibbonBarLayoutFixes": "True", "FFlagStudioPlaceOnlineIndicator": "True", "FFlagRenderWangTiles": "True", "FFlagDisableBadUrl": "True", "FFlagPrimalSolverLogBarrierIP": "True", "FFlagDualSolverSimplex": "True", "FFlagPrimalSolverSimplex": "True", "FIntNumSmoothingPasses": "3", "FFlagVerifyConnection": "True", "FIntRegLambda": "1400", "FFlagScriptAnalyzerPlaceholder": "True", "FFlagCSGStripPublishedData": "True", "DFFlagRaycastReturnSurfaceNormal": "True", "FFlagMoveGameExplorerActionsIntoContextMenu": "True", "FFlagStudioAdvanceCookieExpirationBugFixEnabled": "True", "FFlagNewBackpackScript": "True", "FFlagGameNameAtTopOfExplorer": "True", "FFlagStudioActActionsAsTools": "True", "FFlagStudioInsertAtMouseClick": "True", "FFlagStopLoadingStockSounds": "True", "DFFlagFixTimePositionReplication": "True", "DFFlagHttpReportStatistics": "True", "DFFlagEnableChatTestingInStudio": "True", "DFIntHttpSendStatsEveryXSeconds": "300", "FLogStepAnimatedJoints": "5", "DFFlagLuaDisconnectFailingSlots": "False", "DFFlagEnsureSoundPosIsUpdated": "True", "DFFlagLoadStarterGearEarlier": "False", "DFFlagBlockUsersInLuaChat": "True", "FFlagRibbonPartInsertNotAllowedInModel": "True", "DFFlagUsePlayerScripts": "True", "DFFlagUserAccessUserSettings": "True", "DFFlagUseLuaCameraAndControl": "True", "DFFlagUseLuaPCInput": "True", "DFFlagFixLuaMoveDirection": "True", "DFFlagUseDecalLocalTransparencyModifier": "True", "DFFlagUseFolder": "True", "DFFlagUsePreferredSpawnInPlaySoloTeleport": "True", "DFFlagFilterAddSelectionToSameDataModel": "False", "FFlagGameExplorerAutofillImageNameFromFileName": "True", "FFlagGameExplorerBulkImageUpload": "True", "FFlagStudioAllowAudioSettings": "True", "DFFlagUsePlayerInGroupLuaChat": "True", "FFlagStudioDecalPasteFix": "True", "FFlagStudioCtrlTabDocSwitchEnabled": "True", "DFIntDraggerMaxMovePercent": "60", "FFlagUseUniverseGetInfoCallToDetermineUniverseAccess": "True", "FFlagMaxFriendsCount": "True", "DFIntPercentApiRequestsRecordGoogleAnalytics": "0", "FFlagSelectSpinlock": "True", "FFlagFastZlibPath": "True", "DFFlagWriteXmlCDataEnabled": "True", "DFFlagUseSpawnPointOrientation": "True", "DFFlagUsePlayerSpawnPoint": "True", "DFFlagCSGPhysicsRecalculateBadContactsInConnectors": "True", "FFlagStudioPartAlignmentChangeEnabled": "True", "FFlagStudioToolBoxModelDragFix": "True", "DFFlagOrder66": "False","FFlagCloudIconFixEnabled": "True", "DFFlagFixHealthReplication": "True", "DFFlagReplicateAnimationSpeed": "True", "FFlagLuaFollowers": "True", "FFlagNewNotificationsScript": "True", "FFlagStudioSendMouseIdleToPluginMouse": "True", "DFFlagPhysicsOptimizeAssemblyHistory": "True", "DFFlagPhysicsOptimizeBallBallContact": "True", "DFFlagUseNewBubbleSkin": "True", "DFFlagUse9FrameBackgroundTransparency": "True", "DFFlagCheckForHeadHit": "False", "DFFlagUseHttpsForAllCalls": "True", "DFFlagLoadCoreModules": "True", "FFlagStudioRecentSavesEnabled": "True", "FFlagStudioToolBoxInsertUseRayTrace": "True", "FFlagInterpolationUseWightedDelay": "True", "FFlagUseInGameTopBar": "True", "FFlagNewPurchaseScript": "True", "FFlagStudioEnableGamepadSupport": "True", "FFlagStudioRemoveDuplicateParts": "True", "FFlagStudioLaunchDecalToolAfterDrag": "True", "DFFlagHumanoidFloorPVUpdateSignal": "True", "DFFlagHumanoidFloorDetectTeleport": "True", "DFFlagHumanoidFloorForceBufferZone": "False", "DFFlagHumanoidFloorManualDeltaUpdateManagment": "True", "DFFlagHumanoidFloorManualFrictionLimitation": "True", "DFFlagUpdateHumanoidNameAndHealth": "True", "DFFlagEnableHumanoidDisplayDistances": "True", "FFlagFixTouchInputEventStates": "False", "DFFlagInterpolationTimingFix": "True", "FIntRenderGBufferMinQLvl": "16", "FFlagResizeGuiOnStep": "True", "FFlagDontFireFakeMouseEventsOnUIS": "True", "FFlagCameraUseOwnViewport": "True", "FFlagGameExplorerMoveImagesUnderAssetsGroup": "True", "DFFlagNetworkFilterAllowToolWelds": "True", "DFIntHttpInfluxHundredthsPercentage": "5", "DFStringHttpInfluxURL": "https://www.mete0r.xyz/", "DFStringHttpInfluxDatabase": "main", "DFStringHttpInfluxUser": "user", "DFStringHttpInfluxPassword": "password", "FFlagStudioSpawnLocationsDefaultValues": "True", "FFlagStudioDE11536FixEnabled": "True", "FFlagStudioRibbonGroupResizeFixEnabled": "True", "FFlagGradientStep": "True", "FFlagUseNewContentProvider": "False", "SFFlagEquipToolOnClient": "True", "FFlagStartWindowMaximizedDefault": "True", "FFlagUseNewKeyboardHandling": "True", "FFlagCameraZoomNoModifier": "True", "DFFlagRemoteValidateSubscribersError": "True", "FFlagNewMenuSettingsScript": "True", "DFFlagHttpCurlSanitizeUrl": "True", "DFFlagRemoveDataModelDependenceInWaitForChild": "True", "FFlagFilterAddSelectionToSameDataModel": "True", "DFFlagUseCanManageApiToDetermineConsoleAccess": "False", "DFIntMoveInGameChatToTopPlaceId": "1", "FFlagStudioProgressIndicatorForInsertEnabled": "True", "FFlagTerrainLazyGrid": "True", "FFlagHintsRenderInUserGuiRect": "True", "FFlagCallSetFocusFromCorrectThread": "True", "FFlagFastRevert": "True", "FFlagSleepBeforeSpinlock": "True", "FFlagSparseCheckFastFail": "True", "FFlagStudioSmoothTerrainPlugin": "True", "FFlagStudioLoadPluginsLate": "True", "FFlagStudioInsertIntoStarterPack": "True", "FFlagStudioIgnoreSSLErrors": "True", "DFFlagFixJointReparentingDE11763": "True", "DFFlagPhysicsInvalidateContactCache": "True", "FFlagLuaMathNoise": "True", "FFlagArcHandlesBidirectional": "True", "FFlagChangeHistoryFixPendingChanges": "True", "DFFlagWorkspaceSkipTerrainRaycastForSurfaceGui": "True", "FFlagStudioBatchItemMapAddChild": "True", "FFlagRenderCameraFocusFix": "True", "DFFlagReplicatorWorkspaceProperties": "True", "FFlagDirectX11Enable": "True", "FFlagCheckDegenerateCases": "True", "DFFlagUseServerCoreScripts": "True", "DFFlagCorrectFloorNormal": "True", "FFlagNewBadgeServiceUrlEnabled": "True", "FFlagBubbleChatbarDocksAtTop": "True", "FFlagSmoothTerrainClient": "True", "FFlagLuaUseBuiltinEqForEnum": "True", "FFlagPlaceLauncherThreadCheckDmClosed": "True", "DFFlagAppendTrackerIdToTeleportUrl": "True", "FFlagPlayerMouseRespectGuiOffset": "True", "DFFlagReportElevatedPhysicsFPSToGA": "True", "DFFlagPreventReturnOfElevatedPhysicsFPS": "True", "FFlagStudioIgnoreMouseMoveOnIdle": "True", "FFlagStudioDraggerFixes": "True", "FLogUseLuaMemoryPool": "0", "FFlagCSGNewTriangulate": "True", "DFFlagLuaFixResumeWaiting": "True", "FFlagFRMInStudio": "True", "DFFlagFixLadderClimbSpeed": "True", "DFFlagNoWalkAnimWeld": "False", "DFFlagImprovedKick": "True", "FFlagRenderFixLightGridDirty": "True", "FFlagLoadLinkedScriptsOnDataModelLoad": "True", "FFlagFixMeshOffset": "True", "FIntLaunchInfluxHundredthsPercentage": "0", "DFIntJoinInfluxHundredthsPercentage": "100", "FFlagSmoothTerrain": "True", "FFlagNewVehicleHud": "True", "DFFlagHumanoidStandOnSeatDestroyed": "True", "DFFlagGuiBase3dReplicateColor3WithBrickColor": "True", "FFlagTaskSchedulerCyclicExecutiveStudio": "True", "DFIntElevatedPhysicsFPSReportThresholdTenths": "585", "DFIntExpireMarketPlaceServiceCacheSeconds": "60", "DFFlagEnableMarketPlaceServiceCaching": "True", "DFFlagUseNewAnalyticsApi": "True", "DFFlagSmoothTerrainDebounceUpdates": "True", "FFlagStudioAuthenticationCleanup": "True", "FFlagRenderFixGBufferLOD": "True", "FFlagStudioDraggerCrashFixEnabled": "True", "FFlagDraggerCrashFixEnabled": "True", "DFFlagEnableRapidJSONParser": "True", "DFFlagPushLuaWorldRayOriginToNearClipPlane": "True", "FFlagLoadTimeModificationTestFlag": "True", "DFFlagPhysicsFastSmoothTerrainUpdate": "True", "DFFlagSmoothTerrainPhysicsExpandPrimitiveOptimal": "True", "DFFlagFixBytesOnJoinReporting": "True", "FFlagRenderGBufferEverywhere": "False", "DFFlagSmoothTerrainPhysicsRayAabbExact": "True", "DFIntSmoothTerrainPhysicsRayAabbSlop": "1", "DFIntMaxClusterKBPerSecond": "300", "FLogLuaAssert": "0", "FFlagSmoothTerrainCountCellVolume": "True", "DFFlagSmoothTerrainWorldToCellUseDiagonals": "True", "DFFlagFireSelectionChangeOncePerChange": "True", "FIntLuaAssertCrash": "0", "FFlagRenderFixCameraFocus": "False", "DFFlagCSGPhysicsSphereRotationIdentity": "True", "DFFlagCSGPhysicsRefreshContactsManually": "True", "FFlagStudioUndoEnabledForEdit": "True", "DFIntLuaChatFloodCheckMessages": "7", "DFIntLuaChatFloodCheckInterval": "15", "FFlagLuaChatFiltering": "True", "FFlagMobileToggleChatVisibleIcon": "True", "FFlagStudioDE9132FixEnabled": "True", "DFFlagGetUserIdEnabled": "True", "DFFlagGetUserNameEnabled": "True", "DFFlagEnableAnimationInformationAccess": "True", "DFFlagEnableAnimationTrackExtendedAPI": "True", "FFlagRequestServerStatsV2Enabled": "True", "FFlagPhysicsPreventGroupDraggerPlacementToMinus400_DE6267": "True", "FFlagSpecificUserdataTypeErrors": "True", "DFFlagScrollingFrameDraggingFix": "True", "FFlagAutodetectCPU": "True", "DFFlagSetRenderedFrameOnClumpChanged": "True", "DFFlagDisableTimeoutDuringJoin": "True", "DFFlagDesiredAltitudeDefaultInf": "True", "DFFlagRCCDE13316CrashFix": "True", "DFFlagUseStarterPlayerGA": "True", "FFlagScrollingFrameMouseUpFix": "True", "DFFlagDebrisServiceUseDestroy": "True", "DFFlagAccessUserFeatureSetting": "True", "DFFlagAllowBindActivate": "True", "FFlagEnableControllerGuiSelection": "True", "FFlagUseNewSoftwareMouseRender": "True", "DFFlagDoNotHoldTagItemsForInitialData": "True", "FFlagAltSpinlock": "True", "FFlagSpinlock": "True", "FFlagGraphicsGLReduceLatency": "True", "DFFlagMovingHumananoidWakesFloor": "True", "DFFlagSetNetworkOwnerAPIEnabled": "True", "DFFlagSetNetworkOwnerAPIEnabledV2": "True", "DFFlagGetFriendsEnabled": "True", "DFFlagGetFriendsOnlineEnabled": "True", "DFFlagUseNewTextBoxLogic": "True", "FFlagOnScreenProfilerGPU": "True", "FFlagConfigurableLineThickness": "True", "DFFlagSpawnPointEnableProperty": "True", "DFFlagConfigurableFallenPartDestroyHeight": "True", "DFFlagMiddleMouseButtonEvent": "True", "DFFlagEnablePreloadAsync": "True", "DFFlagFoldersInGUIs": "True", "DFIntAndroidInfluxHundredthsPercentage": "0", "DFFlagNoOwnershipLogicOnKernelJoint": "True", "DFFlagEnableGetPlayingAnimationTracks": "True", "FFlagCyclicExecutivePriorityJobs": "True", "DFIntMaxMissedWorldStepsRemembered": "16", "DFIntMacInfluxHundredthsPercentage": "0", "DFIntiOSInfluxHundredthsPercentage": "100", "FFlagStudioLockServiceParents": "True", "DFFlagFirePlayerAddedAndPlayerRemovingOnClient": "True", "DFFlagRecursiveWakeForBodyMovers": "True", "DFFlagEnableHumanoidSetStateEnabled": "True", "DFFlagSoundEndedEnabled": "True", "DFFlagUseIntersectingOthersForSpawnEnabled": "True", "DFFlagMoveToDontAlignToGrid": "True", "DFFlagIsBestFriendsWithReturnFriendsWith": "True", "DFFlagPlayerOwnsAssetFalseForInvalidUsers": "True", "DFFlagIsUrlCheckAssetStringLength": "True", "DFFlagEnableGoodbyeDialog": "True", "DFFlagEnableReverseAnimations": "True", "DFFlagEnableAnimationSetTimePosition": "True", "DFFlagEnableMobileAutoJumpFlag": "True", "DFFlagHttpDelaySendInfluxStats": "True", "DFFlagDisableRequestMarker": "True", "DFFlagDisableCharacterRequest": "True", "FFlagStudioCollapsibleTutorials": "True", "FStringStudioTutorialsUrl": "http://wiki.roblox.com/index.php?title=Studio_Tutorials_Test&studiomode=true", "FStringStudioTutorialsTOCUrl": "http://wiki.roblox.com/index.php?title=Studio_Tutorials_Landing&studiomode=true", "FFlagSandboxHash": "True", "FFlagDE14316CrashFix": "True", "FFlagDE14317CrashFix": "True", "DFFlagSetNetworkOwnerCanSetCheck": "True", "DFFlagLiveColorUpdatesCanceling": "True", "DFFlagLuaGcPerVm": "True", "FFlagStudioDeviceEmulationTouchInputFix": "True", "FFlagTaskSchedulerCyclicExecutive": "True", "DFFlagMakeWebPendingFriendRequests": "True", "DFFlagGetLastestAssetVersionEnabled": "True", "FFlagHideDeprecatedEnums": "False", "FFlagSubmitEditedColor3WhenFocusLost": "True", "DFFlagFixScriptableCameraRoll": "True", "DFFlagSeparateBulletNarrowPhaseAndMidStepUpdates": "True", "DFFlagUsePGSSolverSpringConstantScale": "True", "DFFlagToolRequiresHandleProperty": "True", "FFlagPlayerScriptsNotArchivable": "True", "DFFlagClearAllChildrenUseDestroy": "True", "DFFlagMaxPlayersEnabled": "True", "DFFlagPreferredPlayersEnabled": "True", "DFFlagLocalHumanoidSoundsEnabled": "True", "DFFlagIncreaseSoundPositionClampLimit": "True", "DFFlagNameOcculsionIgnoreTransparent": "True", "DFFlagReconstructAssetUrlNew": "True", "DFFlagAdjustFloorForce": "True", "DFFlagFixAnimationPhaseInitialization": "True", "FFlagLuaChatPhoneFontSize": "True", "DFFlagUseAssetTypeHeader": "True", "FFlagCSGUnionCatchUnknownExceptions": "False", "FIntGamePerfMonitorPercentage": "10", "FFlagSoundTypeCheck": "True", "DFFlagIncreaseScrollWheelMultiplyTime": "True", "FFlagMacRemoveUserInputJob": "True", "FFlagStudioNewFonts": "True", "DFFlagApiCapitalizationChanges": "True", "FFlagParticleCullFix": "True", "DFFlagVideoCaptureTeleportFix": "False", "DFFlagCoreGuiCustomizationApi": "True", "DFFlagCustomTeleportLoadingScreen": "True", "DFFlagCharacterAppearanceLoadedEnabled": "True", "DFFlagVIPServerOwnerIdEnabled": "True", "DFFlagEnableParticleVelocityInheritance": "True", "DFFlagEnableParticleEmissionDirection": "True", "DFFlagFixParticleDistribution": "True", "DFFlagEnableParticleNewBoundingBox": "True", "DFFlagEnableParticlePartLock": "True", "DFFlagEnableParticleBurst": "True", "DFFlagNoRunSteepSlope": "True", "DFFlagHumanoidJumpPower": "True", "FFlagControllerMenu": "True", "FFlagFlyCamOnRenderStep": "True", "DFFlagFullscreenEnabledWhileRecording": "True", "DFFlagPreProcessTextBoxEvents": "True", "DFFlagAllowHideHudShortcut": "False", "DFFlagFixBallInsideBlockCollision": "True", "FFlagPGSSolverBodyCacheLeakFix": "True", "FFlagFixCrashAtShutdown": "True", "DFFlagEquipClonedToolFix": "True", "FFlagGamepadCursorChanges": "True", "DFFlagCreatePlayerGuiLocal": "False", "DFFlagDontUseInsertServiceOnAnimLoad": "True", "DFFlagCyclicExecutiveFixNonCyclicJobRun": "True", "DFFlagPhysicsFPSTimerFix": "True", "FFlagCyclicExecutiveRenderJobRunsFirst": "True", "FFlagPhysicsCylinders": "True", "DFFlagPhysicsUseNewBulletContact": "True", "FFlagReadCoordinateFrameFast": "False", "DFFlagRayHitMaterial": "True", "DFFlagPromptPurchaseOnGuestHandledInCoreScript": "True", "DFFlagNonEmptyPcallError": "True", "DFFlagDisplayTextBoxTextWhileTypingMobile": "False", "DFFlagOverrideScollingDisabledWhenRecalulateNeeded": "True", "DFFlagFixScrollingOffSurfaceGUIs": "True", "DFFlagTextScaleDontWrapInWords": "True", "DFFlagListenPositionEnabled": "True", "DFFlagBackTabInputInStudio": "True", "DFFlagTrackLastDownGUI": "True", "DFFlagBulletFixCacheReuse": "True", "DFFlagFastFilterHumanoidParts": "False", "DFFlagProcessAcceleratorsBeforeGUINaviagtion": "True", "DFFlagImageFailedToLoadContext": "True", "DFFlagDontReorderScreenGuisWhenDescendantRemoving": "True", "DFFlagSoundFailedToLoadContext": "True", "DFFlagAnimationFailedToLoadContext": "True", "DFFlagElasticEasingUseTwoPi": "True", "SFFlagNetworkUseServerScope": "True", "DFFlagHttpZeroLatencyCaching": "True", "DFFlagPasteWithCapsLockOn": "True", "DFFlagHttpCurlDomainTrimmingWithBaseURL": "False", "DFFlagLoadFileUseRegularHttp": "True", "DFFlagReplicatorCheckBadRebinding": "True", "FFlagFastClusterThrottleUpdateWaiting": "True", "DFFlagDeserializePacketThreadEnabled": "True", "FFlagFontSizeUseLargest": "True", "DFFlagRejectHashesInLinkedSource": "True", "FFlagUpdatePrimitiveStateForceSleep": "True", "FFlagPhysicsUseKDTreeForCSG": "True", "DFFlagCSGLeftoverDataFix": "True", "FFlagStudioTutorialSeeAll": "True", "DFFlagLimitScrollWheelMaxToHalfWindowSize": "True", "FFlagGameExplorerCopyPath": "True", "DFFlagFixRotatedHorizontalScrollBar": "True", "DFFlagFixAnchoredSeatingPosition": "True", "FFlagFixSlice9Scale": "True", "DFFlagFullscreenRefocusingFix": "True", "DFFlagEnableClimbingDirection": "True", "FFlagPGSGlueJoint": "True", "FFlagTweenCallbacksDuringRenderStep": "True", "FFlagFRMFixCullFlicker": "True", "DFFlagDisableProcessPacketsJobReschedule": "True", "FFlagCSGVoxelizerPrecompute": "False", "FFlagLazyRenderingCoordinateFrame": "True", "FFlagPGSSteppingMotorFix": "True", "DFFlagLockViolationScriptCrash": "False", "DFFlagLockViolationInstanceCrash": "False", "FFlagSpheresAllowedCustom": "True", "DFFlagHumanoidCookieRecursive": "True", "FFlagRwxFailReport": "True", "FIntStudioInsertDeletionCheckTimeMS": "30000", "DFFlagClampRocketThrustOnPGS": "True", "DFFlagPGSWakePrimitivesWithBodyMoverPropertyChanges": "True", "FFlagPGSUsesConstraintBasedBodyMovers": "True", "FFlagUseNewSubdomainsInCoreScripts": "True", "DFFlagEnableShowStatsLua": "True", "FFlagSmoothTerrainPacked": "True", "DFFlagUrlReconstructToAssetGame": "False", "FFlagPGSApplyImpulsesAtMidpoints": "True", "FFlagModifyDefaultMaterialProperties": "True", "FIntPhysicalPropFriction_SMOOTH_PLASTIC_MATERIAL": "200", "FIntPhysicalPropFriction_PLASTIC_MATERIAL": "300", "FIntPhysicalPropFriction_NEON_MATERIAL": "300", "FIntPhysicalPropFriction_SNOW_MATERIAL": "300", "FIntPhysicalPropFriction_ALUMINUM_MATERIAL": "400", "FIntPhysicalPropFriction_BRICK_MATERIAL": "800", "FIntPhysicalPropFriction_CONCRETE_MATERIAL": "700", "FIntPhysicalPropFriction_DIAMONDPLATE_MATERIAL": "350", "FIntPhysicalPropFriction_SANDSTONE_MATERIAL": "500", "FIntPhysicalPropFriction_SAND_MATERIAL": "500", "FIntPhysicalPropFWeight_ICE_MATERIAL": "3000", "FIntPhysicalPropFWeight_BRICK_MATERIAL": "300", "FIntPhysicalPropFWeight_CONCRETE_MATERIAL": "300", "FIntPhysicalPropFWeight_SANDSTONE_MATERIAL": "5000", "FIntPhysicalPropFWeight_BASALT_MATERIAL": "300", "FIntPhysicalPropFWeight_SAND_MATERIAL": "5000", "FIntPhysicalPropElasticity_SAND_MATERIAL": "50", "FIntPhysicalPropElasticity_SNOW_MATERIAL": "30", "FIntPhysicalPropElasticity_MUD_MATERIAL": "70", "FIntPhysicalPropElasticity_GROUND_MATERIAL": "100", "FIntPhysicalPropElasticity_MARBLE_MATERIAL": "170", "FIntPhysicalPropElasticity_BRICK_MATERIAL": "150", "FIntPhysicalPropElasticity_PEBBLE_MATERIAL": "170", "FIntPhysicalPropElasticity_COBBLESTONE_MATERIAL": "170", "FIntPhysicalPropElasticity_ROCK_MATERIAL": "170", "FIntPhysicalPropElasticity_SANDSTONE_MATERIAL": "150", "FIntPhysicalPropElasticity_BASALT_MATERIAL": "150", "FIntPhysicalPropElasticity_CRACKED_LAVA_MATERIAL": "150", "FIntPhysicalPropElasticity_FABRIC_MATERIAL": "50", "FIntPhysicalPropElasticity_WOOD_MATERIAL": "200", "FIntPhysicalPropElasticity_WOODPLANKS_MATERIAL": "200", "FIntPhysicalPropElasticity_ICE_MATERIAL": "150", "FIntPhysicalPropElasticity_GLACIER_MATERIAL": "150", "FIntPhysicalPropElasticity_RUST_MATERIAL": "200", "FIntPhysicalPropElasticity_DIAMONDPLATE_MATERIAL": "250", "FIntPhysicalPropElasticity_ALUMINUM_MATERIAL": "250", "FIntPhysicalPropElasticity_METAL_MATERIAL": "250", "FIntPhysicalPropElasticity_GRASS_MATERIAL": "100", "DFFlagFixSeatingWhileSitting": "True", "FFlagPGSSolverDefaultOnNewPlaces": "True", "FFlagPGSVariablePenetrationMargin": "False", "FIntPGSPentrationMarginMax": "50000", "FFlagStudioHideMouseCoursorOnCommand": "True", "SFFlagNewPhysicalPropertiesForcedOnAll": "True", "SFFlagMaterialPropertiesNewIsDefault": "True", "DFFlagMaterialPropertiesEnabled": "True", "FFlagWaterParams": "True", "FFlagSpatialHashMoreRoots": "True", "FFlagSkipAdornIfWorldIsNull": "True", "DFStringWorkspaceMessageLink": "http://discord.gg/4uN3tKX9v5", "DFStringWorkspaceMessageText": "Click here to join our Discord server!", "DFIntStudioWorkspaceNotificationLevel": "0", "DFFlagNetworkOwnershipRuleReplicates": "True", "DFFlagSmoothTerrainWriteVoxelsOccupancyFix": "True", "DFFlagCloudEditByPassCheckForServer": "True", "DFFlagDraggerUsesNewPartOnDuplicate": "True", "DFFlagRestoreTransparencyOnToolChange": "False", "FFlagEnableLuaFollowers": "False", "DFFlagUserServerFollowers": "True", "FFlagNetworkReplicateTerrainProperties": "True", "FFlagAllowInsertFreeModels": "True", "FFlagInsertUnderFolder": "True", "DFFlagPGSWakeOtherAssemblyForJoints": "True", "FFlagStudioPropertySliderEnabled": "True", "DFFlagSetNetworkOwnerFixAnchoring": "True", "FFlagFixBulletGJKOptimization": "True", "FFlagOSXUseSDL": "False", "DFFlagPhysicalPropMassCalcOnJoin": "False", "DFFlagBrickColorParseNonDeprecatedMatchEnabled": "True", "FFlagWindowsUseSDL": "False", "FFlagPhysicsOptimizeSendClumpChanged": "True", "DFFlagHumanoidFeetIsPlastic": "True", "DFFlagUseTerrainCustomPhysicalProperties": "True", "DFFlagFormFactorDeprecated": "False", "FFlagPGSVariablePenetrationMarginFix": "True", "DFIntDataStoreMaxValueSize": "262144", "DFFlagFixShapeChangeBug": "True", "FFlagScriptAnalyzerFixLocalScope": "True", "FFlagRenderVRBBGUI": "True", "FFlagRenderVR": "True", "DFFlagNetworkFixJoinDataItemOrder": "True", "FFlagStudioImproveModelDragFidelity": "True", "FFlagStudioOrthonormalizeSafeRotate": "True", "FFlagMacInferredCrashReporting": "True", "FFlagWindowsInferredCrashReporting": "True", "FFlagCloudEditDoNotLoadCoreScripts": "True", "FFlagStudioEmbeddedFindDialogEnabled": "True", "FFlagUserAllCamerasInLua": "False", "DFFlagMacInferredCrashReporting": "True", "DFFlagWindowsInferredCrashReporting": "True", "FFlagUseNewPromptEndHandling": "True", "FFlagPhysPropConstructFromMaterial": "True", "FFlagStudioToolboxModelDragToCastPoint": "True", "FFlagStudioPushTreeWidgetUpdatesToMainThread": "True", "DFFlagFixYieldThrottling": "True", "FFlagCheckSleepOptimization": "True", "DFFlagContactManagerOptimizedQueryExtents": "True", "FFlagUseBuildGenericGameUrl": "True", "DFFlagFixFallenPartsNotDeleted": "True", "DFFlagTrackPhysicalPropertiesGA": "True", "DFFlagSetNetworkOwnerFixAnchoring2": "True", "FFlagUseSimpleRapidJson": "True", "DFFlagTurnOffFakeEventsForCAS": "True", "DFFlagTurnOffFakeEventsForInputEvents": "True", "FFlagCancelPendingTextureLoads": "False", "DFFlagCachedPoseInitialized": "True", "DFFlagFixJumpGracePeriod": "True", "FFlagFilterSinglePass": "True", "DFFlagOrthonormalizeJointCoords": "True", "DFFlagPhysicsSenderUseOwnerTimestamp": "False", "DFFlagNamesOccludedAsDefault": "True", "FFlagUserUseNewControlScript": "True", "FFlagUseDynamicTypesetterUTF8": "True", "DFFlagUseNewPersistenceSubdomain": "True", "DFFlagUseNewDataStoreLogging": "True", "FFlagPlaceLauncherUsePOST": "False", "FFlagStudioUpdateSAResultsInUIThread": "True", "FFlagBillboardGuiVR": "True", "FFlagHumanoidRenderBillboard": "True", "FLogVR": "6", "FFlagStudioRemoveDebuggerResumeLock": "True", "FFlagAnalyzerGroupUIEnabled": "True", "DFFlagVariableHeartbeat": "True", "DFFlagScreenShotDuplicationFix": "True", "FFlagCSGDelayParentingOperationToEnd": "True", "FFlagStudioTreeWidgetCheckDeletingFlagWhenDoingUpdates": "True", "DFFlagUseComSiftUpdatedWebChatFilterParamsAndHeader": "False", "DFFlagConstructModerationFilterTextParamsAndHeadersUseLegacyFilterParams": "False", "FFlagMinMaxDistanceEnabled": "True", "FFlagRollOffModeEnabled": "True", "DFFlagGetLocalTeleportData": "True", "FFlagUseNewXboxLoginFlow": "True", "DFFlagFixSlowLadderClimb": "True", "DFFlagHumanoidCheckForNegatives": "True", "DFFlagFixMatrixToAxisAngle": "True", "DFFlagMaskWeightCleared": "True", "DFFlagUseStarterPlayerCharacterScripts": "True", "DFFlagUseStarterPlayerHumanoid": "True", "DFFlagAccessoriesAndAttachments": "True", "FFlagTeamCreateOptimizeRemoteSelection": "True", "FFlagReportInGameAssetSales": "True", "FFlagFilterDoublePass": "False", "DFFlagRaiseSendPriority": "False", "FFlagUsePreferredSoundDevice": "True", "FFlagRenderLowLatencyLoop": "False", "DFFlagLocalScriptSpawnPartAlwaysSetOwner": "True", "DFFlagCloudEditSupportImmediatePublish": "True", "FFlagFixSurfaceGuiGamepadNav": "True", "DFFlagEnableAdColony": "False", "FFlagEnableAdServiceVideoAds": "False", "DFFlagInfluxDb09Enabled": "True", "DFFlagTeleportSignalConnectOnServiceProvider": "True", "DFFlagScriptContextGuardAgainstCStackOverflow": "True", "FFlagFixPhysicalPropertiesComponentSet": "True", "DFFlagMaterialPropertiesDivideByZeroWeights": "True", "FFlagRemoveUnusedPhysicsSenders": "True", "FFlagRemoveInterpolationReciever": "True", "DFFlagActivatePGSMechanicalJoints": "True", "FIntPhysicalPropDensity_ALUMINUM_MATERIAL": "2700", "FFlagTreatCloudEditAsEditGameMode": "True", "FFlagSendFilteredExceptionOnInferredStep": "True", "DFFlagUrlReconstructToAssetGameSecure": "False", "DFFlagUseModerationFilterTextV2": "True", "FFlagGraphicsD3D10": "True", "FFlagRenderFixFog": "True", "FFlagUseNewAppBridgeWindows": "True", "DFFlagNullCheckJointStepWithNullPrim": "True", "FFlagJNIEnvScopeOptimization": "True", "DFFlagSanitizeLoadingGUICorrected": "True", "FFlagSendLegacyMachineConfigInfo": "False", "FFlagUseNewBadgesCreatePage": "True", "FFlagRetryWhenCloudEditEnabledEndpointFails": "True", "DFFlagTeamCreateDoNotReplicateShowDevGuiProp": "True", "FFlagStudioAddBackoffToNotificationsReconnects": "True", "DFFlagInsertServiceForceLocalInTeamCreate": "True", "FFlagGraphicsMacFix": "True", "FFlagUseNewAppBridgeOSX": "True", "FFlagNewColor3Functions": "True", "DFFlagSmootherVehicleSeatControlSystem": "True", "FFlagGameExplorerUseV2AliasEndpoint": "True", "FFlagDisableAbortRender": "True", "DFFlagInstancePredeleteNuke": "True", "DFFlagSimpleHermiteSplineInterpolate": "False", "DFFlagCleanUpInterpolationTimestamps": "True", "SFFlagPhysicsPacketSendWorldStepTimestamp": "True", "DFFlagUpdateTimeOnDelayedSamples": "False", "DFFlagDisableMovementHistory": "True", "DFFlagLookForDuplicateCoordinateFrameInBuffer": "True", "DFFlagDoNotForwardClientTimestamp": "True", "DFFlagZeroVelocityOnDelayedSamples": "True", "DFFlagUpdateHermiteLastFrameWhenUpdatePrevFrame": "True", "DFFlagCatchThrottledVelocityComponents": "True", "DFIntThrottledVelocityThresholdTenths": "15", "DFFlagShowFormFactorDeprecatedWarning": "False", "FFlagStudioTeamCreateWebChatBackendEnabled": "True", "DFFlagAnimationEasingStylesEnabled": "True", "FFlagUseVRKeyboardInLua": "True", "DFFlagCheckDataModelOnTeleportRetry": "True", "DFStringHttpInfluxWriterPassword": "faster1Play", "DFFlagOptimizeAnimator": "True", "FFlagOptimizeAnimatorCalcJoints": "True", "DFFlagStopUsingMaskWeight": "True", "FFlagRenderNoDepthLast": "True", "DFFlagFixTimeStampsForRunningNoThrottle": "True", "DFIntInterpolationDelayFactorTenths": "10", "DFFlagUseHermiteSplineInterpolation": "True", "DFFlagChatServiceFilterStringForPlayerFromAndToStudioBypass": "True", "FFlagCameraInterpolateMethodEnhancement": "False", "DFFlagBlendPosesWithIsOver": "True", "FFlagRestrictSales": "True", "FFlagBadTypeOnPcallEnabled": "True", "FFlagFixMouseFireOnEmulatingTouch": "True", "FFlagUseUpdatedSyntaxHighlighting": "True", "FFlagFixStickyDragBelowOrigin": "True", "FFlagFixBadMemoryOnStreamingGarbageCollection": "True", "DFFlagFixAllCharacterStreaming": "True", "FFlagDisableChangedServiceInTestMode": "True", "FFlagAllowFullColorSequences": "True", "FFlagStudioAllowFullColorSequences": "True", "DFFlagDynamicGravity": "True", "FFlagUseNewAppBridgeAndroid": "True", "FFlagFixSurfaceGuiGazeSelect": "True", "FFlagFixAlwaysOnTopSurfaceGuiInput": "True", "DFFlagCSGPreventCrashesWhenPartOperationsNotInDataModel": "True", "DFFlagUsePointsNewBatchingImpl": "True", "FFlagUseUpdatedKeyboardSettings": "False", "DFFlagFixAnimationControllerAnimator": "True", "DFFlagNoAnimationTrackState": "True", "DFFlagFixNestedAnimators": "True", "DFFlagWaitForToolHandleToEquip": "True", "DFFlagUseNewFetchFriendsFunction": "True", "FFlagWindowsNoDmpRetry": "False", "FFlagDeleteLogsOnMac": "True", "FFlagDeleteLogsByDate": "True", "FFlagTestMenuEnabledOnAllWindows": "True", "FFlagSoundServiceGameConfigurerConfigureRunServiceRun": "True", "DFFlagDoUpdateStepDetachedChannels": "True", "FFlagSoundChannelMaxDistanceStopFMODChannel": "True", "FFlagRenderSoftParticles": "True", "FFlagScriptContextSinglePendingThreadsQueue": "False", "DFIntTeleportExceptionInfluxHundredthsPercentage": "9000", "FIntStartupInfluxHundredthsPercentage": "100", "FFlagCSGAllowUnorderedProperties": "False", "DFFlagGamepadProcessMouseEvents": "False", "DFFlagCrashTouchTransmitterIfRefDtor": "False", "FFlagRenderUserGuiIn3DSpace": "True", "FFlagScreenGuisClipDescendants": "True", "FFlagUseNewNotificationPathLua": "True", "FFlagVideoDocumentationPluginEnabled": "True", "FFlagStudioBreakOnInfiniteLoops": "True", "FFlagMessageOnLoadScriptValidationFail": "True", "FFlagStudioMockPurchasesEnabled": "True", "FFlagStudioUseMarketplaceApiClient": "True", "DFFlagUseGameAvatarTypeEnum": "False", "FFlagStudioUsePlaySoloConfigurer": "True", "DFFlagUseAvatarFetchAPI": "False", "DFFlagSetHumanoidRegardlessOfNetworkOwnership": "True", "FFlagFixStudioCursorJitter": "True", "FFlagVoxelCompressedStorage": "True", "FFlagSmoothTerrainLODEnabled": "True", "FFlagBetterTabManagement": "True", "DFFlagBlockCustomHttpHeaders": "False", "FFlagStudioInsertAtTopCenterOfSelection": "True", "DFFlagCloudEditRemoveEditorOnPlayerRemove": "True", "FFlagWaitForChildTimeOut": "True", "FFlagDeviceEmulationStatistics": "True", "FFlagFixBoxSelectWithCtrl": "True", "FFlagStudioTrimPropertyWhitespace": "True", "FFlagDebugCSGExportFailure": "False", "FFlagFixCrashOnEmptyTextOnAutoComplete": "True", "FFlagCancelInputOnGuiNavigation": "True", "FFlagRemoveOldAnalyticsImplementation": "True", "FFlagRemoveOldCountersImplementation": "True", "FFlagUseNewAppBridgeStudio": "True", "FFlagStudioAnalyticsRefactoring": "True", "DFFlagRCCUseMarketplaceApiClient": "False", "FFlagStudioIntellesenseOnAllMembersEnabled": "True", "DFFlagDataStoreDisableReFetchingRecentKeys": "True", "FFlagNewDefaultScriptSource": "True", "FFlagStudioEnableDebuggerPerfImprovements": "True", "FFlagRecordForceStereo": "True", "FFlagStudioVideoRecordFix": "True", "FFlagStudioUseHttpsForUserInfo": "True", "FFlagUseHttpsForGameserverAshx": "True", "FFlagDisableScriptContextScriptsDisabled": "True", "DFFlagDuplicateInstanceReferenceFix": "True", "FFlagRakNetSupportIpV6": "False", "FFlagUseToStringN": "True", "FFlagStudioRenderRemotePlayerSelection": "True", "FFlagStackTraceLinks": "True", "FFlagStudioUpdateRestoreBehavior": "True", "FFlagTouchTransmitterWeakPtr": "True", "FFlagAdvancedRCCLoadFMODRetry": "True", "FFlagAdvancedRCCLoadFMODReportDeviceInfo": "True", "FFlagAdvancedRCCLoadFMODAttemptReportDeviceInfoOnFailure": "True", "FFlagClientLoadFMODReportDeviceInfo": "True", "DFIntReportDeviceInfoRate": "100", "DFFlagSoundV2LogOnSetSoundId": "True", "FFlagMouseUseUserInputServiceMouse": "True", "SFFlagSoundChannelUseV2Implementation": "True", "SFFlagUseNewSetFMOD3D": "True", "FFlagCSGReportSuccessFailure": "True", "FFlagUseAvatarFetchThumbnailLogic": "True", "FFlagDoIncrementalLoadingForR6AvatarFetch": "True", "FFlagUseAvatarFetchAPI": "True", "FFlagUseGameAvatarTypeEnum": "True", "FFlagSmoothTerrainLODFalseCoarseNeighbor": "True", "FFlagStudioPublishToRobloxActionUXAlwaysAvailable": "True", "FFlagFixArraysNotUnmarkedFromCyclicTableDetection": "True", "FFlagSoundIgnoreReplicatorJoinDataItemCache": "True", "FFlagStudioReportCachedRecentActions": "True", "FFlagStudioCacheRecentAction": "True", "FFlagRenderMeshReturnsCorrectly": "False", "FFlagEnableRenderCSGTrianglesDebug": "False", "FFlagStudioBreakOnInfiniteLoopsThreadingFixEnabled": "True", "SFFlagNetworkStreamRotationAsFloat": "False", "DFFlagStarterGuiMethodsWarnServer": "True", "DFFlagStarterGuiPropertiesReplicate": "True", "DFFlagClickDetectorReplicate": "True", "FFlagTeleportDetailedInfluxHttpStatusError": "True", "DFFlagHttpStatusCodeErrorIncludeBody": "True", "FFlagEnableVoiceASR": "False", "DFFlagFMODSetAccurateTime": "True", "FFlagRenderFixGuiOrder": "True", "FFlagExplosionsVisiblePropertyEnabled": "True", "FFlagEnableVoiceRecording": "False", "FFlagStudioReopenClosedTabsShortcut": "True", "FFlagStudioShowNotSavingScriptEditsOnce": "True", "FFlagHttpCurlCacheHandles": "True", "DFFlagAvatarFetchCanLoadCharacterAppearanceFix": "True", "FFlagGraphicsTextureCommitChanges": "False", "DFFlagLoadInstancesAsyncUseDataModelTasks": "False", "DFFlagInfluxOverUDP": "True", "FFlagUseLegacyEnumItemLookup": "True", "DFFlagInfluxOverTCP": "False", "DFFlagCFrameRightAndUpVectors": "True", "DFFlagLegacyBodyColorsOnCharacterLoadFailure": "True", "DFFlagUseMeshPartR15": "True", "FFlagStudioFixLockingScriptDisablesMenuOptions": "True", "FFlagUseCorrectDoppler": "True", "DFFlagFixJumpRequestOnLand": "True", "DFFlagNullStarterCharacterPrimaryPartFix": "True", "SFFlagR15CompositingEnabled": "True", "FFlagStudioFixPropertiesWindowScrollBarNotShowing": "True", "FFlagFixCollisionFidelityTeamCreate": "True", "DFFlagSendHttpBodyOnFailure": "True", "DFFlagCSGPreventNoContextCSGCrashes": "False", "FFlagConstraintPropertyReplicationRaceConditionFixEnabled": "True", "FFlagFixLogCulling": "True", "FFlagSmoothTerrainLODFixSeams": "True", "DFFlagDontCacheHumanoids": "True", "FFlagStudioPlaySoloConfigurerLegacyPlayerName": "True", "DFFlagPartForRegion3NoMaxLimit": "True", "FFlagRCCSupportTeamTest": "True", "FFlagStudioSupportBytecodeDeserialize": "True", "DFFlagStackTraceHasNewLines": "True", "DFFlagCleanCacheMoveMutex": "True", "FFlagFastFontMeasure": "False", "FFlagRenderMoreFonts": "True", "FFlagCleanFilteringEnabledLocalSpawnParts": "True", "FFlagFetchJoinScriptWithHttp": "False", "FFlagCheckPlayerProcessMutexCreation": "True", "FFlagCheckRegisterSoundChannelUniqueness": "True", "FFlagUseCommonModules": "True", "DFFlagRemoteFixDisconnectedPlayer": "True", "FFlagWarnForLegacyTerrain": "True", "FFlagFastClusterDisableReuse": "True", "FFlagStudioRespectMeshOffset": "False", "DFFlagRevisedClientJoinMetrics": "True", "FFlagRestoreScriptSourceWhenRedoingScriptCreation": "True", "DFFlagStudioFixPastingDecalsIntoMultiple": "True", "FFlagMeshPartMaterialTextureSupport": "True", "FFlagStudioPlaySoloCharacterAutoLoadsNullTool": "True", "DFFlagPGSWakeOtherIfOneAssemblyIsAwake": "False", "DFFlagFixR15BodyPhysics": "True", "FFlagLoadCharacterSoundFromCorescriptsRepo": "True", "DFFlagSoundV2LoadUseParamContext": "True", "DFFlagSoundV2LoadedRunCallbacks": "True", "FFlagFixPlayerProcessMutexDeadlock": "True", "FFlagImprovedJoinScriptFlow": "True", "FFlagRCCLoadFMOD": "True", "FFlagStudioDeadCodeOnMouseDown": "True", "DFFlagFireCharacterAddedAfterSpawn": "False", "FFlagChatVisiblePropertyEnabled": "True", "FFlagChatLayoutChange": "False", "FFlagCorescriptNewLoadChat": "True", "DFLogLuaTypeErrors": "4", "DFFlagLuaInstanceBridgeNewCamelCaseFixerEnabled": "True", "FFlagConstraintUIEnabled": "True", "FFlagStudioSetObjectsFromPropertiesWindow": "True", "FFlagStudioPromptWhenInsertingConstraints": "True", "DFFlagFixExperimentalSolverSetter": "True", "DFFlagShowRedForAutoJointsForPartsWithConstraint": "True", "FFlagTrackOriginalClientID": "True", "FFlagStudioHiddenPropertyCrashFixEnabled": "True", "FFlagStudioPropertyChangedSignalHandlerFix": "True", "FFlagStudioScriptAnalysisGetOrCreateRefactoring": "True", "DFFlagAllowHttpServiceInTeamCreate": "True", "DFFlagAllowRequireByAssetIdInTeamCreate": "True", "DFFlagLuaSignalCamelCaseAPI": "True", "FFlagFixLogManagerWritingToTempDir": "True", "FFlagTrackModuleScripts": "True", "FFlagUserJumpButtonPositionChange": "True", "FFlagLoadCommonModules": "True", "FFlagMouseCommandChangedSignalEnabled": "True", "DFIntInfluxTattletalePerUserHundredthsPercent": "1", "DFIntInfluxTattletalePerEventHundredthsPercent": "2000", "DFIntInfluxTattletaleCooldownSeconds": "300", "DFFlagSendHttpInfluxDatabaseField": "True", "FFlagGraphicsD3D11HandleDeviceRemoved": "True", "FFlagFixPlayerProcessMutexDeadlockForReal": "True", "FFlagNetworkKeepItemPools": "True", "FLogNetworkItemQueueDtor": "1", "FFlagFixLoadingScreenAngle": "False", "FFlagFixStudioInGamePaste": "True", "FFlagStudioSetViewportSizeOfClone": "True", "FFlagStudioTreeWidgetPotentialMemoryLeak": "True", "FFlagStudioEnableLayersForNSView": "True", "FFlagEnableViewportScaling": "True", "FFlagStudioDisableScrollingOnEarlyMac": "True", "FFlagPerformanceStatsCollectionEnabled": "True", "FFlagStudioStopSoundPlaybackAfterRemoval": "True", "FFlagStudioAllowSoundDraggingFromToolbox": "True", "FFlagStudioRelocateSoundJob": "True", "FFlagLuaDebugProfileEnabled": "True", "FFlagRemoveSoundServiceSoundDisabledProperty": "True", "FFlagRecordInGameDeaths": "False", "FFlagStudio3DGridUseAALines": "False", "FFlagFixIsCurrentlyVisibleSurfaceGuis": "True", "FFlagSurfaceGuiObjectEnabledCheck": "True", "FStringPlaceFilter_InterpolationAwareTargetTime": "True;249779150;333368740;444708274;64542766;248207867;171391948;360589910;388599755;163865146;127243303;162537373;6597705;332248116;348681325;196235086;13822889;189707", "DFFlagUseR15Character3": "True", "DFFlagAllowCustomR15Character": "True", "DFFlagFixDoubleJointR15Character": "True", "DFFlagFixR15SphereHead": "False", "DFFlagUseR15SwimFreestyle": "True", "DFFlagFixBodyColorsR15": "True", "DFFlagPlayerDescendantsDeleteOnDisconnectOff": "True", "DFFlagSpringConstraintInGameAdornFixEnabled": "True", "DFFlagDontPrintMalformedUrls": "True", "DFFlagUseMultiFormatCharacterAppearanceLoading": "True", "FFlagStudioFlycamAppBridgeFix": "True", "FFlagAllowCopyUnArchivableObjects": "True", "FFlagStudioReduceTeamCreateStuttering": "True", "DFFlagPGSSolverUsesIslandizableCode": "True", "DFFlagResetScreenGuiEnabled": "True", "FFlagGraphicsD3DPointOne": "True", "FFlagGraphicsNoMainDepth": "True", "FFlagCollectClientIDUpdateStatistics": "True", "FFlagStudioFixTestApis": "True", "FFlagAllowInsertConstrainedValuesAnywhere": "True", "FFlagStudioResizeMeshPartOnImport": "True", "FFlagStudioReportVitalParameters": "True", "FFlagSoundGroupsAndEffectsEnabled": "True", "FFlagSoundscapeReplicateChildren": "True", "FFlagLoadCorescriptsPlatformDefMode": "True", "FFlagEnableGetHitWhitelist": "True", "FFlagStudioUpdatePropertiesWithoutJob": "True", "FFlagOverrideTypeFunction": "True", "DFFlagEnableBindToClose": "True", "FFlagStudioFixUndeletingSoundCausesPlayback": "True", "FFlagServerSenderDontSendInterpolatedPhysics": "False", "FFlagGraphicsD3D9ComputeIndexRange": "True", "FFlagCrashOnScriptCloseFixEnabled": "True", "FFlagShowCoreGUIInExplorer": "True", "FFlagStudioUseServerConfigurer": "True", "FFlagUDim2LerpEnabled": "True", "FFlagDisableLayersForNSViewOnEarlyMac": "True", "FFlagStudioCorrectForRetinaScreensOnEarlyMac": "True", "FFlagStudioConsistentGuiInitalisation": "True", "FFlagStudioSanitizeInstancesOnLoad": "True", "FFlagStudioOnlyUpdateTeamTestActionsIfChanged": "True", "FFlagChatServiceReplicates": "True", "DFFlagICMPPingHundrethsPercentage": "100", "DFFlagUsePasiveOnlyForBind": "False", "DFFlagFavorIPV4Connections": "False", "DFFlagUsegetFamilyandMapAddress": "False", "FFlagBetterPlaceLauncherStatusHandling": "True", "FStringPlaceFilter_NewLayoutAndConstraintsEnabled": "True;534842009;20213796;379132413;485971234;515782100;248207867;360699282;498699944;540764930;534808604;520456996;552894983;551169796;560164377;599021441;609763195;609918169;599392478;614429353;337448601;615210477;606827239;19481228;19827397;26953764;561540866;20397851;626302497;402593749;589006000;461274216;129419469;478459751;460710135;464914388;481987774;610775332;567211827;636396993", "FFlagInformClientInsertFiltering": "True", "FStringClientInsertFilterMoreInfoUrl": "http://devforum.roblox.com/t/coming-changes-to-insert-service/30327", "FFlagSoundChannelOnAncestorChangedUseGameLaunchIntent": "True", "DFFlagAllowResetButtonCustomization": "True", "FFlagTattletaleFixTextValue": "True", "DFIntInfluxTattletaleInstancePathMaxLength": "200", "DFFlagFixRetriesExhaustedHandling": "True", "DFFlagBetterGetPlayerPlaceInstanceError": "True", "DFFlagCharacterScriptsLoadingRefactor": "True", "FFlagStudioPropertyWidgetRemoveUpdateEvents": "True", "FFlagStudioUserNotificationIgnoreSequenceNumber": "True", "FFlagStudioOnlyOneToolboxPreviewAtATime": "True", "FFlagStudioFixPauseDuringLoad": "True", "DFFlagStudioUseNewActiveToolEffect": "True", "FFlagGraphicsD3D11PickAdapter": "True", "FFlagChatFilterWorksLocally": "True", "FFlagFilterMessageWithCallbackNoTryCatch": "True", "FStringPlaceFilter_SetPhysicsToLastRealStateWhenBecomingOwner": "True;13822889;189707", "FFlagMetaliOS": "True", "FFlagUseNewAppBridgeIOS": "True", "FFlagTextBoundRespectTextScaled": "True", "FFlagRenderFastResolve": "True", "DFFlagLoadingGuiTeleportCrashFix": "True", "FFlagPluginSaveSelection": "True", "FFlagHandleSoundPreviewWidgetWithNoSelectedSound": "True", "FFlagDontSwallowInputForStudioShortcuts": "True", "FFlagStudioFireStickyMouseCommandChangedOnly": "True", "FFlagStudioDisableEditingCurrentEditor": "True", "FFlagFixCorruptionInLogFiles": "True", "FFlagStudioLockScriptsWithoutBlocking": "True", "FFlagSetPhysicsToLastRealStateWhenBecomingOwner": "True", "FFlagInterpolationAwareTargetTime": "True", "DFFlagServerSenderDontSendInterpolatedPhysics": "True", "FFlagSyncRenderingAndPhysicsInterpolation": "True", "DFIntTargetTimeDelayFacctorTenths": "20", "FFlagNewIncomingPhysicsManagement": "True", "DFFlagGetAssetIdsFromPackageAPI": "True", "DFFlagGoodbyeChoiceActiveProperty": "True", "FFlagAllowResizeRenderBufferiOS": "True", "FIntEnableAvatarEditoriOS": "100", "FIntEnableAvatarEditorAndroid": "1", "FIntAvatarEditorAndroidRollout": "1", "DFFlagFixScaledR15Physics": "True", "DFFlagScaleR15Character": "True" } ) -}) +router.get( + [ + "/Setting/QuietGet/ClientAppSettings", + "//Setting/QuietGet/ClientSharedSettings", + "/Setting/QuietGet/ClientSharedSettings", + "/Setting/QuietGet/RCCService", + "/Setting/QuietGet/AndroidAppSettings", + "/Setting/QuietGet/iOSAppSettings", + "/Setting/QuietGet/StudioAppSettings", + ], + (req, res) => { + return res.json({ + FFlagNewPlayerListScript: "True", + FFlagCoreScriptShowVisibleAgeV2: "False", + DFFlagFindFirstChildOfClassEnabled: "True", + FFlagStudioCSGAssets: "True", + FFlagCSGLoadBlocking: "False", + FFlagCSGPhysicsLevelOfDetailEnabled: "True", + FFlagFormFactorDeprecated: "False", + FFlagFontSmoothScalling: "True", + FFlagAlternateFontKerning: "True", + FFlagFontSourceSans: "True", + FFlagRenderNewFonts: "True", + FFlagDMFeatherweightEnabled: "True", + FFlagRenderFeatherweightEnabled: "True", + FFlagRenderFeatherweightUseGeometryGenerator: "True", + FFlagScaleExplosionLifetime: "True", + FFlagEnableNonleathalExplosions: "True", + DFFlagHttpCurlHandle301: "True", + FFlagSearchToolboxByDataModelSearchString: "True", + FFlagClientABTestingEnabled: "False", + FFlagStudioSmoothTerrainForNewPlaces: "True", + FFlagUsePGSSolver: "True", + FFlagSimplifyKeyboardInputPath: "False", + FFlagNewInGameDevConsole: "True", + FFlagTextFieldUTF8: "True", + FFlagTypesettersReleaseResources: "True", + FFlagLuaBasedBubbleChat: "True", + FFlagUseCanManageApiToDetermineConsoleAccess: "False", + FFlagConsoleCodeExecutionEnabled: "True", + DFFlagCustomEmitterInstanceEnabled: "True", + FFlagCustomEmitterRenderEnabled: "True", + FFlagCustomEmitterLuaTypesEnabled: "True", + FFlagStudioInSyncWebKitAuthentication: "False", + FFlagGlowEnabled: "True", + FFlagUseNewAppBridgeInputWindows: "False", + DFFlagUseNewFullscreenLogic: "True", + FFlagRenderMaterialsOnMobile: "True", + FFlagMaterialPropertiesEnabled: "True", + FFlagSurfaceLightEnabled: "True", + FFlagStudioPropertyErrorOutput: "True", + DFFlagUseR15Character: "True", + DFFlagEnableHipHeight: "True", + DFFlagUseStarterPlayerCharacter: "True", + DFFlagFilteringEnabledDialogFix: "True", + FFlagCSGMeshColorToolsEnabled: "True", + FFlagStudioEnableGameAnimationsTab: "True", + DFFlagScriptExecutionContextApi: "True", + FFlagStudioVariableIntellesense: "True", + FFlagLuaDebugger: "True", + FFlagUseUserListMenu: "True", + FFlagEnableSetCoreTopbarEnabled: "True", + FFlagPlayerDropDownEnabled: "True", + FFlagSetCoreMoveChat: "True", + FFlagSetCoreDisableChatBar: "True", + FFlagGraphicsGL3: "True", + DFFlagUserUseLuaVehicleController: "True", + FFlagTextBoxUnicodeAware: "True", + FFlagLetLegacyScriptsWork: "True", + FFlagDep: "True", + DFFlagDisableBackendInsertConnection: "True", + FFlagPhysicsAnalyzerEnabled: "True", + DFFlagGetGroupsAsyncEnabled: "True", + DFFlagGetFocusedTextBoxEnabled: "True", + DFFlagTextBoxIsFocusedEnabled: "True", + DFFlagGetCharacterAppearanceEnabled: "True", + FFlagNewLayoutAndConstraintsEnabled: "True", + GoogleAnalyticsAccountPropertyID: "UA-43420590-3", + GoogleAnalyticsAccountPropertyIDPlayer: "UA-43420590-14", + AllowVideoPreRoll: "True", + FLogAsserts: "0", + FLogCloseDataModel: "3", + CaptureQTStudioCountersEnabled: "True", + CaptureMFCStudioCountersEnabled: "True", + CaptureCountersIntervalInMinutes: "5", + FLogServiceVectorResize: "4", + FLogServiceCreation: "4", + AxisAdornmentGrabSize: "12", + FFlagProcessAllPacketsPerStep: "True", + FFlagUS14116: "True", + FFlagBlockBlockNarrowPhaseRefactor: "True", + FFlagEnableRubberBandSelection: "True", + FFlagQtStudioScreenshotEnabled: "True", + FFlagFixNoPhysicsGlitchWithGyro: "True", + FLogFullRenderObjects: "0", + PublishedProjectsPageHeight: "535", + PublishedProjectsPageUrl: "/ide/publish", + StartPageUrl: "/ide/welcome", + FFlagOpenNewWindowsInDefaultBrowser: "True", + FFlagOnScreenProfiler: "True", + FFlagInitializeNewPlace: "True", + PrizeAssetIDs: "", + PrizeAwarderURL: "/ostara/boon", + MinNumberScriptExecutionsToGetPrize: "500", + FFlagDebugCrashEnabled: "False", + FLogHangDetection: "3", + FFlagCharAnimationStats: "False", + FFlagRenderOpenGLForcePOTTextures: "True", + FFlagUseNewCameraZoomPath: "True", + FFlagQTStudioPublishFailure: "True", + ExcludeContactWithInteriorTerrainMinusYFace: "True", + FFlagFixUphillClimb: "True", + FFlagUseAveragedFloorHeight: "True", + PublishedProjectsPageWidth: "950", + FFlagRenderFastClusterEverywhere: "True", + FLogPlayerShutdownLuaTimeoutSeconds: "1", + FFlagQtFixToolDragging: "True", + FFlagSelectPartOnUndoRedo: "True", + FFlagStatusBarProgress: "True", + FFlagStudioCheckForUpgrade: "True", + FFlagStudioInsertModelCounterEnabled: "True", + FFlagStudioAuthenticationFailureCounterEnabled: "True", + FFlagRenderCheckTextureContentProvider: "True", + FFlagRenderLightGridEnabled: "True", + FFlagStudioLightGridAPIVisible: "True", + FFlagBetterSleepingJobErrorComputation: "True", + FLogDXVideoMemory: "4", + FFlagRenderNoLegacy: "True", + FFlagStudioLightGridOnForNewPlaces: "True", + FFlagPhysicsSkipRedundantJoinAll: "True", + FFlagTerrainOptimizedLoad: "True", + FFlagTerrainOptimizedStorage: "True", + FFlagTerrainOptimizedCHS: "True", + FFlagRenderGLES2: "True", + FFlagStudioMacAddressValidationEnabled: "True", + FFlagDoNotPassSunkEventsToPlayerMouse: "True", + FFlagQtAutoSave: "True", + FFlagRenderLoopExplicit: "True", + FFlagStudioUseBinaryFormatForPlay: "True", + FFlagPhysicsRemoveWorldAssemble_US16512: "True", + FFlagNativeSafeChatRendering: "True", + FFlagRenderNewMegaCluster: "True", + FFlagAutoJumpForTouchDevices: "True", + FLogOutlineBrightnessMin: "50", + FLogOutlineBrightnessMax: "160", + FLogOutlineThickness: "40", + FFlagDE5511FixEnabled: "True", + FFlagDE4423Fixed: "True", + FFlagSymmetricContact: "True", + FFlagLocalMD5: "True", + FFlagStudioCookieParsingDisabled: "False", + FFlagLastWakeTimeSleepingJobError: "True", + FFlagPhysicsAllowAutoJointsWithSmallParts_DE6056: "True", + FFlagPhysicsLockGroupDraggerHitPointOntoSurface_DE6174: "True", + FFlagOutlineControlEnabled: "True", + FFlagAllowCommentedScriptSigs: "True", + FFlagDataModelUseBinaryFormatForSave: "True", + FFlagStudioUseBinaryFormatForSave: "True", + FFlagDebugAdornableCrash: "True", + FFlagOverlayDataModelEnabled: "True", + DFFlagFixInstanceParentDesyncBug: "True", + FFlagPromoteAssemblyModifications: "False", + DFFlagCreateHumanoidRootNode: "True", + FFlagStudioCookieDesegregation: "True", + FFlagResponsiveJump: "True", + FFlagGoogleAnalyticsTrackingEnabled: "True", + FFlagNoCollideLadderFilter: "True", + FFlagFlexibleTipping: "True", + FFlagUseStrongerBalancer: "True", + FFlagClampControllerVelocityMag: "True", + DFFlagUseSaferChatMetadataLoading: "True", + FFlagSinkActiveGuiObjectMouseEvents: "False", + FLogLuaBridge: "2", + DFFlagPromoteAssemblyModifications: "True", + FFlagDeferredContacts: "True", + FFlagFRMUse60FPSLockstepTable: "True", + FFlagFRMAdjustForMultiCore: "True", + FFlagPhysics60HZ: "True", + FFlagQtRightClickContextMenu: "True", + FFlagUseTopmostSettingToBringWindowToFront: "True", + FFlagNewLightAPI: "True", + FFlagRenderLightGridShadows: "True", + FFlagRenderLightGridShadowsSmooth: "True", + DFFlagSanitizeKeyframeUrl: "True", + DFFlagDisableGetKeyframeSequence: "False", + FFlagCreateServerScriptServiceInStudio: "True", + FFlagCreateServerStorageInStudio: "True", + FFlagCreateReplicatedStorageInStudio: "True", + FFlagFilterEmoteChat: "True", + DFFlagUseCharacterRootforCameraTarget: "True", + FFlagImageRectEnabled: "True", + FFlagNewWaterMaterialEnable: "True", + DFFlagUserHttpAPIEnabled: "True", + DFIntUserHttpAccessUserId0: "0", + FFlagUserHttpAPIVisible: "True", + FFlagCameraChangeHistory: "True", + FFlagDE4640Fixed: "True", + FFlagShowStreamingEnabledProp: "True", + FFlagOptimizedDragger: "True", + FFlagRenderNewMaterials: "True", + FFlagRenderAnisotropy: "True", + FFlagStudioInitializeViewOnPaint: "True", + DFFlagPartsStreamingEnabled: "True", + FFlagStudioLuaDebugger: "True", + FFlagStudioLocalSpaceDragger: "True", + FFlagGuiRotationEnabled: "True", + FFlagDataStoreEnabled: "True", + DFFlagDisableTeleportConfirmation: "True", + DFFlagAllowTeleportFromServer: "True", + DFFlagNonBlockingTeleport: "True", + FFlagD3D9CrashOnError: "False", + FFlagRibbonBarEnabled: "True", + SFFlagInfiniteTerrain: "True", + FFlagStudioScriptBlockAutocomplete: "True", + FFlagRenderFixAnchoredLag: "True", + DFFlagAllowAllUsersToUseHttpService: "True", + GoogleAnalyticsAccountPropertyIDClient: "", + FFlagSurfaceGuiVisible: "True", + FFlagStudioIntellesenseEnabled: "True", + FFlagAsyncPostMachineInfo: "True", + FFlagModuleScriptsVisible: "True", + FFlagModelPluginsEnabled: "True", + FFlagGetUserIdFromPluginEnabled: "True", + FFlagStudioPluginUIActionEnabled: "True", + DFFlagRemoveAdornFromBucketInDtor: "True", + FFlagRapidJSONEnabled: "True", + DFFlagDE6959Fixed: "True", + DFFlagScopedMutexOnJSONParser: "True", + FFlagSupressNavOnTextBoxFocus: "True", + DFFlagExplicitPostContentType: "True", + DFFlagAddPlaceIdToAnimationRequests: "True", + FFlagCreatePlaceEnabled: "True", + DFFlagClientAdditionalPOSTHeaders: "True", + FFlagEnableAnimationExport: "True", + DFFlagAnimationAllowProdUrls: "True", + FFlagGetUserIDFromPluginEnabled: "True", + FFlagStudioContextualHelpEnabled: "True", + FFlagLogServiceEnabled: "True", + FFlagQtPlaySoloOptimization: "True", + FFlagStudioBuildGui: "True", + DFFlagListenForZVectorChanges: "True", + DFFlagUserInputServiceProcessOnRender: "True", + FFlagDE7421Fixed: "True", + FFlagStudioExplorerActionsEnabledInScriptView: "True", + FFlagHumanoidNetworkOptEnabled: "False", + DFFlagEnableNPCServerAnimation: "True", + DFFlagDataStoreUseUForGlobalDataStore: "True", + DFFlagDataStoreAllowedForEveryone: "True", + DFFlagBadTypeOnConnectErrorEnabled: "True", + FFlagStudioRemoveUpdateUIThread: "True", + FFlagPhysicsSkipUnnecessaryContactCreation: "False", + FFlagUseNewHumanoidCache: "True", + FFlagSecureReceiptsBackendEnabled: "True", + FFlagOrderedDataStoreEnabled: "True", + FFlagStudioLuaDebuggerGA: "True", + FFlagNPSSetScriptDocsReadOnly: "True", + FFlagRDBGHashStringComparison: "True", + FFlagStudioDebuggerVisitDescendants: "True", + FFlagDeprecateScriptInfoService: "True", + FFlagIntellisenseScriptContextDatamodelSearchingEnabled: "True", + FFlagSecureReceiptsFrontendEnabled: "True", + DFFlagCreatePlaceEnabledForEveryone: "True", + FFlagCreatePlaceInPlayerInventoryEnabled: "True", + DFFlagAddRequestIdToDeveloperProductPurchases: "True", + DFFlagUseYPCallInsteadOfPCallEnabled: "True", + FFlagStudioMouseOffsetFixEnabled: "True", + DFFlagPlaceValidation: "True", + FFlagReconstructAssetUrl: "True", + FFlagUseNewSoundEngine: "True", + FIntMinMillisecondLengthForLongSoundChannel: "5000", + FFlagStudioHideInsertedServices: "True", + FFlagStudioAlwaysSetActionEnabledState: "True", + FFlagRenderNew: "True", + FIntRenderNewPercentWin: "100", + FIntRenderNewPercentMac: "100", + FLogGraphics: "6", + DFFlagDisallowHopperServerScriptReplication: "True", + FFlagInterpolationFix: "False", + FFlagHeartbeatAt60Hz: "False", + DFFlagFixProcessReceiptValueTypes: "True", + DFFlagPhysicsSkipUnnecessaryContactCreation: "True", + FFlagStudioLiveCoding: "True", + FFlagPlayerHumanoidStep60Hz: "True", + DFFlagCrispFilteringEnabled: "False", + SFFlagProtocolSynchronization: "True", + FFlagUserInputServicePipelineStudio: "True", + FFlagUserInputServicePipelineWindowsClient: "True", + FFlagUserInputServicePipelineMacClient: "True", + FFlagStudioKeyboardMouseConfig: "True", + DFFlagLogServiceEnabled: "True", + DFFlagLoadAnimationsThroughInsertService: "True", + FFlagFRMFogEnabled: "True", + FLogBrowserActivity: "3", + DFFlagPhysicsPacketAlwaysUseCurrentTime: "True", + FFlagFixedStudioRotateTool: "True", + FFlagRibbonBarEnabledGA: "True", + FFlagRenderSafeChat: "False", + DFFlagPhysicsAllowSimRadiusToDecreaseToOne: "True", + DFFlagPhysicsAggressiveSimRadiusReduction: "True", + DFFlagLuaYieldErrorNoResumeEnabled: "True", + DFFlagEnableJointCache: "False", + DFFlagOnCloseTimeoutEnabled: "True", + FFlagStudioQuickInsertEnabled: "True", + FFlagStudioPropertiesRespectCollisionToggle: "True", + FFlagTweenServiceUsesRenderStep: "True", + FFlagUseNewSoundEngine3dFix: "True", + FFlagDebugUseDefaultGlobalSettings: "True", + FFlagStudioMiddleMouseTrackCamera: "False", + FFlagTurnOffiOSNativeControls: "True", + DFFlagUseNewHumanoidHealthGui: "True", + DFFlagLoggingConsoleEnabled: "True", + DFFlagAllowModuleLoadingFromAssetId: "True", + FFlagStudioZoomExtentsExplorerFixEnabled: "True", + FFlagLuaDebuggerBreakOnError: "True", + FFlagRetentionTrackingEnabled: "True", + FFlagShowAlmostAllItemsInExplorer: "True", + FFlagStudioFindInAllScriptsEnabled: "True", + FFlagImprovedNameOcclusion: "True", + FFlagHumanoidMoveToDefaultValueEnabled: "True", + FFlagEnableDisplayDistances: "True", + FFlagUseMinMaxZoomDistance: "True", + SFFlagAllowPhysicsPacketCompression: "False", + FFlagStudioOneClickColorPickerEnabled: "True", + DFFlagHumanoidMoveToDefaultValueEnabled: "True", + VideoPreRollWaitTimeSeconds: "45", + FFlagBalancingRateLimit: "True", + FFlagLadderCheckRate: "True", + FFlagStateSpecificAutoJump: "True", + SFFlagOneWaySimRadiusReplication: "True", + DFFlagApiDictionaryCompression: "True", + SFFlagPathBasedPartMovement: "True", + FFlagEnsureInputIsCorrectState: "False", + DFFlagLuaLoadStringStrictSecurity: "True", + DFFlagCrossPacketCompression: "True", + FFlagWorkspaceLoadStringEnabledHidden: "True", + FFlagStudioPasteAsSiblingEnabled: "True", + FFlagStudioDuplicateActionEnabled: "True", + FFlagPreventInterpolationOnCFrameChange: "True", + FLogNetworkPacketsReceive: "5", + FFlagPlayPauseFix: "True", + DFFlagCrashOnNetworkPacketError: "False", + FFlagHumanoidStateInterfaces: "True", + FFlagRenderDownloadAssets: "True", + FFlagBreakOnErrorConfirmationDialog: "True", + FFlagStudioAnalyticsEnabled: "True", + FFlagAutoRotateFlag: "True", + DFFlagUseImprovedLadderClimb: "True", + FFlagUseCameraOffset: "True", + FFlagRenderBlobShadows: "True", + DFFlagWebParserDisableInstances: "False", + FFlagStudioNewWiki: "True", + DFFlagLogPacketErrorDetails: "False", + FFlagLimitHorizontalDragForce: "True", + DFFlagCreateSeatWeldOnServer: "True", + FFlagGraphicsUseRetina: "True", + FFlagDynamicEnvmapEnabled: "True", + DFFlagDeferredTouchReplication: "True", + DFFlagCreatePlayerGuiEarlier: "True", + DFFlagProjectileOwnershipOptimization: "True", + DFFlagLoadSourceForCoreScriptsBeforeInserting: "False", + GoogleAnalyticsLoadStudio: "1", + DFFlagTaskSchedulerFindJobOpt: "True", + SFFlagPreventInterpolationOnCFrameChange: "True", + DFIntNumPhysicsPacketsPerStep: "2", + DFFlagDataStoreUrlEncodingEnabled: "True", + FFlagShowWebPlaceNameOnTabWhenOpeningFromWeb: "True", + DFFlagTrackTimesScriptLoadedFromLinkedSource: "True", + FFlagToggleDevConsoleThroughChatCommandEnabled: "True", + FFlagEnableFullMonitorsResolution: "True", + DFFlagAlwaysUseHumanoidMass: "True", + DFFlagUseStrongerGroundControl: "True", + DFFlagCorrectlyReportSpeedOnRunStart: "True", + FFlagLuaDebuggerImprovedToolTip: "True", + FFlagLuaDebuggerPopulateFuncName: "True", + FFlagLuaDebuggerNewCodeFlow: "True", + DFFlagValidateCharacterAppearanceUrl: "false", + FFlagStudioQuickAccessCustomization: "True", + DFFlagTaskSchedulerUpdateJobPriorityOnWake: "True", + DFFlagTaskSchedulerNotUpdateErrorOnPreStep: "True", + FFlagWikiSelectionSearch: "True", + DFIntTaskSchedularBatchErrorCalcFPS: "1200", + FFlagSuppressNavOnTextBoxFocus: "False", + FFlagEnabledMouseIconStack: "True", + DFFlagFastClone: "True", + DFFlagLuaNoTailCalls: "True", + DFFlagFilterStreamingProps: "True", + DFFlagNetworkOwnerOptEnabled: "True", + DFFlagPathfindingEnabled: "True", + FFlagEnableiOSSettingsLeave: "True", + FFlagUseFollowCamera: "True", + FFlagDefaultToFollowCameraOnTouch: "True", + DFFlagAllowMoveToInMouseLookMove: "True", + DFFlagAllowHumanoidDecalTransparency: "True", + DFFlagSupportCsrfHeaders: "True", + DFFlagConfigureInsertServiceFromSettings: "True", + FFlagPathfindingClientComputeEnabled: "True", + DFFlagLuaResumeSupportsCeeCalls: "True", + DFFlagPhysicsSenderErrorCalcOpt: "True", + DFFlagClearPlayerReceivingServerLogsOnLeave: "True", + DFFlagConsoleCodeExecutionEnabled: "True", + DFFlagCSGDictionaryReplication: "True", + FFlagCSGToolsEnabled: "True", + FFlagCSGDictionaryServiceEnabled: "True", + FFlagCSGMeshRenderEnable: "True", + FFlagCSGChangeHistory: "True", + FFlagCSGMeshColorEnable: "True", + FFlagCSGScaleEnabled: "True", + FFlagCylinderUsesConstantTessellation: "True", + FFlagStudioDraggersScaleFixes: "True", + FFlagCSGDecalsEnabled: "True", + FFlagCSGMigrateChildData: "True", + SFFlagBinaryStringReplicationFix: "True", + FFlagHummanoidScaleEnable: "True", + FFlagStudioDataModelIsStudioFix: "True", + DFFlagWebParserEnforceASCIIEnabled: "True", + DFFlagScriptDefaultSourceIsEmpty: "True", + FFlagFixCaptureFocusInput: "True", + FFlagFireUserInputServiceEventsAfterDMEvents: "True", + FFlagVectorErrorOnNilArithmetic: "True", + DFFlagUseImageColor: "True", + FFlagStopNoPhysicsStrafe: "True", + DFFlagDebugLogNetworkErrorToDB: "False", + FFlagLowQMaterialsEnable: "True", + FFLagEnableFullMonitorsResolution: "True", + FFlagStudioChildProcessCleanEnabled: "True", + DFFlagAllowFullModelsWhenLoadingModules: "True", + DFFlagRealWinInetHttpCacheBypassingEnabled: "True", + FFlagNewUniverseInfoEndpointEnabled: "True", + FFlagGameExplorerEnabled: "True", + FFlagStudioUseBinaryFormatForModelPublish: "True", + FFlagGraphicsFeatureLvlStatsEnable: "True", + FFlagStudioEnableWebKitPlugins: "True", + DFFlagSendHumanoidTouchedSignal: "True", + DFFlagReduceHumanoidBounce: "True", + DFFlagUseNewSounds: "True", + FFlagFixHumanoidRootPartCollision: "True", + FFlagEnableAndroidMenuLeave: "True", + FFlagOnlyProcessGestureEventsWhenSunk: "True", + FFlagAdServiceReportImpressions: "True", + FFlagStudioUseExtendedHTTPTimeout: "True", + FFlagStudioSeparateActionByActivationMethod: "False", + DFFlagPhysicsSenderThrottleBasedOnBufferHealth: "True", + DFFlagGetGroupInfoEnabled: "True", + DFFlagGetGroupRelationsEnabled: "True", + SFFlagTopRepContSync: "True", + FFlagStudioUseBinaryFormatForModelSave: "True", + EnableFullMonitorsResolution: "True", + DFFlagRenderSteppedServerExceptionEnabled: "True", + FFlagUseWindowSizeFromGameSettings: "True", + DFFlagCheckStudioApiAccess: "True", + FFlagGameExplorerPublishEnabled: "True", + DFFlagKeepXmlIdsBetweenLoads: "True", + DFFlagReadXmlCDataEnabled: "True", + FFlagStudioRemoveToolSounds: "True", + FFlagStudioOneStudGridDefault: "True", + FFlagStudioPartSymmetricByDefault: "True", + FFlagStudioIncreasedBaseplateSize: "True", + FFlagSkipSilentAudioOps: "True", + SFFlagGuid64Bit: "False", + FIntValidateLauncherPercent: "0", + FFlagCSGDataLossFixEnabled: "True", + DFStringRobloxAnalyticsURL: "https://www.mete0r.xyz/", + DFFlagRobloxAnalyticsTrackingEnabled: "False", + FFlagStudioOpenLastSaved: "False", + FFlagStudioShowTutorialsByDefault: "True", + FFlagStudioForceToolboxSize: "True", + FFlagStudioExplorerDisabledByDefault: "True", + FFlagStudioDefaultWidgetSizeChangesEnabled: "True", + FFlagStudioUseScriptAnalyzer: "True", + FFlagNoClimbPeople: "True", + DFFlagAnimationFormatAssetId: "True", + FFlagGetCorrectScreenResolutionFaster: "True", + DFFlagFixTouchEndedReporting: "False", + FFlagStudioTeleportPlaySolo: "True", + FFlagStudioDE7928FixEnabled: "True", + FFlagDE8768FixEnabled: "True", + FFlagStudioDE9108FixEnabled: "True", + FFlagStudioPlaySoloMapDebuggerData: "True", + FFlagLuaDebuggerCloneDebugger: "True", + FFlagRenderLightgridInPerformEnable: "True", + SFFlagStateBasedAnimationReplication: "True", + FFlagVolumeControlInGameEnabled: "True", + FFlagGameConfigurerUseStatsService: "True", + FFlagStudioUseHttpAuthentication: "True", + FFlagDetectTemplatesWhenSettingUpGameExplorerEnabled: "True", + FFlagEntityNameEditingEnabled: "True", + FFlagNewCreatePlaceFlowEnabled: "True", + FFlagFakePlayableDevices: "False", + FFlagMutePreRollSoundService: "True", + DFFlagBodyMoverParentingFix: "True", + DFFlagBroadcastServerOnAllInterfaces: "True", + HttpUseCurlPercentageWinClient: "100", + HttpUseCurlPercentageMacClient: "100", + HttpUseCurlPercentageWinStudio: "100", + HttpUseCurlPercentageMacStudio: "100", + SFFlagReplicatedFirstEnabled: "True", + DFFlagCSGShrinkForMargin: "True", + FFlagPhysicsBulletConnectorPointRecalc: "True", + DFIntBulletContactBreakThresholdPercent: "200", + DFIntBulletContactBreakOrthogonalThresholdPercent: "200", + FFlagPhysicsBulletConnectorMatching: "True", + FFlagPhysicsBulletUseProximityMatching: "False", + FFlagPhysicsCSGUsesBullet: "True", + DFFlagCSGPhysicsDeserializeRefactor: "True", + FFlagWedgeEnableDecalOnTop: "True", + FFlagFrustumTestGUI: "True", + FFlagFeatureLvlsDX11BeforeDeviceCreate: "True", + FFlagStudioPasteSyncEnabled: "True", + FFlagResetMouseCursorOnToolUnequip: "True", + DFFlagUpdateCameraTarget: "True", + DFFlagFixGhostClimb: "True", + DFFlagUseStarterPlayer: "True", + FFlagStudioFindCrashFixEnabled: "True", + FFlagFixPartOffset: "True", + DFFlagLuaCloseUpvalues: "True", + FFlagRenderTextureCompositorUseBudgetForSize: "True", + FFlagAllowOutOfBoxAssets: "False", + FFlagRemoveTintingWhenActiveIsFalseOnImageButton: "True", + FFlagStudioModuleScriptDefaultContents: "True", + FFlagStudioHomeKeyChangeEnabled: "True", + FFlagStudioOpenStartPageForLogin: "True", + FFlagStudioNativeKeepSavedChanges: "True", + FFlagSerializeCurrentlyOpenPlaceWhenPublishingGame: "True", + FFlagGameNameLabelEnabled: "True", + FFlagStudioValidateBootstrapper: "True", + FFlagRakNetReadFast: "True", + DFFlagPhysicsSenderSleepingUpdate: "True", + FFlagUseShortShingles: "True", + FFlagKKTChecks: "False", + DFFlagUseApiProxyThrottling: "True", + DFFlagValidateSetCharacter: "True", + DFFlagUpdateHumanoidSimBodyInComputeForce: "True", + DFFlagNetworkPendingItemsPreserveTimestamp: "True", + FFlagStudioCSGRotationalFix: "True", + FFlagNewLoadingScreen: "True", + FFlagScrollingFrameOverridesButtonsOnTouch: "True", + DFFlagStreamLargeAudioFiles: "True", + DFFlagNewLuaChatScript: "True", + DFFlagLoopedDefaultHumanoidAnimation: "True", + FFlagSoundsRespectDelayedStop: "False", + DFFlagCSGPhysicsErrorCatchingEnabled: "True", + DFFlagFireStoppedAnimSignal: "True", + FFlagStudioFixToolboxReload: "True", + FFlagCSGDecalsV2: "True", + FFlagLocalOptimizer: "True", + DFFlagClearFailedUrlsWhenClearingCacheEnabled: "True", + DFFlagSupportNamedAssetsShortcutUrl: "True", + DFFlagUseW3CURIParser: "True", + DFFlagContentProviderHttpCaching: "True", + FFlagNoWallClimb: "False", + FFlagSmoothMouseLock: "False", + DFFlagCSGPhysicsNanPrevention: "True", + FFlagStudioDE9818FixEnabled: "True", + FFlagGameExplorerImagesEnabled: "True", + FFlagStudioInsertOrientationFix: "True", + FFlagStudioTabOrderingEnabled: "True", + FFlagFramerateDeviationDroppedReport: "True", + FFlagModuleScriptsPerVmEnabled: "False", + FFlagGameExplorerImagesInsertEnabled: "True", + FFlagTexturePropertyWidgetEnabled: "True", + FFlagReloadAllImagesOnDataReload: "True", + FFlagModuleScriptsPerVmEnabledFix2: "True", + DFFlagFixBufferZoneContainsCheck: "False", + FFlagStudioPlaceAssetFromToolbox: "True", + FFlagChannelMasterMuting: "True", + FFlagStudioUseDelayedSyntaxCheck: "True", + FFlagStudioCommandLineSaveEditText: "True", + FFlagStudioAddHelpInContextMenu: "True", + DFIntHttpCacheCleanMinFilesRequired: "10000", + DFIntHttpCacheCleanMaxFilesToKeep: "7500", + FFlagCSGVoxelizer: "True", + DFFlagCheckApiAccessInTransactionProcessing: "True", + FFlagBindPurchaseValidateCallbackInMarketplaceService: "True", + FFlagSetDataModelUniverseIdAfterPublishing: "True", + FFlagOpenScriptWorksOnModulesEnabled: "True", + FFlagStudioRibbonBarNewLayout: "True", + FFlagStudioRibbonBarLayoutFixes: "True", + FFlagStudioPlaceOnlineIndicator: "True", + FFlagRenderWangTiles: "True", + FFlagDisableBadUrl: "True", + FFlagPrimalSolverLogBarrierIP: "True", + FFlagDualSolverSimplex: "True", + FFlagPrimalSolverSimplex: "True", + FIntNumSmoothingPasses: "3", + FFlagVerifyConnection: "True", + FIntRegLambda: "1400", + FFlagScriptAnalyzerPlaceholder: "True", + FFlagCSGStripPublishedData: "True", + DFFlagRaycastReturnSurfaceNormal: "True", + FFlagMoveGameExplorerActionsIntoContextMenu: "True", + FFlagStudioAdvanceCookieExpirationBugFixEnabled: "True", + FFlagNewBackpackScript: "True", + FFlagGameNameAtTopOfExplorer: "True", + FFlagStudioActActionsAsTools: "True", + FFlagStudioInsertAtMouseClick: "True", + FFlagStopLoadingStockSounds: "True", + DFFlagFixTimePositionReplication: "True", + DFFlagHttpReportStatistics: "True", + DFFlagEnableChatTestingInStudio: "True", + DFIntHttpSendStatsEveryXSeconds: "300", + FLogStepAnimatedJoints: "5", + DFFlagLuaDisconnectFailingSlots: "False", + DFFlagEnsureSoundPosIsUpdated: "True", + DFFlagLoadStarterGearEarlier: "False", + DFFlagBlockUsersInLuaChat: "True", + FFlagRibbonPartInsertNotAllowedInModel: "True", + DFFlagUsePlayerScripts: "True", + DFFlagUserAccessUserSettings: "True", + DFFlagUseLuaCameraAndControl: "True", + DFFlagUseLuaPCInput: "True", + DFFlagFixLuaMoveDirection: "True", + DFFlagUseDecalLocalTransparencyModifier: "True", + DFFlagUseFolder: "True", + DFFlagUsePreferredSpawnInPlaySoloTeleport: "True", + DFFlagFilterAddSelectionToSameDataModel: "False", + FFlagGameExplorerAutofillImageNameFromFileName: "True", + FFlagGameExplorerBulkImageUpload: "True", + FFlagStudioAllowAudioSettings: "True", + DFFlagUsePlayerInGroupLuaChat: "True", + FFlagStudioDecalPasteFix: "True", + FFlagStudioCtrlTabDocSwitchEnabled: "True", + DFIntDraggerMaxMovePercent: "60", + FFlagUseUniverseGetInfoCallToDetermineUniverseAccess: "True", + FFlagMaxFriendsCount: "True", + DFIntPercentApiRequestsRecordGoogleAnalytics: "0", + FFlagSelectSpinlock: "True", + FFlagFastZlibPath: "True", + DFFlagWriteXmlCDataEnabled: "True", + DFFlagUseSpawnPointOrientation: "True", + DFFlagUsePlayerSpawnPoint: "True", + DFFlagCSGPhysicsRecalculateBadContactsInConnectors: "True", + FFlagStudioPartAlignmentChangeEnabled: "True", + FFlagStudioToolBoxModelDragFix: "True", + DFFlagOrder66: "False", + FFlagCloudIconFixEnabled: "True", + DFFlagFixHealthReplication: "True", + DFFlagReplicateAnimationSpeed: "True", + FFlagLuaFollowers: "True", + FFlagNewNotificationsScript: "True", + FFlagStudioSendMouseIdleToPluginMouse: "True", + DFFlagPhysicsOptimizeAssemblyHistory: "True", + DFFlagPhysicsOptimizeBallBallContact: "True", + DFFlagUseNewBubbleSkin: "True", + DFFlagUse9FrameBackgroundTransparency: "True", + DFFlagCheckForHeadHit: "False", + DFFlagUseHttpsForAllCalls: "True", + DFFlagLoadCoreModules: "True", + FFlagStudioRecentSavesEnabled: "True", + FFlagStudioToolBoxInsertUseRayTrace: "True", + FFlagInterpolationUseWightedDelay: "True", + FFlagUseInGameTopBar: "True", + FFlagNewPurchaseScript: "True", + FFlagStudioEnableGamepadSupport: "True", + FFlagStudioRemoveDuplicateParts: "True", + FFlagStudioLaunchDecalToolAfterDrag: "True", + DFFlagHumanoidFloorPVUpdateSignal: "True", + DFFlagHumanoidFloorDetectTeleport: "True", + DFFlagHumanoidFloorForceBufferZone: "False", + DFFlagHumanoidFloorManualDeltaUpdateManagment: "True", + DFFlagHumanoidFloorManualFrictionLimitation: "True", + DFFlagUpdateHumanoidNameAndHealth: "True", + DFFlagEnableHumanoidDisplayDistances: "True", + FFlagFixTouchInputEventStates: "False", + DFFlagInterpolationTimingFix: "True", + FIntRenderGBufferMinQLvl: "16", + FFlagResizeGuiOnStep: "True", + FFlagDontFireFakeMouseEventsOnUIS: "True", + FFlagCameraUseOwnViewport: "True", + FFlagGameExplorerMoveImagesUnderAssetsGroup: "True", + DFFlagNetworkFilterAllowToolWelds: "True", + DFIntHttpInfluxHundredthsPercentage: "5", + DFStringHttpInfluxURL: "https://www.mete0r.xyz/", + DFStringHttpInfluxDatabase: "main", + DFStringHttpInfluxUser: "user", + DFStringHttpInfluxPassword: "password", + FFlagStudioSpawnLocationsDefaultValues: "True", + FFlagStudioDE11536FixEnabled: "True", + FFlagStudioRibbonGroupResizeFixEnabled: "True", + FFlagGradientStep: "True", + FFlagUseNewContentProvider: "False", + SFFlagEquipToolOnClient: "True", + FFlagStartWindowMaximizedDefault: "True", + FFlagUseNewKeyboardHandling: "True", + FFlagCameraZoomNoModifier: "True", + DFFlagRemoteValidateSubscribersError: "True", + FFlagNewMenuSettingsScript: "True", + DFFlagHttpCurlSanitizeUrl: "True", + DFFlagRemoveDataModelDependenceInWaitForChild: "True", + FFlagFilterAddSelectionToSameDataModel: "True", + DFFlagUseCanManageApiToDetermineConsoleAccess: "False", + DFIntMoveInGameChatToTopPlaceId: "1", + FFlagStudioProgressIndicatorForInsertEnabled: "True", + FFlagTerrainLazyGrid: "True", + FFlagHintsRenderInUserGuiRect: "True", + FFlagCallSetFocusFromCorrectThread: "True", + FFlagFastRevert: "True", + FFlagSleepBeforeSpinlock: "True", + FFlagSparseCheckFastFail: "True", + FFlagStudioSmoothTerrainPlugin: "True", + FFlagStudioLoadPluginsLate: "True", + FFlagStudioInsertIntoStarterPack: "True", + FFlagStudioIgnoreSSLErrors: "True", + DFFlagFixJointReparentingDE11763: "True", + DFFlagPhysicsInvalidateContactCache: "True", + FFlagLuaMathNoise: "True", + FFlagArcHandlesBidirectional: "True", + FFlagChangeHistoryFixPendingChanges: "True", + DFFlagWorkspaceSkipTerrainRaycastForSurfaceGui: "True", + FFlagStudioBatchItemMapAddChild: "True", + FFlagRenderCameraFocusFix: "True", + DFFlagReplicatorWorkspaceProperties: "True", + FFlagDirectX11Enable: "True", + FFlagCheckDegenerateCases: "True", + DFFlagUseServerCoreScripts: "True", + DFFlagCorrectFloorNormal: "True", + FFlagNewBadgeServiceUrlEnabled: "True", + FFlagBubbleChatbarDocksAtTop: "True", + FFlagSmoothTerrainClient: "True", + FFlagLuaUseBuiltinEqForEnum: "True", + FFlagPlaceLauncherThreadCheckDmClosed: "True", + DFFlagAppendTrackerIdToTeleportUrl: "True", + FFlagPlayerMouseRespectGuiOffset: "True", + DFFlagReportElevatedPhysicsFPSToGA: "True", + DFFlagPreventReturnOfElevatedPhysicsFPS: "True", + FFlagStudioIgnoreMouseMoveOnIdle: "True", + FFlagStudioDraggerFixes: "True", + FLogUseLuaMemoryPool: "0", + FFlagCSGNewTriangulate: "True", + DFFlagLuaFixResumeWaiting: "True", + FFlagFRMInStudio: "True", + DFFlagFixLadderClimbSpeed: "True", + DFFlagNoWalkAnimWeld: "False", + DFFlagImprovedKick: "True", + FFlagRenderFixLightGridDirty: "True", + FFlagLoadLinkedScriptsOnDataModelLoad: "True", + FFlagFixMeshOffset: "True", + FIntLaunchInfluxHundredthsPercentage: "0", + DFIntJoinInfluxHundredthsPercentage: "100", + FFlagSmoothTerrain: "True", + FFlagNewVehicleHud: "True", + DFFlagHumanoidStandOnSeatDestroyed: "True", + DFFlagGuiBase3dReplicateColor3WithBrickColor: "True", + FFlagTaskSchedulerCyclicExecutiveStudio: "True", + DFIntElevatedPhysicsFPSReportThresholdTenths: "585", + DFIntExpireMarketPlaceServiceCacheSeconds: "60", + DFFlagEnableMarketPlaceServiceCaching: "True", + DFFlagUseNewAnalyticsApi: "True", + DFFlagSmoothTerrainDebounceUpdates: "True", + FFlagStudioAuthenticationCleanup: "True", + FFlagRenderFixGBufferLOD: "True", + FFlagStudioDraggerCrashFixEnabled: "True", + FFlagDraggerCrashFixEnabled: "True", + DFFlagEnableRapidJSONParser: "True", + DFFlagPushLuaWorldRayOriginToNearClipPlane: "True", + FFlagLoadTimeModificationTestFlag: "True", + DFFlagPhysicsFastSmoothTerrainUpdate: "True", + DFFlagSmoothTerrainPhysicsExpandPrimitiveOptimal: "True", + DFFlagFixBytesOnJoinReporting: "True", + FFlagRenderGBufferEverywhere: "False", + DFFlagSmoothTerrainPhysicsRayAabbExact: "True", + DFIntSmoothTerrainPhysicsRayAabbSlop: "1", + DFIntMaxClusterKBPerSecond: "300", + FLogLuaAssert: "0", + FFlagSmoothTerrainCountCellVolume: "True", + DFFlagSmoothTerrainWorldToCellUseDiagonals: "True", + DFFlagFireSelectionChangeOncePerChange: "True", + FIntLuaAssertCrash: "0", + FFlagRenderFixCameraFocus: "False", + DFFlagCSGPhysicsSphereRotationIdentity: "True", + DFFlagCSGPhysicsRefreshContactsManually: "True", + FFlagStudioUndoEnabledForEdit: "True", + DFIntLuaChatFloodCheckMessages: "7", + DFIntLuaChatFloodCheckInterval: "15", + FFlagLuaChatFiltering: "True", + FFlagMobileToggleChatVisibleIcon: "True", + FFlagStudioDE9132FixEnabled: "True", + DFFlagGetUserIdEnabled: "True", + DFFlagGetUserNameEnabled: "True", + DFFlagEnableAnimationInformationAccess: "True", + DFFlagEnableAnimationTrackExtendedAPI: "True", + FFlagRequestServerStatsV2Enabled: "True", + FFlagPhysicsPreventGroupDraggerPlacementToMinus400_DE6267: "True", + FFlagSpecificUserdataTypeErrors: "True", + DFFlagScrollingFrameDraggingFix: "True", + FFlagAutodetectCPU: "True", + DFFlagSetRenderedFrameOnClumpChanged: "True", + DFFlagDisableTimeoutDuringJoin: "True", + DFFlagDesiredAltitudeDefaultInf: "True", + DFFlagRCCDE13316CrashFix: "True", + DFFlagUseStarterPlayerGA: "True", + FFlagScrollingFrameMouseUpFix: "True", + DFFlagDebrisServiceUseDestroy: "True", + DFFlagAccessUserFeatureSetting: "True", + DFFlagAllowBindActivate: "True", + FFlagEnableControllerGuiSelection: "True", + FFlagUseNewSoftwareMouseRender: "True", + DFFlagDoNotHoldTagItemsForInitialData: "True", + FFlagAltSpinlock: "True", + FFlagSpinlock: "True", + FFlagGraphicsGLReduceLatency: "True", + DFFlagMovingHumananoidWakesFloor: "True", + DFFlagSetNetworkOwnerAPIEnabled: "True", + DFFlagSetNetworkOwnerAPIEnabledV2: "True", + DFFlagGetFriendsEnabled: "True", + DFFlagGetFriendsOnlineEnabled: "True", + DFFlagUseNewTextBoxLogic: "True", + FFlagOnScreenProfilerGPU: "True", + FFlagConfigurableLineThickness: "True", + DFFlagSpawnPointEnableProperty: "True", + DFFlagConfigurableFallenPartDestroyHeight: "True", + DFFlagMiddleMouseButtonEvent: "True", + DFFlagEnablePreloadAsync: "True", + DFFlagFoldersInGUIs: "True", + DFIntAndroidInfluxHundredthsPercentage: "0", + DFFlagNoOwnershipLogicOnKernelJoint: "True", + DFFlagEnableGetPlayingAnimationTracks: "True", + FFlagCyclicExecutivePriorityJobs: "True", + DFIntMaxMissedWorldStepsRemembered: "16", + DFIntMacInfluxHundredthsPercentage: "0", + DFIntiOSInfluxHundredthsPercentage: "100", + FFlagStudioLockServiceParents: "True", + DFFlagFirePlayerAddedAndPlayerRemovingOnClient: "True", + DFFlagRecursiveWakeForBodyMovers: "True", + DFFlagEnableHumanoidSetStateEnabled: "True", + DFFlagSoundEndedEnabled: "True", + DFFlagUseIntersectingOthersForSpawnEnabled: "True", + DFFlagMoveToDontAlignToGrid: "True", + DFFlagIsBestFriendsWithReturnFriendsWith: "True", + DFFlagPlayerOwnsAssetFalseForInvalidUsers: "True", + DFFlagIsUrlCheckAssetStringLength: "True", + DFFlagEnableGoodbyeDialog: "True", + DFFlagEnableReverseAnimations: "True", + DFFlagEnableAnimationSetTimePosition: "True", + DFFlagEnableMobileAutoJumpFlag: "True", + DFFlagHttpDelaySendInfluxStats: "True", + DFFlagDisableRequestMarker: "True", + DFFlagDisableCharacterRequest: "True", + FFlagStudioCollapsibleTutorials: "True", + FStringStudioTutorialsUrl: + "http://wiki.roblox.com/index.php?title=Studio_Tutorials_Test&studiomode=true", + FStringStudioTutorialsTOCUrl: + "http://wiki.roblox.com/index.php?title=Studio_Tutorials_Landing&studiomode=true", + FFlagSandboxHash: "True", + FFlagDE14316CrashFix: "True", + FFlagDE14317CrashFix: "True", + DFFlagSetNetworkOwnerCanSetCheck: "True", + DFFlagLiveColorUpdatesCanceling: "True", + DFFlagLuaGcPerVm: "True", + FFlagStudioDeviceEmulationTouchInputFix: "True", + FFlagTaskSchedulerCyclicExecutive: "True", + DFFlagMakeWebPendingFriendRequests: "True", + DFFlagGetLastestAssetVersionEnabled: "True", + FFlagHideDeprecatedEnums: "False", + FFlagSubmitEditedColor3WhenFocusLost: "True", + DFFlagFixScriptableCameraRoll: "True", + DFFlagSeparateBulletNarrowPhaseAndMidStepUpdates: "True", + DFFlagUsePGSSolverSpringConstantScale: "True", + DFFlagToolRequiresHandleProperty: "True", + FFlagPlayerScriptsNotArchivable: "True", + DFFlagClearAllChildrenUseDestroy: "True", + DFFlagMaxPlayersEnabled: "True", + DFFlagPreferredPlayersEnabled: "True", + DFFlagLocalHumanoidSoundsEnabled: "True", + DFFlagIncreaseSoundPositionClampLimit: "True", + DFFlagNameOcculsionIgnoreTransparent: "True", + DFFlagReconstructAssetUrlNew: "True", + DFFlagAdjustFloorForce: "True", + DFFlagFixAnimationPhaseInitialization: "True", + FFlagLuaChatPhoneFontSize: "True", + DFFlagUseAssetTypeHeader: "True", + FFlagCSGUnionCatchUnknownExceptions: "False", + FIntGamePerfMonitorPercentage: "10", + FFlagSoundTypeCheck: "True", + DFFlagIncreaseScrollWheelMultiplyTime: "True", + FFlagMacRemoveUserInputJob: "True", + FFlagStudioNewFonts: "True", + DFFlagApiCapitalizationChanges: "True", + FFlagParticleCullFix: "True", + DFFlagVideoCaptureTeleportFix: "False", + DFFlagCoreGuiCustomizationApi: "True", + DFFlagCustomTeleportLoadingScreen: "True", + DFFlagCharacterAppearanceLoadedEnabled: "True", + DFFlagVIPServerOwnerIdEnabled: "True", + DFFlagEnableParticleVelocityInheritance: "True", + DFFlagEnableParticleEmissionDirection: "True", + DFFlagFixParticleDistribution: "True", + DFFlagEnableParticleNewBoundingBox: "True", + DFFlagEnableParticlePartLock: "True", + DFFlagEnableParticleBurst: "True", + DFFlagNoRunSteepSlope: "True", + DFFlagHumanoidJumpPower: "True", + FFlagControllerMenu: "True", + FFlagFlyCamOnRenderStep: "True", + DFFlagFullscreenEnabledWhileRecording: "True", + DFFlagPreProcessTextBoxEvents: "True", + DFFlagAllowHideHudShortcut: "False", + DFFlagFixBallInsideBlockCollision: "True", + FFlagPGSSolverBodyCacheLeakFix: "True", + FFlagFixCrashAtShutdown: "True", + DFFlagEquipClonedToolFix: "True", + FFlagGamepadCursorChanges: "True", + DFFlagCreatePlayerGuiLocal: "False", + DFFlagDontUseInsertServiceOnAnimLoad: "True", + DFFlagCyclicExecutiveFixNonCyclicJobRun: "True", + DFFlagPhysicsFPSTimerFix: "True", + FFlagCyclicExecutiveRenderJobRunsFirst: "True", + FFlagPhysicsCylinders: "True", + DFFlagPhysicsUseNewBulletContact: "True", + FFlagReadCoordinateFrameFast: "False", + DFFlagRayHitMaterial: "True", + DFFlagPromptPurchaseOnGuestHandledInCoreScript: "True", + DFFlagNonEmptyPcallError: "True", + DFFlagDisplayTextBoxTextWhileTypingMobile: "False", + DFFlagOverrideScollingDisabledWhenRecalulateNeeded: "True", + DFFlagFixScrollingOffSurfaceGUIs: "True", + DFFlagTextScaleDontWrapInWords: "True", + DFFlagListenPositionEnabled: "True", + DFFlagBackTabInputInStudio: "True", + DFFlagTrackLastDownGUI: "True", + DFFlagBulletFixCacheReuse: "True", + DFFlagFastFilterHumanoidParts: "False", + DFFlagProcessAcceleratorsBeforeGUINaviagtion: "True", + DFFlagImageFailedToLoadContext: "True", + DFFlagDontReorderScreenGuisWhenDescendantRemoving: "True", + DFFlagSoundFailedToLoadContext: "True", + DFFlagAnimationFailedToLoadContext: "True", + DFFlagElasticEasingUseTwoPi: "True", + SFFlagNetworkUseServerScope: "True", + DFFlagHttpZeroLatencyCaching: "True", + DFFlagPasteWithCapsLockOn: "True", + DFFlagHttpCurlDomainTrimmingWithBaseURL: "False", + DFFlagLoadFileUseRegularHttp: "True", + DFFlagReplicatorCheckBadRebinding: "True", + FFlagFastClusterThrottleUpdateWaiting: "True", + DFFlagDeserializePacketThreadEnabled: "True", + FFlagFontSizeUseLargest: "True", + DFFlagRejectHashesInLinkedSource: "True", + FFlagUpdatePrimitiveStateForceSleep: "True", + FFlagPhysicsUseKDTreeForCSG: "True", + DFFlagCSGLeftoverDataFix: "True", + FFlagStudioTutorialSeeAll: "True", + DFFlagLimitScrollWheelMaxToHalfWindowSize: "True", + FFlagGameExplorerCopyPath: "True", + DFFlagFixRotatedHorizontalScrollBar: "True", + DFFlagFixAnchoredSeatingPosition: "True", + FFlagFixSlice9Scale: "True", + DFFlagFullscreenRefocusingFix: "True", + DFFlagEnableClimbingDirection: "True", + FFlagPGSGlueJoint: "True", + FFlagTweenCallbacksDuringRenderStep: "True", + FFlagFRMFixCullFlicker: "True", + DFFlagDisableProcessPacketsJobReschedule: "True", + FFlagCSGVoxelizerPrecompute: "False", + FFlagLazyRenderingCoordinateFrame: "True", + FFlagPGSSteppingMotorFix: "True", + DFFlagLockViolationScriptCrash: "False", + DFFlagLockViolationInstanceCrash: "False", + FFlagSpheresAllowedCustom: "True", + DFFlagHumanoidCookieRecursive: "True", + FFlagRwxFailReport: "True", + FIntStudioInsertDeletionCheckTimeMS: "30000", + DFFlagClampRocketThrustOnPGS: "True", + DFFlagPGSWakePrimitivesWithBodyMoverPropertyChanges: "True", + FFlagPGSUsesConstraintBasedBodyMovers: "True", + FFlagUseNewSubdomainsInCoreScripts: "True", + DFFlagEnableShowStatsLua: "True", + FFlagSmoothTerrainPacked: "True", + DFFlagUrlReconstructToAssetGame: "False", + FFlagPGSApplyImpulsesAtMidpoints: "True", + FFlagModifyDefaultMaterialProperties: "True", + FIntPhysicalPropFriction_SMOOTH_PLASTIC_MATERIAL: "200", + FIntPhysicalPropFriction_PLASTIC_MATERIAL: "300", + FIntPhysicalPropFriction_NEON_MATERIAL: "300", + FIntPhysicalPropFriction_SNOW_MATERIAL: "300", + FIntPhysicalPropFriction_ALUMINUM_MATERIAL: "400", + FIntPhysicalPropFriction_BRICK_MATERIAL: "800", + FIntPhysicalPropFriction_CONCRETE_MATERIAL: "700", + FIntPhysicalPropFriction_DIAMONDPLATE_MATERIAL: "350", + FIntPhysicalPropFriction_SANDSTONE_MATERIAL: "500", + FIntPhysicalPropFriction_SAND_MATERIAL: "500", + FIntPhysicalPropFWeight_ICE_MATERIAL: "3000", + FIntPhysicalPropFWeight_BRICK_MATERIAL: "300", + FIntPhysicalPropFWeight_CONCRETE_MATERIAL: "300", + FIntPhysicalPropFWeight_SANDSTONE_MATERIAL: "5000", + FIntPhysicalPropFWeight_BASALT_MATERIAL: "300", + FIntPhysicalPropFWeight_SAND_MATERIAL: "5000", + FIntPhysicalPropElasticity_SAND_MATERIAL: "50", + FIntPhysicalPropElasticity_SNOW_MATERIAL: "30", + FIntPhysicalPropElasticity_MUD_MATERIAL: "70", + FIntPhysicalPropElasticity_GROUND_MATERIAL: "100", + FIntPhysicalPropElasticity_MARBLE_MATERIAL: "170", + FIntPhysicalPropElasticity_BRICK_MATERIAL: "150", + FIntPhysicalPropElasticity_PEBBLE_MATERIAL: "170", + FIntPhysicalPropElasticity_COBBLESTONE_MATERIAL: "170", + FIntPhysicalPropElasticity_ROCK_MATERIAL: "170", + FIntPhysicalPropElasticity_SANDSTONE_MATERIAL: "150", + FIntPhysicalPropElasticity_BASALT_MATERIAL: "150", + FIntPhysicalPropElasticity_CRACKED_LAVA_MATERIAL: "150", + FIntPhysicalPropElasticity_FABRIC_MATERIAL: "50", + FIntPhysicalPropElasticity_WOOD_MATERIAL: "200", + FIntPhysicalPropElasticity_WOODPLANKS_MATERIAL: "200", + FIntPhysicalPropElasticity_ICE_MATERIAL: "150", + FIntPhysicalPropElasticity_GLACIER_MATERIAL: "150", + FIntPhysicalPropElasticity_RUST_MATERIAL: "200", + FIntPhysicalPropElasticity_DIAMONDPLATE_MATERIAL: "250", + FIntPhysicalPropElasticity_ALUMINUM_MATERIAL: "250", + FIntPhysicalPropElasticity_METAL_MATERIAL: "250", + FIntPhysicalPropElasticity_GRASS_MATERIAL: "100", + DFFlagFixSeatingWhileSitting: "True", + FFlagPGSSolverDefaultOnNewPlaces: "True", + FFlagPGSVariablePenetrationMargin: "False", + FIntPGSPentrationMarginMax: "50000", + FFlagStudioHideMouseCoursorOnCommand: "True", + SFFlagNewPhysicalPropertiesForcedOnAll: "True", + SFFlagMaterialPropertiesNewIsDefault: "True", + DFFlagMaterialPropertiesEnabled: "True", + FFlagWaterParams: "True", + FFlagSpatialHashMoreRoots: "True", + FFlagSkipAdornIfWorldIsNull: "True", + DFStringWorkspaceMessageLink: "http://discord.gg/4uN3tKX9v5", + DFStringWorkspaceMessageText: + "Click here to join our Discord server!", + DFIntStudioWorkspaceNotificationLevel: "0", + DFFlagNetworkOwnershipRuleReplicates: "True", + DFFlagSmoothTerrainWriteVoxelsOccupancyFix: "True", + DFFlagCloudEditByPassCheckForServer: "True", + DFFlagDraggerUsesNewPartOnDuplicate: "True", + DFFlagRestoreTransparencyOnToolChange: "False", + FFlagEnableLuaFollowers: "False", + DFFlagUserServerFollowers: "True", + FFlagNetworkReplicateTerrainProperties: "True", + FFlagAllowInsertFreeModels: "True", + FFlagInsertUnderFolder: "True", + DFFlagPGSWakeOtherAssemblyForJoints: "True", + FFlagStudioPropertySliderEnabled: "True", + DFFlagSetNetworkOwnerFixAnchoring: "True", + FFlagFixBulletGJKOptimization: "True", + FFlagOSXUseSDL: "False", + DFFlagPhysicalPropMassCalcOnJoin: "False", + DFFlagBrickColorParseNonDeprecatedMatchEnabled: "True", + FFlagWindowsUseSDL: "False", + FFlagPhysicsOptimizeSendClumpChanged: "True", + DFFlagHumanoidFeetIsPlastic: "True", + DFFlagUseTerrainCustomPhysicalProperties: "True", + DFFlagFormFactorDeprecated: "False", + FFlagPGSVariablePenetrationMarginFix: "True", + DFIntDataStoreMaxValueSize: "262144", + DFFlagFixShapeChangeBug: "True", + FFlagScriptAnalyzerFixLocalScope: "True", + FFlagRenderVRBBGUI: "True", + FFlagRenderVR: "True", + DFFlagNetworkFixJoinDataItemOrder: "True", + FFlagStudioImproveModelDragFidelity: "True", + FFlagStudioOrthonormalizeSafeRotate: "True", + FFlagMacInferredCrashReporting: "True", + FFlagWindowsInferredCrashReporting: "True", + FFlagCloudEditDoNotLoadCoreScripts: "True", + FFlagStudioEmbeddedFindDialogEnabled: "True", + FFlagUserAllCamerasInLua: "False", + DFFlagMacInferredCrashReporting: "True", + DFFlagWindowsInferredCrashReporting: "True", + FFlagUseNewPromptEndHandling: "True", + FFlagPhysPropConstructFromMaterial: "True", + FFlagStudioToolboxModelDragToCastPoint: "True", + FFlagStudioPushTreeWidgetUpdatesToMainThread: "True", + DFFlagFixYieldThrottling: "True", + FFlagCheckSleepOptimization: "True", + DFFlagContactManagerOptimizedQueryExtents: "True", + FFlagUseBuildGenericGameUrl: "True", + DFFlagFixFallenPartsNotDeleted: "True", + DFFlagTrackPhysicalPropertiesGA: "True", + DFFlagSetNetworkOwnerFixAnchoring2: "True", + FFlagUseSimpleRapidJson: "True", + DFFlagTurnOffFakeEventsForCAS: "True", + DFFlagTurnOffFakeEventsForInputEvents: "True", + FFlagCancelPendingTextureLoads: "False", + DFFlagCachedPoseInitialized: "True", + DFFlagFixJumpGracePeriod: "True", + FFlagFilterSinglePass: "True", + DFFlagOrthonormalizeJointCoords: "True", + DFFlagPhysicsSenderUseOwnerTimestamp: "False", + DFFlagNamesOccludedAsDefault: "True", + FFlagUserUseNewControlScript: "True", + FFlagUseDynamicTypesetterUTF8: "True", + DFFlagUseNewPersistenceSubdomain: "True", + DFFlagUseNewDataStoreLogging: "True", + FFlagPlaceLauncherUsePOST: "False", + FFlagStudioUpdateSAResultsInUIThread: "True", + FFlagBillboardGuiVR: "True", + FFlagHumanoidRenderBillboard: "True", + FLogVR: "6", + FFlagStudioRemoveDebuggerResumeLock: "True", + FFlagAnalyzerGroupUIEnabled: "True", + DFFlagVariableHeartbeat: "True", + DFFlagScreenShotDuplicationFix: "True", + FFlagCSGDelayParentingOperationToEnd: "True", + FFlagStudioTreeWidgetCheckDeletingFlagWhenDoingUpdates: "True", + DFFlagUseComSiftUpdatedWebChatFilterParamsAndHeader: "False", + DFFlagConstructModerationFilterTextParamsAndHeadersUseLegacyFilterParams: + "False", + FFlagMinMaxDistanceEnabled: "True", + FFlagRollOffModeEnabled: "True", + DFFlagGetLocalTeleportData: "True", + FFlagUseNewXboxLoginFlow: "True", + DFFlagFixSlowLadderClimb: "True", + DFFlagHumanoidCheckForNegatives: "True", + DFFlagFixMatrixToAxisAngle: "True", + DFFlagMaskWeightCleared: "True", + DFFlagUseStarterPlayerCharacterScripts: "True", + DFFlagUseStarterPlayerHumanoid: "True", + DFFlagAccessoriesAndAttachments: "True", + FFlagTeamCreateOptimizeRemoteSelection: "True", + FFlagReportInGameAssetSales: "True", + FFlagFilterDoublePass: "False", + DFFlagRaiseSendPriority: "False", + FFlagUsePreferredSoundDevice: "True", + FFlagRenderLowLatencyLoop: "False", + DFFlagLocalScriptSpawnPartAlwaysSetOwner: "True", + DFFlagCloudEditSupportImmediatePublish: "True", + FFlagFixSurfaceGuiGamepadNav: "True", + DFFlagEnableAdColony: "False", + FFlagEnableAdServiceVideoAds: "False", + DFFlagInfluxDb09Enabled: "True", + DFFlagTeleportSignalConnectOnServiceProvider: "True", + DFFlagScriptContextGuardAgainstCStackOverflow: "True", + FFlagFixPhysicalPropertiesComponentSet: "True", + DFFlagMaterialPropertiesDivideByZeroWeights: "True", + FFlagRemoveUnusedPhysicsSenders: "True", + FFlagRemoveInterpolationReciever: "True", + DFFlagActivatePGSMechanicalJoints: "True", + FIntPhysicalPropDensity_ALUMINUM_MATERIAL: "2700", + FFlagTreatCloudEditAsEditGameMode: "True", + FFlagSendFilteredExceptionOnInferredStep: "True", + DFFlagUrlReconstructToAssetGameSecure: "False", + DFFlagUseModerationFilterTextV2: "True", + FFlagGraphicsD3D10: "True", + FFlagRenderFixFog: "True", + FFlagUseNewAppBridgeWindows: "True", + DFFlagNullCheckJointStepWithNullPrim: "True", + FFlagJNIEnvScopeOptimization: "True", + DFFlagSanitizeLoadingGUICorrected: "True", + FFlagSendLegacyMachineConfigInfo: "False", + FFlagUseNewBadgesCreatePage: "True", + FFlagRetryWhenCloudEditEnabledEndpointFails: "True", + DFFlagTeamCreateDoNotReplicateShowDevGuiProp: "True", + FFlagStudioAddBackoffToNotificationsReconnects: "True", + DFFlagInsertServiceForceLocalInTeamCreate: "True", + FFlagGraphicsMacFix: "True", + FFlagUseNewAppBridgeOSX: "True", + FFlagNewColor3Functions: "True", + DFFlagSmootherVehicleSeatControlSystem: "True", + FFlagGameExplorerUseV2AliasEndpoint: "True", + FFlagDisableAbortRender: "True", + DFFlagInstancePredeleteNuke: "True", + DFFlagSimpleHermiteSplineInterpolate: "False", + DFFlagCleanUpInterpolationTimestamps: "True", + SFFlagPhysicsPacketSendWorldStepTimestamp: "True", + DFFlagUpdateTimeOnDelayedSamples: "False", + DFFlagDisableMovementHistory: "True", + DFFlagLookForDuplicateCoordinateFrameInBuffer: "True", + DFFlagDoNotForwardClientTimestamp: "True", + DFFlagZeroVelocityOnDelayedSamples: "True", + DFFlagUpdateHermiteLastFrameWhenUpdatePrevFrame: "True", + DFFlagCatchThrottledVelocityComponents: "True", + DFIntThrottledVelocityThresholdTenths: "15", + DFFlagShowFormFactorDeprecatedWarning: "False", + FFlagStudioTeamCreateWebChatBackendEnabled: "True", + DFFlagAnimationEasingStylesEnabled: "True", + FFlagUseVRKeyboardInLua: "True", + DFFlagCheckDataModelOnTeleportRetry: "True", + DFStringHttpInfluxWriterPassword: "faster1Play", + DFFlagOptimizeAnimator: "True", + FFlagOptimizeAnimatorCalcJoints: "True", + DFFlagStopUsingMaskWeight: "True", + FFlagRenderNoDepthLast: "True", + DFFlagFixTimeStampsForRunningNoThrottle: "True", + DFIntInterpolationDelayFactorTenths: "10", + DFFlagUseHermiteSplineInterpolation: "True", + DFFlagChatServiceFilterStringForPlayerFromAndToStudioBypass: "True", + FFlagCameraInterpolateMethodEnhancement: "False", + DFFlagBlendPosesWithIsOver: "True", + FFlagRestrictSales: "True", + FFlagBadTypeOnPcallEnabled: "True", + FFlagFixMouseFireOnEmulatingTouch: "True", + FFlagUseUpdatedSyntaxHighlighting: "True", + FFlagFixStickyDragBelowOrigin: "True", + FFlagFixBadMemoryOnStreamingGarbageCollection: "True", + DFFlagFixAllCharacterStreaming: "True", + FFlagDisableChangedServiceInTestMode: "True", + FFlagAllowFullColorSequences: "True", + FFlagStudioAllowFullColorSequences: "True", + DFFlagDynamicGravity: "True", + FFlagUseNewAppBridgeAndroid: "True", + FFlagFixSurfaceGuiGazeSelect: "True", + FFlagFixAlwaysOnTopSurfaceGuiInput: "True", + DFFlagCSGPreventCrashesWhenPartOperationsNotInDataModel: "True", + DFFlagUsePointsNewBatchingImpl: "True", + FFlagUseUpdatedKeyboardSettings: "False", + DFFlagFixAnimationControllerAnimator: "True", + DFFlagNoAnimationTrackState: "True", + DFFlagFixNestedAnimators: "True", + DFFlagWaitForToolHandleToEquip: "True", + DFFlagUseNewFetchFriendsFunction: "True", + FFlagWindowsNoDmpRetry: "False", + FFlagDeleteLogsOnMac: "True", + FFlagDeleteLogsByDate: "True", + FFlagTestMenuEnabledOnAllWindows: "True", + FFlagSoundServiceGameConfigurerConfigureRunServiceRun: "True", + DFFlagDoUpdateStepDetachedChannels: "True", + FFlagSoundChannelMaxDistanceStopFMODChannel: "True", + FFlagRenderSoftParticles: "True", + FFlagScriptContextSinglePendingThreadsQueue: "False", + DFIntTeleportExceptionInfluxHundredthsPercentage: "9000", + FIntStartupInfluxHundredthsPercentage: "100", + FFlagCSGAllowUnorderedProperties: "False", + DFFlagGamepadProcessMouseEvents: "False", + DFFlagCrashTouchTransmitterIfRefDtor: "False", + FFlagRenderUserGuiIn3DSpace: "True", + FFlagScreenGuisClipDescendants: "True", + FFlagUseNewNotificationPathLua: "True", + FFlagVideoDocumentationPluginEnabled: "True", + FFlagStudioBreakOnInfiniteLoops: "True", + FFlagMessageOnLoadScriptValidationFail: "True", + FFlagStudioMockPurchasesEnabled: "True", + FFlagStudioUseMarketplaceApiClient: "True", + DFFlagUseGameAvatarTypeEnum: "False", + FFlagStudioUsePlaySoloConfigurer: "True", + DFFlagUseAvatarFetchAPI: "False", + DFFlagSetHumanoidRegardlessOfNetworkOwnership: "True", + FFlagFixStudioCursorJitter: "True", + FFlagVoxelCompressedStorage: "True", + FFlagSmoothTerrainLODEnabled: "True", + FFlagBetterTabManagement: "True", + DFFlagBlockCustomHttpHeaders: "False", + FFlagStudioInsertAtTopCenterOfSelection: "True", + DFFlagCloudEditRemoveEditorOnPlayerRemove: "True", + FFlagWaitForChildTimeOut: "True", + FFlagDeviceEmulationStatistics: "True", + FFlagFixBoxSelectWithCtrl: "True", + FFlagStudioTrimPropertyWhitespace: "True", + FFlagDebugCSGExportFailure: "False", + FFlagFixCrashOnEmptyTextOnAutoComplete: "True", + FFlagCancelInputOnGuiNavigation: "True", + FFlagRemoveOldAnalyticsImplementation: "True", + FFlagRemoveOldCountersImplementation: "True", + FFlagUseNewAppBridgeStudio: "True", + FFlagStudioAnalyticsRefactoring: "True", + DFFlagRCCUseMarketplaceApiClient: "False", + FFlagStudioIntellesenseOnAllMembersEnabled: "True", + DFFlagDataStoreDisableReFetchingRecentKeys: "True", + FFlagNewDefaultScriptSource: "True", + FFlagStudioEnableDebuggerPerfImprovements: "True", + FFlagRecordForceStereo: "True", + FFlagStudioVideoRecordFix: "True", + FFlagStudioUseHttpsForUserInfo: "True", + FFlagUseHttpsForGameserverAshx: "True", + FFlagDisableScriptContextScriptsDisabled: "True", + DFFlagDuplicateInstanceReferenceFix: "True", + FFlagRakNetSupportIpV6: "False", + FFlagUseToStringN: "True", + FFlagStudioRenderRemotePlayerSelection: "True", + FFlagStackTraceLinks: "True", + FFlagStudioUpdateRestoreBehavior: "True", + FFlagTouchTransmitterWeakPtr: "True", + FFlagAdvancedRCCLoadFMODRetry: "True", + FFlagAdvancedRCCLoadFMODReportDeviceInfo: "True", + FFlagAdvancedRCCLoadFMODAttemptReportDeviceInfoOnFailure: "True", + FFlagClientLoadFMODReportDeviceInfo: "True", + DFIntReportDeviceInfoRate: "100", + DFFlagSoundV2LogOnSetSoundId: "True", + FFlagMouseUseUserInputServiceMouse: "True", + SFFlagSoundChannelUseV2Implementation: "True", + SFFlagUseNewSetFMOD3D: "True", + FFlagCSGReportSuccessFailure: "True", + FFlagUseAvatarFetchThumbnailLogic: "True", + FFlagDoIncrementalLoadingForR6AvatarFetch: "True", + FFlagUseAvatarFetchAPI: "True", + FFlagUseGameAvatarTypeEnum: "True", + FFlagSmoothTerrainLODFalseCoarseNeighbor: "True", + FFlagStudioPublishToRobloxActionUXAlwaysAvailable: "True", + FFlagFixArraysNotUnmarkedFromCyclicTableDetection: "True", + FFlagSoundIgnoreReplicatorJoinDataItemCache: "True", + FFlagStudioReportCachedRecentActions: "True", + FFlagStudioCacheRecentAction: "True", + FFlagRenderMeshReturnsCorrectly: "False", + FFlagEnableRenderCSGTrianglesDebug: "False", + FFlagStudioBreakOnInfiniteLoopsThreadingFixEnabled: "True", + SFFlagNetworkStreamRotationAsFloat: "False", + DFFlagStarterGuiMethodsWarnServer: "True", + DFFlagStarterGuiPropertiesReplicate: "True", + DFFlagClickDetectorReplicate: "True", + FFlagTeleportDetailedInfluxHttpStatusError: "True", + DFFlagHttpStatusCodeErrorIncludeBody: "True", + FFlagEnableVoiceASR: "False", + DFFlagFMODSetAccurateTime: "True", + FFlagRenderFixGuiOrder: "True", + FFlagExplosionsVisiblePropertyEnabled: "True", + FFlagEnableVoiceRecording: "False", + FFlagStudioReopenClosedTabsShortcut: "True", + FFlagStudioShowNotSavingScriptEditsOnce: "True", + FFlagHttpCurlCacheHandles: "True", + DFFlagAvatarFetchCanLoadCharacterAppearanceFix: "True", + FFlagGraphicsTextureCommitChanges: "False", + DFFlagLoadInstancesAsyncUseDataModelTasks: "False", + DFFlagInfluxOverUDP: "True", + FFlagUseLegacyEnumItemLookup: "True", + DFFlagInfluxOverTCP: "False", + DFFlagCFrameRightAndUpVectors: "True", + DFFlagLegacyBodyColorsOnCharacterLoadFailure: "True", + DFFlagUseMeshPartR15: "True", + FFlagStudioFixLockingScriptDisablesMenuOptions: "True", + FFlagUseCorrectDoppler: "True", + DFFlagFixJumpRequestOnLand: "True", + DFFlagNullStarterCharacterPrimaryPartFix: "True", + SFFlagR15CompositingEnabled: "True", + FFlagStudioFixPropertiesWindowScrollBarNotShowing: "True", + FFlagFixCollisionFidelityTeamCreate: "True", + DFFlagSendHttpBodyOnFailure: "True", + DFFlagCSGPreventNoContextCSGCrashes: "False", + FFlagConstraintPropertyReplicationRaceConditionFixEnabled: "True", + FFlagFixLogCulling: "True", + FFlagSmoothTerrainLODFixSeams: "True", + DFFlagDontCacheHumanoids: "True", + FFlagStudioPlaySoloConfigurerLegacyPlayerName: "True", + DFFlagPartForRegion3NoMaxLimit: "True", + FFlagRCCSupportTeamTest: "True", + FFlagStudioSupportBytecodeDeserialize: "True", + DFFlagStackTraceHasNewLines: "True", + DFFlagCleanCacheMoveMutex: "True", + FFlagFastFontMeasure: "False", + FFlagRenderMoreFonts: "True", + FFlagCleanFilteringEnabledLocalSpawnParts: "True", + FFlagFetchJoinScriptWithHttp: "False", + FFlagCheckPlayerProcessMutexCreation: "True", + FFlagCheckRegisterSoundChannelUniqueness: "True", + FFlagUseCommonModules: "True", + DFFlagRemoteFixDisconnectedPlayer: "True", + FFlagWarnForLegacyTerrain: "True", + FFlagFastClusterDisableReuse: "True", + FFlagStudioRespectMeshOffset: "False", + DFFlagRevisedClientJoinMetrics: "True", + FFlagRestoreScriptSourceWhenRedoingScriptCreation: "True", + DFFlagStudioFixPastingDecalsIntoMultiple: "True", + FFlagMeshPartMaterialTextureSupport: "True", + FFlagStudioPlaySoloCharacterAutoLoadsNullTool: "True", + DFFlagPGSWakeOtherIfOneAssemblyIsAwake: "False", + DFFlagFixR15BodyPhysics: "True", + FFlagLoadCharacterSoundFromCorescriptsRepo: "True", + DFFlagSoundV2LoadUseParamContext: "True", + DFFlagSoundV2LoadedRunCallbacks: "True", + FFlagFixPlayerProcessMutexDeadlock: "True", + FFlagImprovedJoinScriptFlow: "True", + FFlagRCCLoadFMOD: "True", + FFlagStudioDeadCodeOnMouseDown: "True", + DFFlagFireCharacterAddedAfterSpawn: "False", + FFlagChatVisiblePropertyEnabled: "True", + FFlagChatLayoutChange: "False", + FFlagCorescriptNewLoadChat: "True", + DFLogLuaTypeErrors: "4", + DFFlagLuaInstanceBridgeNewCamelCaseFixerEnabled: "True", + FFlagConstraintUIEnabled: "True", + FFlagStudioSetObjectsFromPropertiesWindow: "True", + FFlagStudioPromptWhenInsertingConstraints: "True", + DFFlagFixExperimentalSolverSetter: "True", + DFFlagShowRedForAutoJointsForPartsWithConstraint: "True", + FFlagTrackOriginalClientID: "True", + FFlagStudioHiddenPropertyCrashFixEnabled: "True", + FFlagStudioPropertyChangedSignalHandlerFix: "True", + FFlagStudioScriptAnalysisGetOrCreateRefactoring: "True", + DFFlagAllowHttpServiceInTeamCreate: "True", + DFFlagAllowRequireByAssetIdInTeamCreate: "True", + DFFlagLuaSignalCamelCaseAPI: "True", + FFlagFixLogManagerWritingToTempDir: "True", + FFlagTrackModuleScripts: "True", + FFlagUserJumpButtonPositionChange: "True", + FFlagLoadCommonModules: "True", + FFlagMouseCommandChangedSignalEnabled: "True", + DFIntInfluxTattletalePerUserHundredthsPercent: "1", + DFIntInfluxTattletalePerEventHundredthsPercent: "2000", + DFIntInfluxTattletaleCooldownSeconds: "300", + DFFlagSendHttpInfluxDatabaseField: "True", + FFlagGraphicsD3D11HandleDeviceRemoved: "True", + FFlagFixPlayerProcessMutexDeadlockForReal: "True", + FFlagNetworkKeepItemPools: "True", + FLogNetworkItemQueueDtor: "1", + FFlagFixLoadingScreenAngle: "False", + FFlagFixStudioInGamePaste: "True", + FFlagStudioSetViewportSizeOfClone: "True", + FFlagStudioTreeWidgetPotentialMemoryLeak: "True", + FFlagStudioEnableLayersForNSView: "True", + FFlagEnableViewportScaling: "True", + FFlagStudioDisableScrollingOnEarlyMac: "True", + FFlagPerformanceStatsCollectionEnabled: "True", + FFlagStudioStopSoundPlaybackAfterRemoval: "True", + FFlagStudioAllowSoundDraggingFromToolbox: "True", + FFlagStudioRelocateSoundJob: "True", + FFlagLuaDebugProfileEnabled: "True", + FFlagRemoveSoundServiceSoundDisabledProperty: "True", + FFlagRecordInGameDeaths: "False", + FFlagStudio3DGridUseAALines: "False", + FFlagFixIsCurrentlyVisibleSurfaceGuis: "True", + FFlagSurfaceGuiObjectEnabledCheck: "True", + FStringPlaceFilter_InterpolationAwareTargetTime: + "True;249779150;333368740;444708274;64542766;248207867;171391948;360589910;388599755;163865146;127243303;162537373;6597705;332248116;348681325;196235086;13822889;189707", + DFFlagUseR15Character3: "True", + DFFlagAllowCustomR15Character: "True", + DFFlagFixDoubleJointR15Character: "True", + DFFlagFixR15SphereHead: "False", + DFFlagUseR15SwimFreestyle: "True", + DFFlagFixBodyColorsR15: "True", + DFFlagPlayerDescendantsDeleteOnDisconnectOff: "True", + DFFlagSpringConstraintInGameAdornFixEnabled: "True", + DFFlagDontPrintMalformedUrls: "True", + DFFlagUseMultiFormatCharacterAppearanceLoading: "True", + FFlagStudioFlycamAppBridgeFix: "True", + FFlagAllowCopyUnArchivableObjects: "True", + FFlagStudioReduceTeamCreateStuttering: "True", + DFFlagPGSSolverUsesIslandizableCode: "True", + DFFlagResetScreenGuiEnabled: "True", + FFlagGraphicsD3DPointOne: "True", + FFlagGraphicsNoMainDepth: "True", + FFlagCollectClientIDUpdateStatistics: "True", + FFlagStudioFixTestApis: "True", + FFlagAllowInsertConstrainedValuesAnywhere: "True", + FFlagStudioResizeMeshPartOnImport: "True", + FFlagStudioReportVitalParameters: "True", + FFlagSoundGroupsAndEffectsEnabled: "True", + FFlagSoundscapeReplicateChildren: "True", + FFlagLoadCorescriptsPlatformDefMode: "True", + FFlagEnableGetHitWhitelist: "True", + FFlagStudioUpdatePropertiesWithoutJob: "True", + FFlagOverrideTypeFunction: "True", + DFFlagEnableBindToClose: "True", + FFlagStudioFixUndeletingSoundCausesPlayback: "True", + FFlagServerSenderDontSendInterpolatedPhysics: "False", + FFlagGraphicsD3D9ComputeIndexRange: "True", + FFlagCrashOnScriptCloseFixEnabled: "True", + FFlagShowCoreGUIInExplorer: "True", + FFlagStudioUseServerConfigurer: "True", + FFlagUDim2LerpEnabled: "True", + FFlagDisableLayersForNSViewOnEarlyMac: "True", + FFlagStudioCorrectForRetinaScreensOnEarlyMac: "True", + FFlagStudioConsistentGuiInitalisation: "True", + FFlagStudioSanitizeInstancesOnLoad: "True", + FFlagStudioOnlyUpdateTeamTestActionsIfChanged: "True", + FFlagChatServiceReplicates: "True", + DFFlagICMPPingHundrethsPercentage: "100", + DFFlagUsePasiveOnlyForBind: "False", + DFFlagFavorIPV4Connections: "False", + DFFlagUsegetFamilyandMapAddress: "False", + FFlagBetterPlaceLauncherStatusHandling: "True", + FStringPlaceFilter_NewLayoutAndConstraintsEnabled: + "True;534842009;20213796;379132413;485971234;515782100;248207867;360699282;498699944;540764930;534808604;520456996;552894983;551169796;560164377;599021441;609763195;609918169;599392478;614429353;337448601;615210477;606827239;19481228;19827397;26953764;561540866;20397851;626302497;402593749;589006000;461274216;129419469;478459751;460710135;464914388;481987774;610775332;567211827;636396993", + FFlagInformClientInsertFiltering: "True", + FStringClientInsertFilterMoreInfoUrl: + "http://devforum.roblox.com/t/coming-changes-to-insert-service/30327", + FFlagSoundChannelOnAncestorChangedUseGameLaunchIntent: "True", + DFFlagAllowResetButtonCustomization: "True", + FFlagTattletaleFixTextValue: "True", + DFIntInfluxTattletaleInstancePathMaxLength: "200", + DFFlagFixRetriesExhaustedHandling: "True", + DFFlagBetterGetPlayerPlaceInstanceError: "True", + DFFlagCharacterScriptsLoadingRefactor: "True", + FFlagStudioPropertyWidgetRemoveUpdateEvents: "True", + FFlagStudioUserNotificationIgnoreSequenceNumber: "True", + FFlagStudioOnlyOneToolboxPreviewAtATime: "True", + FFlagStudioFixPauseDuringLoad: "True", + DFFlagStudioUseNewActiveToolEffect: "True", + FFlagGraphicsD3D11PickAdapter: "True", + FFlagChatFilterWorksLocally: "True", + FFlagFilterMessageWithCallbackNoTryCatch: "True", + FStringPlaceFilter_SetPhysicsToLastRealStateWhenBecomingOwner: + "True;13822889;189707", + FFlagMetaliOS: "True", + FFlagUseNewAppBridgeIOS: "True", + FFlagTextBoundRespectTextScaled: "True", + FFlagRenderFastResolve: "True", + DFFlagLoadingGuiTeleportCrashFix: "True", + FFlagPluginSaveSelection: "True", + FFlagHandleSoundPreviewWidgetWithNoSelectedSound: "True", + FFlagDontSwallowInputForStudioShortcuts: "True", + FFlagStudioFireStickyMouseCommandChangedOnly: "True", + FFlagStudioDisableEditingCurrentEditor: "True", + FFlagFixCorruptionInLogFiles: "True", + FFlagStudioLockScriptsWithoutBlocking: "True", + FFlagSetPhysicsToLastRealStateWhenBecomingOwner: "True", + FFlagInterpolationAwareTargetTime: "True", + DFFlagServerSenderDontSendInterpolatedPhysics: "True", + FFlagSyncRenderingAndPhysicsInterpolation: "True", + DFIntTargetTimeDelayFacctorTenths: "20", + FFlagNewIncomingPhysicsManagement: "True", + DFFlagGetAssetIdsFromPackageAPI: "True", + DFFlagGoodbyeChoiceActiveProperty: "True", + FFlagAllowResizeRenderBufferiOS: "True", + FIntEnableAvatarEditoriOS: "100", + FIntEnableAvatarEditorAndroid: "1", + FIntAvatarEditorAndroidRollout: "1", + DFFlagFixScaledR15Physics: "True", + DFFlagScaleR15Character: "True", + }) + }, +) router.get(["/v1/settings/application"], (req, res) => { - return res.json({"applicationSettings":{"DFFlagRCCKickDuplicatePlayersOnJoin":"True","FFlagRCCKickDuplicatePlayersOnJoin":"True","DFFlagDebugAllowLocalRccKicks":"True","FFlagDebugLocalRccServerConnection":"False","FFlagChinaLicensingApp":"False","FFlagShowConnectionErrorCode":"True","FFlagCoreScriptFasterCreate":"True","FFlagLocalizeErrorCodeString":"False","DFFlagAccoutrementWeldingFilteringEnabled":"False","DFFlagAddOSToPlayerInfoTable":"True","DFFlagAddSoundEnabledInitializationParam":"True","DFFlagAddStreamingAndResourceUsageUrlParams":"True","DFFlagAllowJoinsToWait":"True","DFFlagAllowPackageLinkAncestoryClone":"True","DFFlagAnalyticsCDNProbeOnlyQueryOneHost":"True","DFFlagAnalyticsReportHttpStatsAtExit":"True","DFFlagAnalyticsServiceMonitoring":"True","DFFlagAnimationLoadSimplification":"False","DFFlagAnimationLoadSimplification2":"True","DFFlagAnimatorOnSteppedKeepAlive":"True","DFFlagAssumeNoBreakableJoints":"True","DFFlagAttemptFixXBoxCrash":"True","DFFlagAvoidResetCurrentRegion4":"True","DFFlagBatchApiAssetArchiving":"False","DFFlagBatchAssetApiNoFallbackOnFail":"True","DFFlagBatchAssetApiTrackFailedUrls2":"True","DFFlagBetterTimeStamp":"True","DFFlagBetterTypeErrors":"True","DFFlagCSGMeshDeserializationFix":"True","DFFlagCSGMeshLevelOfDetailV2_PlaceFilter":"True;2434889832;2568147212","DFFlagCSGMeshLevelOfDetail_Fix2":"True","DFFlagCSGMeshV4DeserializerEnabled":"True","DFFlagCSGv2SkipDegenerateTriangles":"True","DFFlagCSGv2StatisticsFix":"True","DFFlagCSGv2UseMegaAssetFetcher":"True","DFFlagCSGv2UsePositionClustering":"True","DFFlagCacheAverageClientPing":"True","DFFlagCacheInAssemblyForSending":"True","DFFlagCatchCharacterLoadingErrors":"True","DFFlagCheckCoreLocalizationLoading":"True","DFFlagCheckForNullSoundChannel":"True","DFFlagCheckForNullWhenCloningInstances":"True","DFFlagCheckGameValidityInDoTeleport":"True","DFFlagCheckMultipleLoadCharacterCalls":"True","DFFlagCheckPVDifferencesForInterpolationChoice":"True","DFFlagClampPitch2":"True","DFFlagCleanCacheMoveMutex":"True","DFFlagClearUnusedLuaRefsWithJob":"True","DFFlagClientHappyNewYear1":"True","DFFlagClientJoinProcessToEventIngest":"True","DFFlagCloudTablesEnforceAccountAge":"True","DFFlagCloudTablesPhase2_AddCloudTableToListOnCreate":"True","DFFlagCloudTablesPhase2_CreateTableEarly":"True","DFFlagCloudTablesPhase2_IgnoreEmptyManifestReport":"True","DFFlagCloudTablesPhase2_MissingSourceTextScraperFix":"True","DFFlagCloudTablesPhase2_TrackLocaleFetchCallsites":"True","DFFlagCloudTablesPhase2_WaitForSourceFix":"True","DFFlagCollectSoundInfo":"True","DFFlagContactManifoldCountReportingEnabled":"True","DFFlagContentProviderAssetdeliveryRolloutEnabled2":"True","DFFlagContentProviderUseLambdas":"True","DFFlagDarwinIncludeMemReusable":"True","DFFlagDataModelSetAnalyticsDatacenterId":"True","DFFlagDataStoreAutoHttpRetry":"False","DFFlagDataStoreDontTouchCachedRecordOnGetAsync":"True","DFFlagDebugAnalyticsForXBoxCrash":"True","DFFlagDebugAnalyticsForXBoxCrashOnSuccessAlso":"True","DFFlagDebugEnableRemoteProfiling2":"True","DFFlagDebugGAReportThrottledSessions":"True","DFFlagDebugLaunchTimeByCountryPlaceSpecific_PlaceFilter":"true;189707","DFFlagDebugReportSoundAssetsFromList":"True","DFFlagDeleteEventInvocationArgsSerially":"True","DFFlagDidNotEatPizzaToday":"True","DFFlagDoNotInvalidateMe":"True","DFFlagDoNotRepositionSeated":"True","DFFlagDoNotRunAnimationEditorInPlayMode":"True","DFFlagDoParallelInterpolationFixUnguardedBufferClear":"True","DFFlagDoParallelInterpolationSetPV2":"True","DFFlagDontCallOnMovingAssemblyRoot":"False","DFFlagDontWhitelistUserInputConnectionCounts":"True","DFFlagDynamicFastVariableSupportFileSource":"True","DFFlagDynamicLocalizationTablesNonBlocking2":"True","DFFlagDynamicReloaderDoWork":"True","DFFlagEmoteLoadingEnabled":"True","DFFlagEmotesApiEnabled":"True","DFFlagEnableFillCylinder":"True","DFFlagEnableMeshHeadAttachments":"True","DFFlagEnableMeshHeadNative":"True","DFFlagEnableMessagingService":"True","DFFlagEnableMessagingServiceAnalysis":"True","DFFlagEnablePlayFabBatchEventCompression":"False","DFFlagEnablePrintJoinSizeBreakdown":"True","DFFlagEnableWakingPGSJointsForNonSolverPrimitives":"True","DFFlagEnforceSlaveStateEnabledStatus":"True","DFFlagEvenBetterTimeStamp":"True","DFFlagExternalWakeOtherAssembly2":"False","DFFlagFasterResetRoot":"True","DFFlagFasterVectorIndex":"True","DFFlagFileSystemReadDirFix":"True","DFFlagFileWatcherMultipleEventPerUpdateCall":"True","DFFlagFireHealthChangedLater":"True","DFFlagFixCLI28389":"True","DFFlagFixCharacterAppearanceLoadedEvent2":"True","DFFlagFixDataStoreWarningKeyEmpty":"True","DFFlagFixEmotesInventoryOverwrite":"True","DFFlagFixEquipToolAssertWhenHumanoidNotInDataModel":"True","DFFlagFixExtractFirstLOD":"True","DFFlagFixInvalidateCache":"True","DFFlagFixManualJointAdornCrash":"False","DFFlagFixMasslessInertiaContribution":"True","DFFlagFixMeshNormalsForNonUniformScaling":"True","DFFlagFixMoveToSlowAfterAnalogControls":"True","DFFlagFixNewTriangleMeshCreation":"True","DFFlagFixPVSpaceTransform":"True","DFFlagFixReadCache":"True","DFFlagFixRootPartCollisionForR6":"True","DFFlagFixSetupAnimationWeights":"True","DFFlagFixSpawningPerformanceAndInaccuracies":"True","DFFlagFixThrottlingCalculationForRot":"True","DFFlagFixTimeConversion":"True","DFFlagForwardRefCheckMegaReplicator":"True","DFFlagGenericPublicKeyIndex2":"True","DFFlagGetAutoTranslationEntriesEnabled2":"True","DFFlagGetBundleDetailsAPI":"True","DFFlagGetCountryRegionForPlayerAsyncEnabled":"True","DFFlagGetPolicyInfoForPlayerAsyncEnabled":"True","DFFlagGetTeamLazyEvaluation":"True","DFFlagGetTranslatorForLocaleAsyncEnabled2":"True","DFFlagGroupTeleportAddTeleportIdParameter":"True","DFFlagGroupTeleportJoinDataOverWrite":"True","DFFlagHoldTrottleValue":"True","DFFlagHttpAssetArchiveWarning":"False","DFFlagHttpBatchApiSupportAssetdeliveryInputUrls":"True","DFFlagHttpBatchCompress":"True","DFFlagHttpCacheAsync":"True","DFFlagHttpCacheCleanupNew":"True","DFFlagHttpCacheMissingRedirects":"True","DFFlagHttpClientCleanTimedCallbacks":"True","DFFlagHttpClientDisabledSkipCache":"True","DFFlagHttpErrMessageFix":"True","DFFlagHttpErrorNestingFix":"True","DFFlagHttpMarkExternalRequests":"True","DFFlagHttpStatisticsFix":"True","DFFlagHttpTcpKeepalive":"True","DFFlagHumanoidWithPGSConstraintsUsePhysicsState":"True","DFFlagInWithTheNew_PlaceFilter":"true;1034242130;2528277338","DFFlagInventoryFetchUseInventoryApi":"True","DFFlagJoinDataCacheChecksClientOwnedParts":"True","DFFlagJsonParsePrimitives":"True","DFFlagLDLPGSStatsEnabled":"True","DFFlagLetTouchFlush":"True","DFFlagLinkedSourceLoadSimplification":"True","DFFlagLocServiceTrackPlayerTextScraping1":"True","DFFlagLocService_InvalidateTranslationsOnChildAdded":"True","DFFlagLocTableNormalizeLocaleAttemptTranslation":"True","DFFlagLocalizationLanguageDelimiterFix":"True","DFFlagLockTheftInstanceCrash":"True","DFFlagLogMemoryStatsOnCompressionError":"True","DFFlagLuaTableMove":"True","DFFlagLuauFixFenv":"True","DFFlagMechanismInterpolationLikesLocalSpace":"True","DFFlagMegaReplicatorOnlyTrackReplicatableProperties":"True","DFFlagMegaReplicatorOptimizePendingNewInstanceItemTracking":"True","DFFlagMessagingServiceFixErrorMessage":"True","DFFlagMessagingServiceFixUnsubscribeTwiceOnClose":"True","DFFlagMessagingServiceForTest":"True","DFFlagMessagingServiceSentUtcTime2":"True","DFFlagMessagingServiceSuggestedErrorMessage":"True","DFFlagMessagingServiceTopicEmptyChecking":"True","DFFlagMiscIndividualAssetRequestUseAssetdelivery2":"True","DFFlagMoreWeldRestrictions":"False","DFFlagMoveAssetFetchEndpointToAssetDelivery":"True","DFFlagMoveAudioDeviceReporting":"True","DFFlagMpsRateLimit":"True","DFFlagMpsRateLimitReport":"True","DFFlagMpsRateLimitReport_PlaceFilter":"false;370731277","DFFlagMpsRateLimitWarn":"True","DFFlagNPCUnequipTools":"True","DFFlagNamesOccludedAsDefault":"True","DFFlagNavigationServiceAnalytics":"True","DFFlagNetworkParallelPhysicsOut":"True","DFFlagNewRejoinMessage_PlaceFilter":"True;1034242130;2528277338","DFFlagNewShowStreamedRegionDiag":"True","DFFlagNewSortAndFilter":"True","DFFlagNoFaceHeadMeshTagR6":"True","DFFlagNoInfiniteLoopOnChatInfoLoadFailure":"True","DFFlagNoMoreSinglePhysicsSenderJob":"True","DFFlagNoStringDump":"True","DFFlagNoYieldCaptured":"True","DFFlagNonBlockingAnalyticsExit":"True","DFFlagOnlyFireHealthChangedWhenHealthChanges":"True","DFFlagOwnershipDistributionCheckIgnoredJoint":"True","DFFlagPGSSolverSimIslandsEnabled2":"True","DFFlagPGSWakeOtherAssemblyForJoints":"True","DFFlagPGSWakeOtherIfOneAssemblyIsAwake":"False","DFFlagPLTIGetLocaleFallback":"True","DFFlagPackageMoveModificationToRCCStage3":"True","DFFlagPackageMoveModificationToRCCStage4":"True","DFFlagPackageMoveModificationToRCCStage5":"True","DFFlagParallelCollisionDoNothingFaster":"True","DFFlagParallelCollisions2":"True","DFFlagParallelCollisionsUseBetterGImpactCaching":"True","DFFlagParameterizeHandlerNamedParameterEnabled":"True","DFFlagParameterizeHandlerPureUsernameFix":"True","DFFlagParameterizeInThread":"True","DFFlagPreloadAsyncCallbackFunction":"True","DFFlagPreventLuaFunctionMigration":"True","DFFlagProfileAvoidRecordingEmptyFrames":"False","DFFlagRaiseCorrectException":"True","DFFlagRbxFormatMultiByteSizeFix":"True","DFFlagRccDoNotSetZeroPlaceIdFilter":"True","DFFlagRccUseHttpRequestForPlaceFetch":"True","DFFlagReduceSendDataCriticalSection":"True","DFFlagReduceTrussSearchDistance2":"False","DFFlagRejectRebelReceipt":"True","DFFlagRemovePrepareInstancesLocks":"True","DFFlagRemoveRedundantQueryParams":"True","DFFlagReplicatorCollectItemCountOnSend":"True","DFFlagReplicatorJDIOnlyUpdateCacheWhenParentIsUpToDate":"True","DFFlagReplicatorLabelItemTypesProcessed":"True","DFFlagReplicatorOptimizeDescendantOfWorkspace":"True","DFFlagReportCharacterLoadTimeMetrics2":"True","DFFlagReportCoalescingStats":"True","DFFlagReportCollisionDetectionTime":"True","DFFlagReportCounterToGameInstancesApi":"True","DFFlagReportDataStoreErrorCases":"True","DFFlagReportGALightingTechnology":"True","DFFlagReportGPUMetrics":"True","DFFlagReportInfluxLightingTechnology":"True","DFFlagReportInterpolationPerformance":"True","DFFlagReportInterpolationPerformanceClient":"True","DFFlagReportJoinTimeImpactStats":"True","DFFlagReportLightingTechnology":"True","DFFlagReportMp3ParsingAnomalies":"True","DFFlagReportOggParsingAnomalies":"True","DFFlagReportParsingAnomalies":"True","DFFlagReportPhysicsFPSStatsPlaceSpecific_PlaceFilter":"True;606849621;171391948;189707","DFFlagReportPhysicsSolverStatsPlaceSpecific_PlaceFilter":"True;606849621;171391948;189707","DFFlagReportPhysicsStatsToHUD":"True","DFFlagReportReplicatorStatsToInflux":"True","DFFlagReportSolverUsageStats":"True","DFFlagReportStatsCurrentLessThanMin2":"True","DFFlagReportStatsPauseDuration":"True","DFFlagReportTriangleMeshPartMigrationData":"True","DFFlagRomarkAdjustCharacterReportThrottle":"True","DFFlagRoundToScreenScaleUseFloor":"True","DFFlagSanitizeCofmVariablesNanInf":"True","DFFlagScriptContextImproveValidateThreadAccess":"True","DFFlagScriptContextTraceLocalTime":"True","DFFlagSendClientNewJoinData":"True","DFFlagSendPackageRequestFailureMessageOnlyOneTime":"True","DFFlagSendTypeAsStringDuringCacheValidation":"True","DFFlagServerConfigurerDoCDNProbe":"True","DFFlagServerCopiesPlayerGui3":"True","DFFlagServerProfileSeparateThread":"True","DFFlagServerReportPhysicsThrottleWithDatacenterId":"True","DFFlagSetNumberEmotesLoaded":"True","DFFlagSignalRCrashFix":"True","DFFlagSimDecisionBaseOnExtents2":"True","DFFlagSimplifyRakNetConnectionHandshake":"False","DFFlagSkipContainerCheckOnJoin":"True","DFFlagSkipLowRes":"True","DFFlagSkipLowRes_PlaceFilter":"True;3027055174","DFFlagSkipSDILogName":"True","DFFlagSocialServiceDevPromptGameInvites":"True","DFFlagSpecialCaseSupportRbxCdnInAppDataModel2":"True","DFFlagSpecificGravityDummyFunctionGA":"True","DFFlagSpecificGravityDummyReturnsZero":"False","DFFlagStreamingExtentsForceUpdateOnlyWhenAlive":"True","DFFlagStreamingGameplayPausedAPI":"True","DFFlagStreamingGameplayPausedAPIStudioProperties":"True","DFFlagStreamingSetPlayerPausedFirst":"True","DFFlagStreamingUpdateWorldExtentsWhenPlayerMoves":"True","DFFlagStrictMp3Parsing":"True","DFFlagStrictOggParsing":"True","DFFlagStrictOggParsingFix":"True","DFFlagSupportYouTubeInAppDataModelIfRbxCdnAllowed":"True","DFFlagTeamCreateSaveAnalyticsServiceApiKey":"True","DFFlagTextScraperEnableCaptureDateTime":"True","DFFlagTextScraperParameterizeV2":"True","DFFlagTextScraperReportOSPlatform":"True","DFFlagTextScraperReportSessionId":"True","DFFlagTextScraperStopReportPureParameterFix":"True","DFFlagThrottleGetUserThumbnailAsync":"True","DFFlagThrowErrorWhenRequestedURLFailed":"True","DFFlagThumbnailSupportFocusOnPart":"True","DFFlagUpdateCofmOnMasslessRootChange":"True","DFFlagUpdateHipHeightClamping":"True","DFFlagUseAssemblyExternalEdgeListCachedForWake":"True","DFFlagUseBaseUrlNotHardcodedUrl":"True","DFFlagUseDistanceThinning":"True","DFFlagUseLowResTerrain":"True","DFFlagUseLowResTerrain_PlaceFilter":"True;3027055174","DFFlagUseMomentumThinning":"True","DFFlagUseMomentumThinning_PlaceFilter":"False;1694497805;1225846869","DFFlagUseNewPemKeys":"True","DFFlagUseNewQueryParamUtility":"True","DFFlagUseNewTerrainProtocol":"True","DFFlagUseNewTerrainProtocol_PlaceFilter":"True;3027055174","DFFlagUseNoneLuaBuildRigFromAttachments":"True","DFFlagUsePemKeyFormat":"True","DFFlagUsePositionPropWhenKnown":"True","DFFlagUsePositionPropWhenKnown_PlaceFilter":"True;3027055174","DFFlagUsePugiXmlForSettings":"False","DFFlagUseRoundRobin":"False","DFFlagUseSort":"False","DFFlagUserAccessUserSettings":"True","DFFlagUserAdjustHumanoidRootPartToHipPosition":"True","DFFlagUserAllowDisableCustomAnims2":"True","DFFlagUserChatPrivacySetting":"True","DFFlagUserFixCharacterSoundIssues":"True","DFFlagUserHttpAPIEnabled":"True","DFFlagUserPlayCharacterLoopSoundWhenFE":"True","DFFlagUserPlayCharacterSoundWhenFE":"True","DFFlagUserPreloadAnimations":"True","DFFlagUserServerFollowers":"True","DFFlagUserUseLuaVehicleController":"True","DFFlagUserUseSoundDispatcher":"True","DFFlagUsingHeadsIsBadForOwningThings":"True","DFFlagUsingHeadsIsBadForPhysicsReplication":"True","DFFlagVerifyWorldInTryFloor":"True","DFFlagVersionedIdSync":"True","DFFlagViewportFrameLight":"True","DFFlagWebParserAddIsNumberCatchall":"True","DFFlagWhitelistStreamingPauseState":"True","DFFlagWhitelistUserInputEvents":"True","DFFlagXboxDisableTextChat":"True","DFIntAnalyticsForXBoxCrash_JoinInfluxHundredthsPercentage":"1","DFIntAnalyticsMaxSendWaitTimeMs":"1500","DFIntBatchApiAssetArchivingErrorDateSec":"1565895600","DFIntBulletContactBreakOrthogonalThresholdPercent":"200","DFIntBulletContactBreakThresholdPercent":"200","DFIntCSGLevelOfDetailSwitchingDistanceL12_PlaceFilter":"500;2434889832;2568147212","DFIntCSGLevelOfDetailSwitchingDistance_PlaceFilter":"250;2434889832;2568147212","DFIntCSGv2LodMinTriangleCount":"100","DFIntCSGv2LodsToGenerate":"3","DFIntCSGv2OperationInfluxHundredthsPercentage":"100","DFIntCanHideGuiGroupId":"4358041","DFIntChatCap":"100","DFIntChatTime":"10","DFIntClientJoinProcessPositiveSamplesThousandths":"10","DFIntClientNetworkInfluxHundredthsPercentage":"500","DFIntContentProviderAssetdeliveryRolloutPercentage":"100","DFIntCrashUploadHttpResponseDefaultTimeoutMillis":"80000","DFIntCrashUploadToBacktracePercentage":"10","DFIntDataStoreInfluxReportNonParsableDataPerMyriad":"10000","DFIntDataStoreMaxValueSize":"262144","DFIntDefaultBalanceD":"100","DFIntDefaultBalanceP":"7000","DFIntDynamicReloaderFailureInfluxHundrethsPercentage":"10000","DFIntDynamicReloaderFileFailureInfluxHundrethsPercentage":"10000","DFIntExpireMarketPlaceServiceCacheSeconds":"60","DFIntGamePassOwnershipCacheSeconds":"30","DFIntGetUserThumbnailAsyncThrottleTime":"3","DFIntHttpCacheStatsReportingIntervalSeconds":"180","DFIntHttpConnMaxAge":"600000","DFIntHttpConnectDefaultTimeoutMillis":"60000","DFIntHttpCurlConnectionCacheSize":"-1","DFIntInfluxReportLocalFilterStringPermyriad":"500","DFIntInfluxReportRCCStatsHundredthsPercentage":"5000","DFIntJSONOverflowDepth":"200","DFIntJoinInfluxHundredthsPercentage":"100","DFIntLDLPGSStatsRatePercentPlaceSpecific":"25","DFIntLocalizationServiceContentLoadErrorHundredthsPercentage":"1000","DFIntLogGroupTeleportInfluxPerTenThousand":"1000","DFIntMaxClusterKBPerSecond":"400","DFIntMaxDataOutJobScaling_PlaceFilter":"20;3260091322","DFIntMaxDataPayloadSize":"96000000","DFIntMaxFramesToSend":"2","DFIntMaxReceiptSize":"100","DFIntMpsRateLimitCapacity":"10","DFIntMpsRateLimitDuration":"10","DFIntNewSettingsEndpointExceptionInfluxPermyriad":"10000","DFIntNumberFramesSubmergedBeforeVSquaredViscocity_PlaceFilter":"0; 1221071288; 1107780422; 1223560318","DFIntOnDisconnectHTTPTimeout":"500","DFIntPercentApiRequestsRecordGoogleAnalytics":"5","DFIntPlayerConfigurerCDNProbeDelayMs":"10000","DFIntPrimStatsGANumDelimited":"3000","DFIntRakNetConnectionStartWindow_HundredthsPercentage":"1000","DFIntRakNetResendMaxThresholdTimeInUs":"2000000","DFIntRakNetResendScaleBackFactorHundredthsPercent":"6500","DFIntReplicatorAnimationTrackLimitPerAnimator":"50","DFIntReplicatorAnimationTrackLimitPerAnimator_PlaceFilter":"120;2116452049","DFIntReplicatorCountLimitInfluxHundrethsPercentage":"10000","DFIntReplicatorMaxPacketBytesSentToInfluxOnError":"256","DFIntReportAnimationTrackSpamInfluxHundrethsPercent":"500","DFIntReportDeviceInfoRate":"100","DFIntReportParsingAnomalyRate":"1","DFIntReportSoundAssetsRate":"1","DFIntS2NumPhysicsPacketsPerStep":"2","DFIntS2NumPhysicsPacketsPerStep_PlaceFilter":"8;3260091322","DFIntSendJoinTimesToDiag_HundredthsPercentage_PlaceFilter":"4000;370731277","DFIntSendRakNetStatsInterval":"300","DFIntServerBandwidthPlayerSampleRate":"20","DFIntSmoothTerrainPhysicsRayAabbSlop":"1","DFIntStepsToJoin":"2","DFIntStreamPauseVelBufFactorHundredths":"100","DFIntTextScraperReportUserIdSize":"5","DFIntThrottledVelocityThresholdTenths":"15","DFIntTimePermyriad":"10000","DFIntWaterViscosityDragFudgeFactor_PlaceFilter":"500; 1221071288; 1107780422; 1223560318","DFIntWebParserInfluxWriteNanInfPerMyriad":"1000","DFIntWeldPermyriad":"100","DFIntWorldStepDtAveExpFactorHundredth":"1","DFLogErrorDescription":"6","DFLogMessagingService":"6","DFLogSignalRConnection":"6","DFLogSoundCheckResult":"4","DFStringAdditionalBlacklistHeaders":"SOAPAction","DFStringAnalyticsNS1BeaconConfig":"https://web.archive.org/web/20200624170102/https://c0ll.rbxcdn.com/test-50kb.png|g2kd2s|https://c0hw.rbxcdn.com/test-50kb.png|g2iyic|https://c0cfly.rbxcdn.com/test-50kb.png|g2hjxw|https://c0ak.rbxcdn.com/test-50kb.png|g2g5dg","DFStringDataStoreThrottleMsg":"DataStore request was added to queue. If request queue fills, further requests will be dropped. Try sending fewer requests.","DFStringR15CollisionTypeField":"universeAvatarCollisionType","DFStringReportSoundAssetsAssetList":"rbxassetid://1837038213,rbxassetid://1846492029,rbxassetid://1841601627,rbxassetid://1845571507,rbxassetid://1836362602,rbxassetid://1846368341,rbxassetid://1847611722,rbxassetid://1845891180,rbxassetid://1845891141,rbxassetid://1842957560,rbxassetid://1836553363","DFStringRobloxAnalyticsURL":"https://web.archive.org/web/20200624170102/http://ecsv2.roblox.com/","DFStringSendPingForCnConnectingToDcList":"111,174,191,133","FFlagAddEndedSignalToSoundJobStudio":"True","FFlagAdjustHipTranslationBasedOnHipHeight":"True","FFlagAllowCatalogItemCreatorAssetConfig":"True","FFlagAllowMeToParseMyOwnJoinBlob":"True","FFlagAllowNegativeDisplayOrder":"True","FFlagAlwaysLuau":"True","FFlagAnimationSampleCorrection":"True","FFlagAnthroArtistIntentFBXImporterIntermediateState":"False","FFlagAppShellReporterMonitorFrameTimeIOS":"True","FFlagAvatarEditorAnthroSlidersUIOnly":"True","FFlagAvatarEditorCostumeSignalR":"True","FFlagAvatarEditorFixLegCameraPosition":"True","FFlagAvatarEditorFixSliderSensitivity":"True","FFlagAvatarEditorInitializeModelEarly":"True","FFlagAvatarEditorKeepYourColor":"True","FFlagAvatarEditorRefactorPageType":"True","FFlagAvatarEditorRemoveDefaultClothingMessage":"True","FFlagAvatarEditorSelectivelyUseDefaultAsset":"True","FFlagAvatarPartScaleTypeFix":"True","FFlagAvoidCrashOnThreadResourceError":"False","FFlagAvoidFindFirstChildCallsInGuiBase2d":"True","FFlagBackpackScriptUseFormatByKey":"False","FFlagBadgeReadDisabledFromInfo":"True","FFlagBatchAssetApi":"False","FFlagBestProximatePartFix":"True","FFlagBillboardGuiDistanceStepping2":"False","FFlagBreakJointsOnDeath":"True","FFlagCJVNotFallbackToEnglishForCoreGuiEnabled":"True","FFlagCMSEndPointsAPI":"True","FFlagCSGv2ControlSignificands":"False","FFlagCSGv2EnableEmptyMeshError":"True","FFlagCSGv2EnablePerPrimitiveBoxMaps":"True","FFlagCSGv2ForceEnabled":"True","FFlagCSGv2InGameEnabled":"True","FFlagChangeNarrowToSlender":"True","FFlagChatServiceAnalyticsOnFilterStringCalls":"False","FFlagCheckIntentWhenInitDefaultScripts":"True","FFlagClickDetectorCursorIconEnabled":"True","FFlagCloudEditServerGeneratesPlayerCameraPosition":"True","FFlagConnectionScriptEnabled":"True","FFlagConstraintAdornCleanup":"True","FFlagContentProviderTempDirWithPid2":"True","FFlagCoreScriptEnableInspectAndBuy":"True","FFlagCoreScriptEnableInspectAndBuy_PlaceFilter":"True;3155066112;3157761435;3204147952;189707","FFlagCoreScriptEnableRobloxTranslatorFallback":"True","FFlagCoreScriptEnableRobloxTranslatorFallback_PlaceFilter":"True;3155066112;3157761435;3204147952;189707","FFlagCoreScriptNoPosthumousHurtOverlay":"True","FFlagCoreScriptTranslateGameText2":"True","FFlagCoreScriptsUseLocalizationModule":"True","FFlagCoreUseRoact1_x":"True","FFlagCrashReporterNew":"False","FFlagCurlOption53":"True","FFlagCurlProbe4":"True","FFlagDatamodelServicesConnectionFix2":"True","FFlagDebugClientNetworkPerPlaceMetrics":"False","FFlagDebugClientNetworkPerPlaceMetrics_PlaceFilter":"True;1818;3498890;189707","FFlagDelayPurchasePromptActivation":"True","FFlagDisableDrawingStudsInEdit":"True","FFlagDisableReJoinForSurfaceTool":"True","FFlagDontInsertGroundJoints":"True","FFlagDontStoreCharacterModelBeingLoadedInPlayer":"False","FFlagEasingExpansion":"True","FFlagEnableAbsoluteCellSizeAndCellCount":"True","FFlagEnableAssetConfigVersionCheckForModels":"True","FFlagEnableAssetPreviewDynamicVote":"True","FFlagEnableAvatarEditoriOSTablet":"True","FFlagEnableCatelogForAPIService":"True","FFlagEnableDataForAssetConfig":"True","FFlagEnableDataModelFetchAssetAsync":"True","FFlagEnableDeveloperGetManageGroupUrl":"True","FFlagEnableFSEventWatcher":"True","FFlagEnableInsertAssetCategoryAnalytics":"True","FFlagEnableLuaBottomBarWithTextOnPhone":"False","FFlagEnableLuaBottomBarWithTextOnTablet":"False","FFlagEnableMarketplaceFavorite":"True","FFlagEnableMouseUpEventFireForCurrentDragGuiObj":"True","FFlagEnableNewChatApi":"True","FFlagEnablePreviewTabSelection":"True","FFlagEnableReplaceBodyPartR15":"True","FFlagEnableStudioServiceGetUserId":"True","FFlagEnableSurfaceGuiPixelsPerStud":"True","FFlagEnableTextBoxPasswordDev":"True","FFlagEnableTextSelection2":"True","FFlagEnableToolboxGetAssetsFailedCaseFix":"True","FFlagEnableToolboxUploadReport":"True","FFlagEnableToolboxVoteFix":"True","FFlagEndKeyboardEventsOnFocusChange3":"True","FFlagExitProcessOnExit":"True","FFlagFasterInstanceCheck":"True","FFlagFireAncestryChangedJointSignalAfterWorldInsert4":"True","FFlagFireChangedForCursorPosition":"True","FFlagFixAssetUploadSuccssMessage":"True","FFlagFixBadDirtyStateSetForUIConstraint":"True","FFlagFixButtonR2MouseClickOnGui":"True","FFlagFixCrashChangingHierarchyInRelayout":"False","FFlagFixG3DFpChecks":"True","FFlagFixIAdornableCollectorCrash3":"False","FFlagFixInspectMenuAnalytics":"True","FFlagFixLoadTimeReporting":"True","FFlagFixLoadableImageDoesNotLoadCachedImage":"True","FFlagFixLuaAppAvatarDraggable":"True","FFlagFixModalGuisInFoldersBeingIgnored":"True","FFlagFixModelPreviewSelection":"True","FFlagFixMousePositionInWindowCheck":"True","FFlagFixMultiWindowMouseMovements":"True","FFlagFixPluginQWidgetInitialization2":"True","FFlagFixPromiseUtilitiesBatch":"True","FFlagFixScalingValueRename":"True","FFlagFixScalingValueRename_PlaceFilter":"False;370731277","FFlagFixToggleOffDarkName":"True","FFlagFixXSwipe":"True","FFlagFlyweightServiceDataRecievedCallbackCrashFixEnabled":"True","FFlagFreeCameraForAdmins":"True","FFlagFreecamInTestServers":"True","FFlagGameMediaEntryIDOptional":"True","FFlagGamePerfMonitorGameCloseFix":"True","FFlagGamePerfMonitorStatsWindowFix":"True","FFlagGameinternationalizationApiWhitelist":"True","FFlagGamepadInputRaceConditionFix":"True","FFlagGetFVariableThrowsAgain":"True","FFlagGraphicsGLFixCopyFramebufferMip":"True","FFlagGraphicsGLHD3000DisableGL3":"False","FFlagGraphicsGLHD3000DisableUBO":"True","FFlagGraphicsGLSeparateCB":"True","FFlagGreyOutPublishForAssetConfigIfServiceIsSelected":"False","FFlagGuestFriendCheckFailImmediate":"True","FFlagHttpClientDisconnectResultSignals":"True","FFlagHttpUseContentCacheFlag3":"True","FFlagHttpUseMinGzip":"False","FFlagHumanoidPreventDuplicateAnimatorChildren":"True","FFlagIESuppressErrors":"True","FFlagIOSNowSupportsAussieMode":"True","FFlagIgnoreCollisionPairs":"True","FFlagInGameUIForceDefaultLocaleOnOSX":"True","FFlagInGameUIForceDefaultLocaleOnWin10":"True","FFlagInGameUIForceDefaultLocaleOnWin32":"True","FFlagInitializeModCodesForWindows":"True","FFlagInspectMenuEnableEmotes":"True","FFlagInspectMenuProgressiveLoading":"True","FFlagInspectMenuUpdateDisabledColor":"True","FFlagIsPasswordTextRendering":"True","FFlagJoinTime_AvatarFastClusterSignal":"True","FFlagJoinTime_AvatarTextureCompositorSignal":"True","FFlagJoinTime_HttpQueuePrio":"True","FFlagJoinTime_LocalUserAnimationPriority":"True","FFlagJoinTime_LocalUserClusterPriority":"True","FFlagJoinTime_LocalUserMeshPriority":"True","FFlagJoinTime_LocalUserTexturePriority":"True","FFlagJoinTime_PassTexturePriority":"True","FFlagJointsUseNoCollideJointCount3":"True","FFlagKeyDownAcrossAllWindows":"False","FFlagKeyframeSequenceEnableFrozen":"True","FFlagKillDownAwayState":"True","FFlagKillSurfaceJointsPart1":"True","FFlagLineHeightEnabled":"True","FFlagLoadCoreScriptsEvenInTeamCreate":"True","FFlagLoadTheLoadingScreenFaster":"False","FFlagLoadTimesFromAppShellReporter":"True","FFlagLocalesInUserInfoOniOS":"True","FFlagLocalizationTableTruncateFix":"True","FFlagLuaAppEnableHomePageWithAvatarABTest3":"False","FFlagLuaAppEnablePageBlur":"True","FFlagLuaAppEnableStopWatchReporter":"False","FFlagLuaAppFixAndroidNavigation":"True","FFlagLuaAppFixInfiniteRerender":"True","FFlagLuaAppGameDetailsHideEmptySections":"True","FFlagLuaAppGameSetTargetIdAnalytics":"True","FFlagLuaAppGamesPagePreloadingDisabled":"False","FFlagLuaAppHandlePurchaseFailWhenOwned":"True","FFlagLuaAppHomeIconPolicy":"True","FFlagLuaAppHttpsWebViews":"True","FFlagLuaAppMakeAvatarThumbnailTypesEnum":"True","FFlagLuaAppNewEconomyApi2":"True","FFlagLuaAppPolicyRoactConnector":"True","FFlagLuaAppPurchaseErrorToastRefactor2":"True","FFlagLuaAppRefreshScrollingFrameRefactor":"False","FFlagLuaAppSeeAllFriendsWebPage":"True","FFlagLuaAppSocialLinksSplitGroup":"True","FFlagLuaAppTabNameGamesToDiscoverOnIOS":"True","FFlagLuaAppUseGameSetTargetId":"True","FFlagLuaAppUseUIBloxToasts":"False","FFlagLuaAppUseWithLocalization":"False","FFlagLuaGameDetailsPolishV367":"True","FFlagLuaGameDetailsRenderTransparentBackground2":"True","FFlagLuaGameDetailsUseGothamInDarkTheme":"True","FFlagLuaHomeMoveMyFeedToMore":"True","FFlagLuaHomePeopleListV1V361":"True","FFlagLuaHttpUrlBuilder":"True","FFlagLuaInviteGameFixMessageAlignment":"True","FFlagLuaInviteGameTextLocalization":"True","FFlagLuaPageLoadEvent":"True","FFlagLuauBuiltinCalls":"True","FFlagLuauTypesInCoreScripts":"False","FFlagLuauTypesInCoreScripts2":"True","FFlagMakeAEGetAssetInfoPromise":"True","FFlagMalformedJoinBlobIsUnknownError":"True","FFlagMeasureJoinToOutsidersUse":"True","FFlagMegaReplicatorIsCloudEditInitialize":"True","FFlagMemoryFromAppShellReporterAndroid":"False","FFlagMigrateTriangleMeshData3":"True","FFlagMobileChatOneIcon":"True","FFlagModelInstanceCompletenessRefactor":"True","FFlagMouseServiceWantsToBeIndependent":"True","FFlagNavigationDebugDrawIterateSpiral":"True","FFlagNavigationFixPathUpdateEventCall":"True","FFlagNavigationFixPathUpdateImplCall":"True","FFlagNetworkDeprecateScopeNames":"True","FFlagNetworkDeserializePacketsInAJob":"True","FFlagNetworkStreamingPhysicsObserverInit2":"False","FFlagNoCollisionConstraintHumanoidFix":"True","FFlagNoFaceHeadMeshTag":"True","FFlagNoMoreCursorErrors":"True","FFlagNoSpaceAfterReturnInTextBox":"True","FFlagNotificationScript2UseFormatByKey":"True","FFlagOnlyCheckHeadAccessoryInHeadShot":"True","FFlagOptimizedPrimitivesHere":"True","FFlagOptmizedVec3Int32HasherEnabled":"True","FFlagPGSAdaptiveCollisionMarginFixEnabled":"False","FFlagPGSConstraintAlign2AxesCompliantCacheFix":"True","FFlagPartCastShadow":"True","FFlagPassDataModelDPIScale":"True","FFlagPluginActionSetChecked":"True","FFlagPluginActionSetDefaultShortcut":"True","FFlagPluginActionSetEnabled":"True","FFlagPluginManagementInStudio2":"True","FFlagPointsServiceNewEndpoints":"True","FFlagPurchasePromptPremiumEnabled2":"True","FFlagQuantumGuiClipScreenGuiToViewport2":"False","FFlagQuantumScrollingFrame4":"False","FFlagQueueUIEventsDuringLayout":"False","FFlagRCCSupportTeamTest":"True","FFlagRealtimeFriendsContextualMenuRefactor":"True","FFlagRecalculateAbsolutePlacementFix":"True","FFlagRecordHopperServiceStats":"True","FFlagRecordInGameDeaths":"False","FFlagRemoveKeyboardOnShutdownIOS":"True","FFlagRemoveOldPhysicsPacketCache":"True","FFlagRemoveUnlocalizedButtonText":"True","FFlagRemoveVehicleSeatCameraCFrameSet":"True","FFlagRenderAdornFixMdrColor":"True","FFlagRenderBiasGlassTint":"True","FFlagRenderFixDDSCubeLoad":"True","FFlagRenderFixEmojiPadding":"True","FFlagRenderMessagesAsGui":"True","FFlagReportExplicitAutoJointsJoinAll":"True","FFlagReportJoinAllCount":"True","FFlagReportRuntimeJoinCount":"True","FFlagReportTimeToPlay":"True","FFlagRetranslateOnTextScraperStart":"True","FFlagRoactPurchasePromptAllowBundles":"True","FFlagRoactPurchasePromptAllowBundles_PlaceFilter":"True;3155066112;3157761435;3204147952;189707","FFlagRotateCameraForRightPart":"True","FFlagSHAllowArbitraryLevelCount":"True","FFlagSHComputeExtentsTimeReportingEnabled":"True","FFlagSHStatReportingEnabled":"True","FFlagScrollingFrameDoNotProcessMouseCancel":"True","FFlagSendJoinTimesToDiag_PlaceFilter":"true;370731277","FFlagSeparateSendFromProcessMouseMove":"True","FFlagSignalStopForZeroWeight":"True","FFlagStartClearUnusedRefsJob":"True","FFlagStartWarningStoppers":"True","FFlagStopTheBrokenCursors":"True","FFlagStoreInstalledPluginsInCloud":"True","FFlagStreamingUISkipFirstPause":"True","FFlagStudioAnimationEditorCheckForSavedChanges":"False","FFlagStudioAnimationEditorClearEventNames":"True","FFlagStudioAnimationEditorContinueScrollingWithSelectionArea":"True","FFlagStudioAnimationEditorEnableRigSwitching2":"True","FFlagStudioAnimationEditorFixAnimationsWithLongNames":"True","FFlagStudioAnimationEditorFixEventsTooltips":"True","FFlagStudioAnimationEditorFixRenameKeyOption2":"True","FFlagStudioAnimationEditorFixRigSelection":"True","FFlagStudioAnimationEditorFixScalingBarPosition":"True","FFlagStudioAnimationEditorFixWorldSpaceJointPanel":"True","FFlagStudioAnimationEditorIKMode":"True","FFlagStudioAnimationEditorKeepClipboardAfterMove":"True","FFlagStudioAnimationEditorScaleKeys":"True","FFlagStudioAnimationEditorSelectEventsOnEdge":"True","FFlagStudioAnimationEditorShiftSelectJointsOn":"True","FFlagStudioAnimationEditorUseQWidgetsForPopups":"True","FFlagStudioAnimationEdtiorOptimizationsEnabled2":"True","FFlagStudioEnableSurfaceJoinChangeBeta":"False","FFlagStudioFixToolboxDialog":"True","FFlagStudioFixUnhandledRunTimeError":"True","FFlagStudioGameSettingsBindToClose":"True","FFlagStudioRemoveAxisWidget":"True","FFlagStudioUILibraryRoundTextBoxNoTooltip":"True","FFlagSurfaceGuiDefaultPixelsPerStud":"True","FFlagTSMk2ThrottleStreamJob":"True","FFlagTaskSchedulerSTDThreadwrapper":"True","FFlagTeamCreateSaveAnalyticsServiceApiKeyReplicator":"True","FFlagTenaciousGamePerfMonitor":"True","FFlagThrowDetailedMessageForBadEntries":"True","FFlagThwartPurchasePromptScams":"True","FFlagTighterCylinderBoundingSpheres":"True","FFlagTolerantLexerForStudio":"True","FFlagToolboxJointMigrationApi":"True","FFlagToolboxWithCMSV2":"True","FFlagTouchEventSameSHCellBugFixEnabled":"True","FFlagTrackCurlTimeProfile":"True","FFlagTrackEventWithArgsEnabled":"True","FFlagTrackResetCharacterButtonUsage":"True","FFlagTweenServiceGetValueEnabled":"True","FFlagUDim2FromScaleAndOffsetConstructors":"True","FFlagUIInlineLayout2_PlaceFilter":"True;3299508970;3299511698;3299515879","FFlagUIViewportFrameSetCameraNearZ":"True","FFlagUniverseIdChangedEvent":"True","FFlagUpdateExtentsForManualStep":"True","FFlagUpdateInspectAndBuyOffsaleText":"True","FFlagUpdateScaleBeforeBuildRig":"True","FFlagUrlSupportNewGamesAPI":"True","FFlagUseAccuratePlaySoloForced":"True","FFlagUseAdvancedCharacterScales3":"True","FFlagUseBaseUrlInPlugins":"True","FFlagUseHipHeightInKeyframeSequences2":"False","FFlagUseKeyframeMarkersForEvents2":"True","FFlagUseLDLPGSSolver4":"True","FFlagUseLuaGameDetailsOnIPad":"True","FFlagUseLuaGameDetailsOnIPhone":"True","FFlagUseMTSolver":"True","FFlagUseMatrix3ForInertiaTensor2":"True","FFlagUseNewSpatialHash5":"True","FFlagUseNewTriangleMeshPart":"True","FFlagUseNormalWeld":"True","FFlagUseOptimizedGetPartsObscuringTarget":"True","FFlagUseOtterMasterForLuaApp":"True","FFlagUseVectorForDirtyMechanisms":"True","FFlagUserAllCamerasInLua":"True","FFlagUserAnimationSpeedDampening":"True","FFlagUserClickToMoveFollowPathRefactor":"True","FFlagUserFixChatMessageLogPerformance":"False","FFlagUserFixChatMessageLogPerformance2":"False","FFlagUserInGameChatUseNewFilterAPIV2":"True","FFlagUserIsNowADynamicThumbstick":"True","FFlagUserJSONConvertInfAndNanToNull":"True","FFlagUserJumpButtonPositionChange":"True","FFlagUserNavigationClickToMoveNoDirectPath2":"True","FFlagUserNavigationClickToMoveSkipPassedWaypoints":"True","FFlagUserNavigationClickToMoveUsePathBlocked":"True","FFlagUserNavigationFixClickToMoveJump":"True","FFlagUserNewCameraRaycastingAPIsEnabled":"True","FFlagUserNoMoreKeyboardPan":"True","FFlagUserNoUpdateOnLoop":"True","FFlagUserRbxUtilityCreateSetParentLast":"True","FFlagUserShouldClipInGameChat":"True","FFlagUserShouldLocalizeGameChatBubble":"True","FFlagUserShouldLocalizeServerMessages":"True","FFlagUserTheMovementModeInquisition":"True","FFlagUserThirdGamepadZoomStep":"True","FFlagUserToolR15Fix":"True","FFlagUserTouchSensitivityAdjust":"True","FFlagUserUseCachedFriendChecksForChat":"False","FFlagUsingSendMeasureBatch2":"True","FFlagVerifyBuiltInPlugins":"True","FFlagWebLocMarkLocTableListDirtyOnServer":"True","FFlagWhateverFloatsYourContact":"True","FFlagWhitelistThumbnailsAPI":"True","FFlagXboxAppBridgeRewrite2":"False","FFlagXboxDetachShowAccountPicker2":"True","FFlagXboxFixAwardedBadges":"True","FFlagXboxGetLocaleFromAccount":"True","FFlagXboxKeyboardInitInCallbacks":"True","FFlagXboxStartGameRefactor":"True","FFlagXboxValidateConnectPeer":"True","FFlagXboxVoiceChatFixes":"True","FFlagXboxVolumeFadesInCallbacks":"True","FFlagYouDontKnowMe":"True","FIntAntiSpamSpamLimit":"1000","FIntAppShellFPSReportPeriod":"120","FIntAppShellMemoryReportPeriodicity":"120","FIntAvatarEditorNewCatalogButton2":"100","FIntCameraFarZPlane":"100000","FIntCameraMaxZoomDistance":"400","FIntCurlProbePermyriad":"10000","FIntDelayBeforeFirstPostStatsSeconds":"180","FIntEnableFriendFooterOnHomePageV369":"100","FIntJointTime_TextureCooldown":"0","FIntLuaAppNonFinalThumbnailMaxRetries":"1","FIntLuaAppPercentRollOutNewThumbnailsApiV3":"100","FIntLuaAppRenderTransparentPageMaxCount":"1","FIntLuaAppUseNewAvatarThumbnailsApi4":"0","FIntMaxCameraMaxZoomDistance":"100000","FIntMaxLevelForAnchored":"3","FIntPGSAngularDampingPermilPersecond":"950","FIntPGSPStageStiffnessWorseFitnessThreshold":"2","FIntPGSVStageStiffnessAggressiveValue":"99995","FIntPGSVStageStiffnessConservativeValue":"99000","FIntPGSVStageStiffnessWorseFitnessThreshold":"2","FIntPartMinSizeMul1000":"50","FIntPercentLuaGameDetailsPageOnAndroidPhone":"100","FIntPercentLuaGameDetailsPageOnAndroidTablet":"100","FIntPercentReportingByCountryCode":"100","FIntPercentReportingGamesListRTT":"5","FIntPercentReportingGamesSortsRTT":"50","FIntPercentReportingLeaveGameAnalytics":"10","FIntTaskSchedulerAutoThreadLimit":"8","FIntTeleportMethodAnalyticsHundredthPct":"100","FLogFastLogValueChanged":"0","FLogNetwork":"7","FStringABTestNameIPhoneLuaGameDetails":"iPhone.AllUsers.LuaGameDetails2","FStringStudioUrlSurfaceJoinChange":"https://web.archive.org/web/20200624170102/https://devforum.roblox.com/t/changes-to-part-surfaces-beta-feature/334420","SFFlagFixBallRaycasts":"True","SFFlagFixRaysInWedges":"True","SFFlagNetworkUsePeerId":"True","SFFlagPgsForAll":"True","SFFlagUseNativePathWaypoint":"True","EnableBackupCookie":"True","FFlagFixGamepadNavigationWithACM":"True","DFFlagSpawningDontIgnoreCanCollide":"True","FFlagFixBackpackDraggingReset":"True","FFlagFixBindActionTouchButtonError":"True","FFlagFixGetStringForKeyCodeDeadKeyState":"True","DFFlagEmoteThumbnailsRotationEnabled":"True","DFFlagDataStoreInitialThrottlingBudgetFix":"True","DFFlagStreamQuotaRoundUp":"True","DFFlagNaivePacking":"True","DFIntPercentageThresholdUsingFriendsV2":"0","DFFlagNetworkUseSharedStreamingObserver2":"False","FFlagStudioLogPluginSettingsFileAccess":"True","DFFlagTrackRunUpdateCycleTime":"False","DFIntTrackRunUpdateCycleReportInfluxPermyriad":"1000","FFlagXboxAppBridgeRewrite3":"False","DFFlagFixStudioDegenerateMouseRaycast":"True","FFlagStudioDisableAutoClosingInComments2":"True","FFlagVersionControlServiceForceDraftsUsage_PlaceFilter":"True;4203193037;2772125205;3069606769;4094440665;2413179002;3344058302;3566618597;4041475807;2061558182;4074515213;2309740430;2670461983;4137940225;3096515841;4133172402;4163865257","FFlagStudioCrashOnInvalidColor3Cast":"True","FFlagStudioFixAnimEditorDescendants":"True","FFlagStudioHoldDataModelLockAtBreakpointHit":"True","FFlagBadgeApiV1UserHasBadge":"True","FIntBadgeApiV1UserHasBadgePercentage":"100","FFlagLuaAppRefreshScrollingFrameRefactor2":"False","FFlagEnableGameSignalRWithOSX1":"True","DFFlagDoNotDecrementPendingNewInstancesWhenProcessingDelete":"True","FFlagStudioDoNotSaveWhenUserSaysNo":"True","FFlagRoactGameSharePageV2":"False","FFlagStreamingParallel2":"False","DFIntDesiredStreamJobTimeMS":"24","FFlagLuauTranspilerCompliance":"True","FFlagCanWeAddContinue2":"True","FIntLuaChatUseNewFriendsEndpoints":"25","DFFlagSDISkipJDINetworkStream":"True","FFlagFixAnimEditorManipulators":"True","FFlagFixRigUtils":"True","FFlagNewCharacterSoundScript":"True","DFFlagFixManualJointAdornCrash2":"True","DFFlagUpdateCofmUseHeapStack2":"True","FFlagFixLightgridAsyncInvalidations":"True","FFlagUseCorrectLocaleForPluginGuis":"True","FFlagCLI29967":"True","FFlagLocalizePlaceholderText":"True","FFlagGraphicsMetalFixD16Check":"True","FFlagGraphicsAdrenoDisableExtFmt":"False","FFlagGraphicsVulkanAndroidExtendedFormats2":"False","FFlagGraphicsGLAndroidExtendedFormats2":"False","FFlagStudioLuauLinter":"True","FFlagLuauExtendedLiterals":"True","FFlagCLI27641B":"False","DFFlagAnalyticsNS1BeaconSupportLimitedRobloxUrls":"True","DFFlagFixPriorityAscDesc":"True","FFlagLuaAppSecondaryButtonSpecifiesFont":"True","FFlagNetworkDeserializePacketsInAJob_PlaceFilter":"False;2291717546","DFFlagAsyncPublishImprovement":"True","FFlagQuantumScrollingFrame5":"True","FFlagClampCanvasPositionInLayoutStep":"False","FIntStudioBFRolesetSaveToCloudV2":"4","FFlagSocialLibraryEnabled":"True","FFlagStudioMeasureRigidJointsNotInWorld":"True","FFlagStudioDoNotShowHideAutoCompleteMenuV2":"true","FFlagStudioClearCallStackWidgetOnGSTChange":"true","FFlagEnableInputObjectIsModifierKeyDown":"True","FFlagStudioRefactorPlaceSessionModel3":"true","FFlagApplyModifiersToInputObjects":"False","FFlagStudioRelayQtModifiersToRobloxInput":"False","FFlagUseRoactPlayerList":"False","FFlagStudioFixCannotSetBreakPoint":"True","DFFlagDontSendEmptyTouchPackets":"True","DFFlagParallelAddInstanceWhenParalleStream":"True","FFlagStudioLoadLesserQtTranslationFiles":"True","DFFlagLuaDebuggerDoNotResetStackForLuaThreadWithError":"True","FFlagStudioGamePresenceToFixSyncCallHangWhenQuit":"True","FFlagStudioFileLockRelatedFixes":"True","FFlagEnableReturnKeyPressedEvent":"True","FFlagMultipleBoxesManualFocusRelease2":"True","FFlagXboxLocV2":"True","FFlagStudioShowVariableTooltipOnErrorLine":"True","FFlagEnableLegalText":"True","FFlagStudioCheckArgPhraseForInFunctionCall":"True","FFlagStudioNewFoldState":"True","FFlagDoNotLoadUnverifiedBuiltInPlugins":"true","FFlagLuaAppPreloadChatRefactor":"True","FFlagLuaAppDeepLinkEventReceiver":"True","FIntAvatarEditorRedesignRolloutPercentageAndroidPhone":"100","FIntAvatarEditorRedesignRolloutPercentageAndroidTablet":"100","FIntAvatarEditorRedesignRolloutPercentageIphone":"100","FIntAvatarEditorRedesignRolloutPercentageIpad":"100","FIntAvatarEditorRedesignRolloutPercentageOther":"100","FIntLuaCatalogRolloutPercentageAndroidPhone":"100","FIntLuaCatalogRolloutPercentageAndroidTablet":"100","FIntLuaCatalogRolloutPercentageIphone":"100","FIntLuaCatalogRolloutPercentageIpad":"100","FIntLuaCatalogRolloutPercentageOther":"100","FFlagLuaAppEnableAERedesign3":"True","FFlagLuaAppEnableLuaCatalogPage3":"True","FFlagUseCreationToFetchMyOverrideData2":"True","FStringStudioUrlAnimationEditor":"https://web.archive.org/web/20200624170102/https://devforum.roblox.com/t/keyframes-animate-everything-around-me/360033","FFlagGraphicsVulkanPixelbookDisable":"True","FFlagLuaAppGameplayIntentReferralSource":"True","FFlagEnableAndroidSetPendingTagOnContactFriendRequest":"True","DFFlagUseDefaltShirtAndPants2":"True","FIntLuaChatAliasesRolloutV3":"0","FFlagEnableContactsApiServiceV2":"True","DFFlagESGamePerfMonitorEnabled":"True","DFIntESGamePerfMonitorDelayBeforeFirstReportInSeconds":"60","DFIntESGamePerfMonitorHundredthsPercentage":"200","DFIntESGamePerfMonitorReportTimerInSeconds":"30","DFFlagStrictOggParsingFix2":"True","DFFlagStrictOggParsingSeekFix":"True","DFFlagReportMoreParsingAnomalies":"True","DFIntReplicatorJoinSnapInfluxHundrethsPercentage":"50","FFlagPackageRemoveJointInstanceWhenHashing":"True","FFlagStudioPackageVersionCheckInEditDMOnly":"True","FFlagStudioAddPackagePermissions":"True","DFFlagHandleLowTriggerStreamingGC":"True","DFFlagAvoidVelBufWhenGC":"True","DFFlagInitialSourceHashConsistencyFix":"True","FFlagStudioShowDotsForScriptEditors":"True","FFlagStudioDraftsServiceGetEditors":"True","FFlagMeasureRigidJointsNotInWorld":"True","FFlagCMSRemoveAssetTypeBackendMap":"True","FFlagCMSRemoveUGCContentEnabledBoolean":"True","FFlagStudioUseNewMergeDialog":"True","DFFlagVersionControlServiceBroadcastOnEditorsChange":"False","FFlagUserFixMouseCapture":"False","FFlagNotGroundhogsDay":"True","FFlagCrossDmScriptingInPlugins":"False","FFlagPluginMDIInterface":"False","FFlagStandalonePluginsSupport":"False","FFlagUnfocusTextBoxBeforeAncestorEvent":"true","FLogError":"6","FFlagRenderShadowmapCheckCB":"True","FFlagRenderFixEvsmFiltering":"True","FIntLuaAppUseNewAvatarThumbnailsApi5":"100","FFlagRenderFixHamArray":"False","FFlagCautiouslyInitilaizeSoftwareCursorVisible":"True","DFFlagLuaTableExts":"True","DFFlagLuaMathLog2":"True","FFlagStudioCheckCanPublishBeforePublishing":"False","DFFlagCacheExistingPackageVersionData":"True","FFlagStudioPackageLinkAutoUpdateIndicatorFixes":"True","FFlagStudioAddUpdatePublishedPackageReturnResult":"True","FFlagReportGameJoinLoadTime":"True","FFlagNoJoinForMoveTo":"True","FFlagUserSiblingTouchGui":"True","FFlagStudioUseNewDefaultNameEndpoint":"True","DFFlagPlayerConfigurerDoCDNProbe2":"True","FIntAppBridgeNewGameJoinAPIPercent":"0","EnableLuaAppOnChrome":"True","FFlagLuaChatAddButtonThemeFixEnabled":"True","FStringGraphicsVulkanBlacklist":"","EnableAndroidSetTagOnContactAcceptFriendRequest":"True","FFlagUseNewFriendsDomainCoreScripts":"True","FFlagStudioLoadPluginsAtRightTime":"False","FFlagStudioRestoreWindowsASAP":"False","FFlagLuaAppFixPrimaryStatIconColor":"True","FFlagAvatarEditorRTranslations":"False","DFFlagPolicyServicePlayerCallbackQueuesEnabled":"True","FFlagNoDisconnectEventBeforeUnmountWorkaround":"True","FFlagNewABTestFramework2":"True","FFlagLuaChatShareGameThumbnailMigrationV2":"False","FFlagShareGameEventConsolidationEnabled":"True","DFFlagLoadLibraryWarn":"True","FFlagLuauLimitRecursiveBlocks":"True","FIntCLI30390":"2","DFFlagNetworkUseSharedStreamingObserver4":"False","FFlagNetworkStreamingPhysicsObserverInit4":"False","DFFlagReportPhysicsReplicationRatio":"True","FFlagStreamingParallel3":"True","DFFlagFixPhysSenderParallelSimDistanceUpdateValue":"True","DFFlagGCJobInitNegativeLastSentServerRadius":"True","DFFlagServerPlaceIdKnownAssetEndpoints":"False","FIntStudioBFRolesetAsyncPublish":"4","FFlagAvatarEditorSimultaneousFullViewAvatarTypeFix":"True","FFlagLuaAppFixCancelButton":"True","FFlagLuaChatAliasesV3":"False","DFStringLoadLibraryWarnLink":"https://web.archive.org/web/20200624170102/https://devforum.roblox.com/t/loadlibrary-is-going-to-be-removed-on-january-6th/382516","FFlagLuauBetterTypeLint":"True","DFFlagFixGetPropertyChangedSignalMemoryLeak":"True","FFlagStudioAsyncSingletonManagement":"False","FFlagStudioAsyncSaveAs":"False","FFlagStudioCloudEditUserDataloadDataAsyncCrashFix":"True","DFFlagPackageFixJsonParserCrash":"True","FFlagEditAssetForManagedAssets":"True","FFlagShowReportOptionInToolbox":"True","DFIntReportReplicatorStatsToInfluxHundredthsPercent_PlaceFilter":"10000;3027055174;3917136599;2291717546","FFlagStudioAutoSaveReportNullCheck":"True","FFlagStudioCloseDocumentsOnce":"true","FFlagStudioCheckForBadTeamTestResponse":"true","FFlagStudioWhatsNewWindow":"True","FFlagStudioAddWhatsNewWindowToStartPage":"True","EnableTencentLinkingFeature":"False","LuaAppHideGameDetailsDeveloperRow":"True","FFlagGridUseConstRows":"True","DFFlagInvokePreloadCallbackFromDMJob":"True","FFlagFixColorPickerAppearingInWrongLocation":"True","FFlagAdditionalFallbackFonts":"True","FFlagDefaultThumbnailForRBXThumb":"True","FFlagEnableCredentialsValidationMigration":"True","FFlagEnableAccountSettingsMigration":"True","FFlagManualFocusReleaseDisablesSinking":"True","FFlagEnablePackageMassUpdateNestedPackage":"True","FFlagNewAwardBadgeEndpoint_PlaceFilter":"True;2534981557","DFStringAltTelegrafAddress":"100.20.191.133","DFIntAltTelegrafHundredthsPercent":"10000","DFIntClientJoinProcessPositiveSamplesThousandths_PlaceFilter":"1000;3027055174;3917136599;2291717546","FFlagMacStudioReportBFsAndPlugins":"True","FFlagPCStudioReportBFsAndPlugins":"True","DFFlagStudioShowToastNotificationInMainThreadAsync":"True","FFlagEnableGameSignalRWithWindows1":"False","FFlagUserFixZoomClampingIssues":"True","FFlagRbxThumbAllowAnyParamsOrder":"True","FFlagBetterRbxThumbRetryLogic":"True","DFIntBatchThumbnailMaxRetries":"5","FFlagUserChatNewMessageLengthCheck":"False","DFFlagTrackStencilBufferSupport":"False","DFFlagEnableSSEClamp":"True","FFlagCMSEnableCatalogTags":"False","FFlagAvatarEditorEnableLuaAuthenticationCheck":"True","FFlagParentWeldToOtherPart":"True","FFlagEnableLargeRobuxAndroidUpsellV3":"True","FStringStudioBuiltinPluginDefaultFont":"SourceSans","FFlagStudioLogTestUsage":"True","FFlagEnableRobuxHexIconV2":"True","FFlagStudioGameSettingsUseNewSettingsImpl2":"False","FFlagStudioStopHardcodingDecadeOfDifferentDevhubDomains":"True","FFlagResetKeyStatesOnWindowGainFocus":"True","FFlagApplyModifiersToInputObjects2":"True","DFFlagCurlReportResolvedIp":"True","DFFlagInfluxReportLastVisitedUrl":"False","FFlagUsingBrowserServiceCaptcha":"True","FFlagBrowserServiceForAllPlatforms":"True","DFFlagFixGuardTiming":"True","FFlagUseNewDocumentationUrls":"True","FFlagStopCaringAboutIsTouchDevice":"False","FFlagScrollingFrameSinkMouseDownOnScrollbar":"True","FFlagRoundInUDimLerp":"True","DFFlagUseAPIAssetsVersionsV2":"True","DFFlagVersionControlServiceBroadcastOnEditorsChangeExplicit":"true","FFlagStudioSandboxUtf8Fix":"true","DFFlagHttpClientCacheStatsLock":"True","FFlagAnimEditorUseCustomFPS":"True","FFlagDevConsoleLogMemoryButton":"True","DFFlagEnableHttpProxy":"False","FFlagPlayerListDontSinkTouchUnnecessarily":"True","FFlagPlayerListBetterGroupCheck":"True","FFlagPlayerListDontSortTeamsByScore":"True","DFFlagBetterAddInstance":"True","DFFlagEasingRefactor":"True","FFlagStudioFixConstantReconnectPopups":"True","FFlagStudioUpdateWhatsNewDevForumUrl":"True","DFFlagFixSoundReplicationForTeamCreate":"True","FFlagEnableSetStageNoneInDestroy":"True","DFFlagTaskSchedulerEraseDone":"True","DFFlagTaskQueueLinger":"True","FFlagLuaAppNewThumbnailFinalState":"True","FFlagGraphicsMetalMacIncMinSpec":"True","FFlagQueueUIEventsDuringLayout2":"True","FFlagLuaAppUseGameMediaV2":"True","LuaAppHideGamesDropDownList":"True","FFlagNotEraseCallbackQueueOnPlayerRemoving":"True","DFFlagModifySoundAssetsAssetListStringSeparator":"True","DFIntReportFMODInitThreadingRate":"0","DFFlagCheckFMODInitThreading":"False","DFFlagHttpRequestClearRes":"True","DFFlagSignalRControlExcStringFix":"True","DFFlagFileSystemCheckReadSize":"True","FFlagInfiniteTriangleMeshRecalcFixEnabled":"True","FFlagStudioReportOSVersionDiag":"True","FFlagSolverRemoveBadDebugCode":"True","DFFlagLDLEliminationPerformanceFixEnabled":"True","DFFlagOptimizeTerrainStreamOut":"False","DFFlagTerrainPhysicsDataDeferredSquared":"True","FFlagTerrainUseClumpedPhysicsData":"True","FFlagStudioFixSelectAll":"True","FFlagStudioEnsureEditDataModel":"True","FFlagGetVersionHistoryAssetFailure":"True","DFFlagReportReplicatorJoinDataItemStatsToInflux":"True","DFIntReplicatorJoinDataItemStatsInfluxHundrethsPercentage":"1000","FFlagStudioUseStandaloneTransformTool2":"True","FFlagGraphicsClampDepthBias":"True","EnableManualFocusReleaseSupport":"True","FFlagAnimEditorRenameKeyOptionFix":"True","FFlagStudioToolboxEnablePlaceIDInAnalytics":"True","FFlagStudioToolboxInsertAssetCategoryAnalytics":"True","FFlagStudioEnableSaveToCloudV2BetaFeature":"False","FFlagStudioSaveToCloudV2":"False","FFlagStudioSaveToCloudV3":"False","FFlagStudioSaveToCloudV3SpotFixes":"False","FFlagAvatarEditorUseUserIdFromStore":"True","FFlagUseLocalStorage3":"True","DFFlagPlayerPolicyNotSwallowingError":"True","DFFlagDontWalkOnReparent":"False","FFlagStudioWhatsNewWindowBeta":"False","FFlagCreateAndUpdateDataReplicationCache":"False","DFFlagSupportJoinDataItemV2i":"False","DFIntReplicatorJoinDataItemV2StatsInfluxHundrethsPercentage":"1000","FFlagFutureIsBrightPhase2_5_v3":"True","FFlagFlipTerrainNormalMap":"True","FFlagUIViewportFrameDeviceRestore":"True","FFlagStudioTextEntryRoactBugPatch":"True","FFlagStudioGameSettingsUseNewSettingsImpl3":"True","DFFlagLoadLibraryTrack":"True","DFFlagRCCTeamCreateSaveOnZeroPlayers":"True","FFlagCLI30496":"True","FFlagStudioEnableAsyncPublishBeta":"False","FFlagStudioMassUpdateWaitForAsync":"False","FFlagStudioCheckFailedPublishOnClose":"False","FFlagStudioMakePublishingAsync":"True","FFlagStudioPruneModeratedInstalledPlugins":"False","FFlagStudioWaitForContentLoadedToLoadPlugins":"False","FFlagSetContentLoadedBitBeforeEmittingSignal":"True","FFlagStudioLoadPluginsAtRightTime2":"False","FFlagStudioUseStandaloneCollisionEditor2":"True","FFlagStudioFixCancelTeamCreate":"True","FFlagGraphicsVulkanAndroidExtendedFormats3":"True","FFlagGraphicsGLAndroidExtendedFormats3":"True","FFlagGraphicsAdrenoDisableExtFmt2":"True","DFFlagEvenMorePhysicsSenderStats":"True","DFFlagAddStreamingAdornDebugger":"True","FFlagVersionControlServiceScriptCollabEnabled":"True","FFlagCMSEnableCatalogTags2":"True","FFlagStudioRemoveCouldNotFetchAssetVersionData":"True","FFlagStudioPackagePermissionRGEFix":"True","FFlagStudioEnablePackagePermissionsBetaFeature":"False","FFlagHideNoAccessGroupPackages":"true","FFlagPackagePermissionsAddDefaultNone":"true","FFlagStudioEnableAnimationEditorBeta":"False","FFlagEnableRoactAnimationEditor2":"True","FFlagFixGameSettingsThumbnailDrag":"True","DFFlagFixParallelCoarseMovementCallbacks":"True","FFlagUseStudioLocaleForForceLocale":"True","FFlagFixUnicodeTextSelection2":"True","FFlagStudioEnableNewScriptFoldStateBeta":"False","FFlagDarwinUseNewMemoryMetrics":"True","FFlagStudioCheckIfDefaultFontLoaded":"True","DFIntPackagePermissionPullingIntervalInSeconds":"10","FFlagPlayerPolicyHttpRequestHealthReportEnabled":"True","DFFlagPlayerPolicyHttpRequestRetryEnabled":"True","DFFlagDressInLayers2":"true","DFFlagRCC29411p3":"true","FFlagReduceRelentlessRemoteReminders":"true","FFlagAlwaysGenerateGuid":"true","DFFlagRebuildR6AccoutrementsWhenEnteringWorkspace":"True","FIntPlayerPolicyHttpRequestRetryTimes":"3","FFlagTerrainToolsFixScrollBarResize":"True","DFFlagFixPerSecDivideStats":"True","DFIntRccLinuxMemoryMegaByteLimit":"7000","FFlagStudioValidateToSAcceptance":"True","FFlagLuaAppSingleTriggerForLocalPlayerManager":"True","FIntStudioBFRolesetPackagePermissions":"4","FFlagGlslesMediump1":"False","FFlagGlsles3Mediump1":"False","FFlagStudioCheckLocaleNameBeforUse":"True","FFlagBypassDoubleInitialization":"True","FFlagFixGameViewControllerViewRecreation":"True","FFlagFetchLocalUserHeadshotInFetchHomePageData2":"True","FFlagStudioMoveAboutWindowCode":"True","FIntLuaChatUseNewFriendsEndpointsV2":"100","FFlagLuaCatalogFixLongPriceText":"True","FFlagLuaCatalogUseOriginalInsufficentRobuxIcon":"False","FFlagCatalogResellerUseNewGridView":"True","FFlagPasswordFieldIntegrationEnabled":"True","FFlagLuaAppCanDisableBackNavigation2":"True","DFFlagStopRestreamInstancesWithoutParent":"True","FIntRenderGrassHeightScaler":"50","FFlagRenderDecorationGrass":"True","DFFlagLDLPGSCollisionStatsEnabled":"True","DFFlagPlayerPolicyUseClientIpAddressFromSessionId":"True","FFlagAppBridgeRewritePatch1":"True","FFlagPlayerListDesignUpdate":"True","FFlagUseRoactPlayerList2":"False","FFlagUpdateLeaderboardIconPriority":"True","FFlagNewPlayerListFixBackpackMemoryLeak":"True","FFlagStudioFixPackageKeepsPullingAssetVersionId":"True","FFlagStudioFixBindToClose2":"True","FFlagStudioFixUILibDropdownStyle":"True","FFlagStudioUseDevelopAPIForPackages":"True","FFlagStudioGetSharedPackagesInToolbox":"True","FFlagExtTrackpadsMasterSwitch":"True","FFlagExtTrackpadsUseHeuristics":"True","FFlagLuaAppEnableBacktraceErrorReport":"True","FFlagStudioCorrectlyDeprecateProp_UITheme":"True","FFlagStudioCheckDataModelAfterSave":"True","FFlagStudioTranslateThemePropertyItem":"True","FFlagTerrainToolsImproveColorImport":"True","DFFlagStudioThrowExceptionForCyclicTables":"True","FFlagStudioIntInBoolContextWarningFixEnabled":"True","FFlagStudioCorrectPublishAnalytics":"False","FFlagStudioDisableAutoSaveToCloud":"True","FFlagStudioConnectPublishAsClose":"False","FFlagStudioFixDMThreadingIssueForPublishAs":"False","FFlagStudioCloseScriptsOnUiThread":"True","FFlagStudioAnalyticsIdeDocCheck":"True","FFlagFixOverZealousTextWrapping":"True","FFlagStudioReplaceDMLockWithTask":"True","FFlagDisableDecorationForLeafyGrass":"True","FFlagTerrainToolsClearConfirmationDialog":"True","FFlagTerrainToolsFixSmoothDesiredMaterial":"True","UseSetForegroundWindowForPlayer2":"True","FFlagTerrainToolsUIUpdate":"True","FFlagEnableiOSFriendFinderAndContactFriendingAnalytics":"True","DFFlagFixCharPosNaNCompare":"true","FFlagBulletInitialContactDivideByAxisLength":"True","FFlagStudioAddLoadUserPluginsArgument":"True","FFlagStudioCheckForBadTeamTestResponse2":"True","FFlagAvatarExperienceConsistentRolloutValue":"True","FFlagDebugDeleteDiscrimination":"True","FFlagStopCaringAboutIsTouchDevice2":"True","FFlagSkipLowResFix":"False","DFFlagTaskSchedulerEnsureCOMIsInitialized":"True","FFlagFutureIsBrightPhase2GL3":"False","FFlagFutureIsBrightPhase2GLES3":"False","DFFlagFixNullTask":"True","FIntLuaAppBacktraceErrorReportPercentage":"20","FFlagLuaAppInputValidationActionUsesCurrentText":"True","DFFlagPGSConstraintThreadSafeUpdatePVEnabled":"True","FFlagArrayDynamicPopBackBugFix":"True","FFlagStudioDeprecateRecentSave":"True","FFlagStudioConvertToPackageUploadErrorDisplay":"True","FFlagStudioRemoveDuplicatePackageStatusChangedSignal":"True","DFFlagHideProxySettings":"True","FFlagFixBuiltinPluginSecurityLevels":"True","FFlagStudioGameSettingsUseRoact1_2":"True","FFlagLuaCatalogLimitSellPriceDigitsTo10":"True","FFlagEnableLumberyak":"True","DFFlagHumanoidOnlyStepInWorkspace":"False","DFFlagRemoveUsesOfIsAutoJoint":"True","DFFlagAnimatorNewModelSearchAnalytics":"False","FFlagFixTableLayoutMinorAxisSortOrder":"True","DFFlagBetterStreamingHumanoidSimulationFiltering":"True","FFlagUIGradientEnabled":"True","FFlagLuaAppGameGridNewMetrics":"True","FFlagShowModeratedPluginInfo":"True","FFlagGameDetailsPeekViewAnalyticsEvents":"True","FFlagLuaAppABTestGameDetailsPeekView":"True","FFlagLuaAppInitializeABTests":"False","FFlagRemoveItemASHX":"True","DFLogTrackTeamCreateSaveMD5HashOutput":"6","FLogStudioLocalSaveMD5HashOutput":"6","DFFlagAnimatorAnimationPlayed":"True","FFlagUserMakeThumbstickDynamic":"False","FFlagCLI30497":"True","FFlagCLI30497R":"True","FFlagCLI30497B":"false","FFlagCLI30497W":"True","FFlagCLI30497H":"True","FFlagCLI30497S":"True","FFlagLuaAppFriendsAnalyticsOnStartup":"True","DFFlagNoExceptionForSimulatingOwnCharacterOutsideStreamingRegion2":"True","FFlagNetworkStreamingPhysicsObserverInit6":"True","DFFlagNetworkUseSharedStreamingObserver6":"True","DFFlagOptimizeTerrainStreamOut2":"True","DFFlagPartInstanceCofMPropertyExposed":"True","DFFlagLDLPGSAdditionalStatsEnabled":"True","DFFlagHttpServiceUseIpBlacklist":"True","DFFlagNotifyModelCompleteness3":"True","DFFlagCompletenessClientCreatesInstanceFix":"True","FIntCLI30497I":"2048","DFFlagJumpScaresP2":"True","FFlagAvatarExperienceUnselectTryOnFix":"True","FFlagAvatarEditorUpdateRecommendations":"True","FFlagAvatarEditorTweenMinimizeButton":"True","DFIntDesiredStreamJobTimeMSPerThread":"6","FFlagWindowsTouchEnabled":"False","FFlagTouchscreenSupport":"False","FFlagUserChatHistorySinksInput":"True","FFlagLinearFXBlurFix":"true","FFlagRenderEnableDepthClamp":"True","DFFlagFixExtraMemoryComputation":"true","FFlagXboxFixEngagementLayout":"True","FFlagLDLAkisMethodEnabled":"True","FFlagCheckGameStateOnResume":"True","FFlagLuaCatalogInfoRowEclispe":"True","FFlagLuaCatalogKeepSellAlertPositionWithKeyboard":"True","FFlagGlsles3MediumpNoHQ1":"True","FFlagCheckDataModelStateInTeleport":"True","FFlagFixACMOverlappingIssues":"True","FFlagVideoSupport":"True","DFFlagHttpsTextFilter":"True","DFIntHttpsTextFilterPercentRollout":"100","DFFlagNoSharedPinocchio":"True","DFFlagSupportMeshV4Read":"True","FFlagIssueTrackerRefactor":"True","FFlagApplyPlaceFilterEarly":"True","DFFlagAniCombinedServerPassthrough":"True","FFlagOverrideMouseBehaviourFireChanged":"True","FFlagUpdateSettingsHubGameText":"False","DFFlagNewMemoryLevelCheck":"True","DFFlagFixPreloadAsyncCallbackCrash":"True","FFlagSmallerToolboxMinWidth":"True","DFFlagRakNetUseSelect":"True","FFlagDeliverLowMemoryWarningsViaPolling":"False","FFlagStudioDraftsServiceRemovedScriptsFix":"True","FFlagEnableScaleIndependentBulletCollision2":"False","FFlagStudioLogPlaceIdOnPlaceOpen":"True","FFlagStudioDraftsDeletePreferSafeOption":"False","FFlagStudioLoadPluginsAtRightTime3":"True","FFlagStudioFixOgreWidgetCheckInPlaceSessionMainView":"True","FFlagStudioReplaceDMLockWithTaskIfNotOnMainThread":"True","FFlagStudioTranslationsTail001":"True","FFlagStudioTranslationsTail002":"True","FFlagFixMouseInStandaloneWidgets":"True","FFlagStudioPruneModeratedInstalledPlugins2":"True","FFlagStudioDoNotStoreSelectionListInPropertyWidget":"True","FFlagStudioCleanupPluginWidgetRelayViewBase":"True","FFlagGraphicsD3D9GracefullyHandleBadWindowHandle":"True","FFlagStudioCleanupPluginRefresh":"True","FFlagStudioDisconnectIDEDoc":"True","FFlagAllowLuauTypes":"True","FFlagUserChatValidateFirst":"True","FFlagDontCountHorizontalScrollsForExtTrackpad":"True","FFlagLuauOptimizeTableVarargs":"True","DFFlagLuauFasterTableLibrary":"True","FFlagLuauImproveLineInfo":"True","DFFlagNetworkUseSharedStreamingObserver6_PlaceFilter":"True;2096931771;900578327;2096931771;2293712847;4498778926","DFFlagStrictParsingFix":"True","FFlagTerrainToolsFixNilBrushProperties":"True","FFlagTerrainToolsUseFragmentsForToolPanel":"True","FFlagTerrainToolsFixPlanePositionErrorMessage":"True","FFlagTerrainToolsFixGettingTerrain":"True","FFlagTerrainToolsOffsetGenerationNoise":"True","FFlagPlayerPolicyHttpRequestHealthReportToInfluxEnabled":"True","FFlagLDLUseStasisCache":"True","FFlagIgnoreModalGuiWhenScreenGuiIsDisabled":"True","FFlagMarkAppearanceDirtyWhenUIPaddingChanges":"True","FFlagFixHorizontalScrollBarGaps":"True","DFFlagFixScalingValueReplicationWarn":"True","DFFlagStudioFixJoinSurfacesDisabled":"True","FFlagStudioEnableLuauTypeCheckingBetaFeature":"True","FFlagLuaAppBacktraceReportBaseUrl":"True","FFlagLuaChatAliasConfig_GlobalErrorWillDisable":"True","FFlagLuaChatAliasConfig_UserIdErrorWillDisable":"True","FFlagLuaChatPlayTogetherGameIconFix":"True","FFlagFetchAliasesOnStartup":"True","FIntLuaChatAliasesRolloutV5":"100","DFFlagUsePugiForAbuseReport":"True","FFlagXboxUpdateSessionChecker":"True","FFlagAvatarExperienceEnableAvatarModelLoadTime":"True","FFlagUseGenericRBXThumbUrl":"True","FFlagImplementIMEInStudio":"True","FFlagLuaCatalogPremiumUpsellModal":"True","DFFlagHttpAddSetMethodPatch":"True","DFFlagPubKeyExchange":"True","FIntNumSmoothingPasses":"3","FFlagPerPeerSnfWhitelist":"True","FFlagStopRelatives":"True","FFlagUseRoactPlayerList3":"True","FFlagFindNestedParts":"True","FFlagRTMemoryless":"True","FFlagPartMaterialTableReload":"True","FFlagBeamTextureDesyncFix":"True","FFlagFixAdornRenderNullCrash":"True","FFlagRemoveReflectionScaleValue":"True","FFlagFutureIsBrightPhase2_5EnableControls":"True","FFlagPresetLightRefactor":"True","FFlagLuaAppDisplayFriendInGame":"True","FFlagUserChatAddServerSideChecks":"True","FFlagStudioDraftsServiceHostCrashFix":"True","FFlagTerrainToolsAutoFormatNum":"True","FFlagTerrainToolMetrics":"True","FFlagTextScaledRespectUIPadding":"True","FFlagOnlyFireFocusedOnce":"True","DFIntPercentageThresholdUsingFriendsV2A3":"100","FFlagStudioGameSettingsDisablePlayabilityForDrafts":"false","FFlagCLI31175":"True","FFlagStudioDraftsDeletePreferSafeOption2":"True","DFFlagTryGCifNeedGC":"True","FFlagStudioFixInitialEnabledPluginGui2":"True","FFlagBuildGuiOnServerInStudio":"True","FFlagStudioHandlePreloadAsyncInPluginDataModels":"True","DFFlagLDLBuildProgramTimeReportEnabled":"True","DFFlagLDLProgramOpsReportingEnabled":"True","FFlagABTestLoadingDeadlockFix":"True","FFlagStopTheDefaultTeleporter":"True","DFFlagCompletenessParentMFDFix":"True","FFlagStudioGameSettingsPermissionUpdateWarning":"True","FFlagLuaLogInDisableAutoFocus":"True","DFFlagRccPassThroughMatchmakingMetadata":"True","DFFlagRccRemoveMaxGameInstances":"True","DFIntHttpInfluxHundredthsPercentage":"2","FFlagEnableAppInstallationId":"True","FFlagInitializeVideoManager":"True","DFIntLDLBuildProgramTimeReportRate":"100000","FFlagPlayerListAdjustHeightToMatchLegacy":"True","FFlagStudioEnableSafeUpdatesBetaFeature":"True","FFlagCatalogUpdateRecommendations":"True","FFlagAvatarExperienceNavigationFix":"True","FFlagLDLUnrollMatrixOperations":"True","FFlagLuaPickyScrollingPicker":"True","FFlagLuaCatalogRefactorSpawns":"True","FFlagLuaCatalogShowFloodcheckErrorToast":"True","FFlagLuaCatalogEnableFullViewToggleAnalytics":"True","FFlagLuaAppABTestFeaturedGameTileInSearch":"False","FFlagLuaAppGamesAPISetFeaturedGame":"True","FFlagLuaAppGameSortGridABTestEnabled":"True","DFFlagReportLuaKicks":"True","FFlagEnableScaleIndependentBulletCollision4":"False","FFlagGraphicsVulkanEnableDepthBiasClamp":"True","DFFlagLDLUseMinimalLocalFillElimination":"True","DFFlagFixTerrainStreamOutOptOrder":"True","FStringLuaAppGameSortGridABTestJSON":"{\"ABTestData\" : { \"Control\" : { \"UseGrid\" : false, \"GridRows\" : 0, \"UseGridMediumTile\" : false }, \"Variation1\" : { \"UseGrid\" : false, \"GridRows\" : 0, \"UseGridMediumTile\" : false }, \"Variation2\" : { \"UseGrid\" : true, \"GridRows\" : 3, \"UseGridMediumTile\" : true }, \"Variation3\" : { \"UseGrid\" : true, \"GridRows\" : 2, \"UseGridMediumTile\" : true }, \"Variation4\" : { \"UseGrid\" : true, \"GridRows\" : 3, \"UseGridMediumTile\" : false }, \"Variation5\" : { \"UseGrid\" : true, \"GridRows\" : 2, \"UseGridMediumTile\" : false } }}","FFlagMeasureSleepAssemblies":"False","FFlagFixReplaceTerrainAir":"True","FFlagStudioProperCheckForServerContentLoaded":"True","FFlagFixScrollActionOffset":"True","FFlagFixEmotesMenuInputPassthrough":"True","FFlagStudioPlaceSessionMainViewCleanupEventFilter":"True","FFlagEnablePurchasePromptV2":"True","FFlagIfYouDidntKnowNowYouKnow":"True","DFFlagUseCorrectIncompatibleVersionMessage":"True","FFlagIsPasswordValidationV2Enabled":"True","FFlagIsTwoStepValidationV2Enabled":"True","FFlagIsTwoStepResendV2Enabled":"True","DFFlagStreamingCheckParentBeforeAddingNewInstanceItem":"True","DFFlagDeprecateConnectionRejected":"True","DFFlagStreamingScaleBufByQuota":"True","DFFlagCheckFMODInitThreading2":"True","FFlagStudioGameSettingsFixDescriptionFetch":"True","FFlagStudioDeferCGESelectionListener":"True","DFFlagLuauFailFaster":"True","DFFlagGetRidOfPointlessSytemCheck":"True","DFFlagVideoFixPossibleBufferingHang":"True","DFFlagParameterValidationForLoadSoundForChannel":"True","DFFlagVideoBetterHandlingOfUnsupportedCodecs":"True","DFFlagDoNotCreatePlaybackChannelForNullSoundChannel":"True","DFFlagValidateSoundChannelInTryToLoadSound":"True","DFFlagVideoAllowNonNativeResolutions":"True","DFFlagVideoBetterCleanupOnOpenFailure":"True","DFFlagVideoStreamAlternateStopAudio":"True","DFFlagUpdateQuotaAfterMemoryUpdate":"true","DFFlagUpdateStreamingInfoWhenGC":"true","FFlagFixDuplicateChildNames":"true","FFlagLuaAppNilUserPresenceFix":"True","DFFlagLDLPGSReportCachedMemory":"True","FFlagImagePickerNow":"True","FFlagTerrainToolsFixMaterialTooltipClipping":"True","FFlagLuaSignUpBDayRefactor2":"True","FFlagStudioMitigateTemplateModerationHash":"True","FFlagGraphicsD3D11PerFrameQuery":"true","FFlagGraphicsVulkanPerFrameQuery":"true","FFlagPlayerListDontCreateUIWhenDisabled_PlaceFilter":"True;3411100258","DFFlagLoadLibraryError":"True","FFlagLuaCatalogRedirectOwnedBundleToCorrectCategory2":"True","FFlagStudioFixAutoCompleteClosingParensAnonyFuncDef":"True","DFIntNetworkStreamingGCUrgentMaxMicroSecondLimit":"8000","FFlagStudioAlwaysSendActiveSessionAnalytics":"True","FFlagEnableJavascriptHybrid2":"True","FFlagPlayerListMorePermissiveLeaderstatsCheck":"True","FFlagFixGetStringForKeycodeCrash":"False","DFFlagLaterPlayerTeamRemovingSignal":"True","FFlagEnableGameI18nForClients":"True","FFlagEnableLocaleHostForClients":"True","FFlagStudioQuickOpenPatch":"True","FFlagStudioQuickOpenFilterHiddenInstances":"True","FFlagStudioQuickOpenFixPosition":"True","FFlagStudioScriptEditorTelemetry":"True","FFlagStudioCatchUploadExceptionForAsync":"True","FFlagTerrainToolsRefactor":"True","FFlagTerrainToolsFlattenUseBaseBrush":"True","FFlagEnableScaleIndependentBulletCollision5":"True","DFFlagHideStreamingPropsWhenNotStreaming":"true","FFlagUseStudioServiceInPluginGetUserId":"True","FFlagPrefetchCharacterInfoForSignUp":"True","FFlagHttpServiceLogPluginDomains":"True","FFlagCtrlPinchRejection":"True","FFlagExtraDatamodelServicesForPluginDms":"False","DFFlagContentProviderLocalAssetPath":"True","FFlagLuaCatalogFixSearchParameterAnalytics":"True","FFlagLuauContinue":"True","FFlagLuaChatDateContentOverlapFix":"True","FFlagDataStoreCacheLimitEnabled":"True","FFlagBytecodeSerialization":"True","FFlagSignatureSerialization":"True","DFFlagReplicatorStreamingReportGCStepPercentage":"True","DFIntStreamedRegionGCUrgentFactor":"20","FFlagAvatarExperienceSaveManagerInitialization":"True","FFlagAvatarExperienceEmptyHistoryFix":"True","FFlagStudioEnableLuaPublishWorkflowBetaFeature":"False","FIntStudioBFRolesetLuaPublishWorkflow":"4","FFlagChangeHistoryIgnoreArchivable":"True","DFFlagEnableFillWedge":"True","FFlagEnableNonWhitelistedToggle":"True","FFlagEnablePurchaseV2":"True","FFlagGraphicsVulkanBetterTransferBarriers":"True","FFlagStopRenderTransparentGlyph":"True","FFlagStudioFixModuleScriptLuaStateInBacktrace_2":"True","FIntStudioDeprecateQuickFindScriptStep":"2","DFFlagStudioShowMixedTablesInWatchedVariables":"True","DFFlagReplicatePlaceVersion":"True","FFlagStudioFixIntellisenseTooltipCutoff":"True","FFlagPlayerListPerformanceImprovements":"True","FFlagStudioDontShowNilTooltip":"True","FFlagFixGetStringForKeycodeCrash2":"True","FFlagPlayerListFixUnexpectedLeaderstatsTypes":"True","FFlagPlayerListFixBlockedInitalization":"True","FFlagPlayerListFixTouchInputState":"True","FFlagPlayerListInitalizePerformanceStatsVisible":"True","FFlagMeasureSleepAssemblies2":"True","FFlagEnableToolboxInsertWithJoin":"True","DFFlagBodySafeUpdatePVEnabled":"True","FFlagStudioDraftsUseMultiselect2":"True","FFlagStudioDraftsServiceFullNameInDiff":"True","FFlagRemoveCommittedDraftsFromSelection":"True","FFlagDisableContextMenuDuringCommit":"True","DFFlagVersionControlServiceBatchCommit":"True","FFlagStudioQuickOpenSelectFirstByDefault":"True","FFlagTerrainToolsGeneratorSkipAir":"True","FFlagTerrainToolsMaterialGenerateFragments":"True","FFlagTerrainToolsFixOffsetGenerationNoise":"True","FFlagAllowDuplicateNamesOnNonAnimatedParts":"True","FFlagStudioGameSettingsFixUserSearch":"True","DFFlagDisableAncientNetworkSettings":"True","DFFlagDisableReplicatorLuaCloseConnection":"True","DFFlagDisableReplicatorLuaGetRakStatsString":"True","DFIntClientReportLuaTicketInfluxHundrethsPercentage":"10000","DFIntClientReportLuaConnectionSignalsInfluxHundrethsPercentage":"10000","DFIntServerReportLuaGetPortInfluxHundrethsPercentage":"1000","FFlagTerrainTightBoxes":"False","DFFlagTopGamesPhysicsReportingEnabled2":"True","DFIntTopGamesPhysicsReportingRatePercent":"1","DFIntTopGamesPhysicsAveExpFactorPercent":"10","DFIntTopGamesPhysicsReportingDelay":"300","FFlagStudioMeshCopyIdUseMeshId":"True","FFlagStudioSettingsDialogOnlyShowCancelWithContent":"True","FFlagStudioWatchListCheckForEditable":"True","FFlagEnableDefaultSortFix":"False","FLogPluginOnInvoke":"0","FFlagPhysicsSleepImprovementsBeta":"False","DFFlagNoExceptionsToPartsInStreaming":"true","FStringStudioUrlPhysicsSleepImprovements":"\"https://devforum.roblox.com/t/beta-test-me-sleeping-part-behavior-improvements/456931\"","FFlagLuauWarnOnUtf8":"True","FFlagUsePolicyServiceForCoreScripts2":"False","FFlagFFlagUsePolicyServiceForCoreScripts":"False","FFlagStudioFixStripedTableSelectionHover":"True","FFlagHandleMouseDownWhenFocused":"True","FFlagUseSaneScrollWheelDelta":"True","FFlagLuaChatAliasesSizingFix":"False","FFlagABTestMultipleWaitsFix":"True","FFlagSwipeNeverResetsTouchFocusEventFix":"True","FFlagAppBridgeDestroyAppOnTermination":"True","FFlagRenderForceContext":"True","DFFlagRejectEarlyHumanoidChanges":"False","FFlagSteerFloatAndThrottleFloatReplicationFix":"True","FFlagSkipLowResFix2":"True","FFlagStudioFixStringHighlightingWithBackslashZ":"False","FFlagStudioAllowDuplicateWatchVariables":"True","DFFlagStudioStopDeepLuaTableStackOverflow":"True","FFlagUsingNewCaptchaApi":"True","FFlagLuaAppInitializeABTests2":"True","DFFlagServerDisableLuaGetPort":"True","FFlagQuickOpenFixSpinner":"True","DFIntRccLinuxMemoryMegaByteLimit_PlaceFilter":"16000;4599786547;4677926228","DFFlagPremiumUpsellEnabledV2":"True","FFlagPremiumLuaUpsellEnabled":"True","FFlagPremiumLuaUpsellEnabledV2":"True","FFlagReQueryPremiumOnError":"True","FFlagAllowTGAImageAssetExtension":"True","DFFlagGCReducesQuota2":"True","FFlagAvatarSizeFixForReorganizeHeaders":"True","FFlagTerrainToolsRefactorSculptOperations":"True","FFlagUseAnalyticalElasticSpring":"True","DFFlagClientNetworkReportIpVersion":"True","FFlagFixStudioEmulatorDeviceOrientation":"True","FFlagBroadPhaseIslandAcceleratedFilterStep":"True","FFlagStudioFixShortcutSorting":"True","DFFlagDontClearForwardRefMapOnGC":"True","FFlagFIB25Update2":"True","DFFlagContentProviderLocalAssetPath3":"True","DFFlagContentProviderLocalAssetPathRCCFix":"True","FFlagExtraDatamodelServicesForPluginDms2":"True","DFFlagDontImmediatelyDeparentReplicator":"true","DFFlagStopPlayersTraverseForPhysics":"true","DFFlagAllowAnimateScripts":"true","FFlagStudioRefactorAssetPreview":"true","FFlagLuaPackagePermissions":"True","FFlagUserCameraToggle":"true","DFFlagFriendsV2BadAccessFix":"True","FFlagNewAwardBadgeEndpoint2":"True","FFlagLocalizeVideoRecordAndScreenshotText":"true","FFlagFixGamepadContextActionServiceOverride":"False","DFFlagComputeSolverDisplacementForWake":"True","FFlagUseSolverDisplacementForWake":"True","DFFlagDeferTickleAssemblyWakes":"False","FFlagUseNewSleepStage":"True","FFlagAvatarEditorUpdateCamera2":"True","FFlagAnalyticsCatalogSearchEventContext":"True","DFFlagHttpAdditionalBandwidthMetrics":"True","DFFlagHttpNetworkType":"False","DFFlagHttpDynamicSuccessStatusCode":"True","DFFlagClientNetworkReportGameInstanceId":"False","DFFlagVideoCircularBufferFix":"True","FFlagVideoUseAudioAsMasterClock":"True","DFIntUserHttpRequestsPerMinuteLimitZ_PlaceFilter":"500;4686746335;4702658078;1067560271;1067660288;735030788;2033617470;4709927839;2033617613;1765700510;1187101243;4728133914;4728134592;4728135073;4728136238;4728136475;4728136681;4728136927;4728137133;4728137352;4728137581","DFFlagAvoidVelBufWhenGC2":"True","DFFlagClientStreamingRadiusRoundConsistency":"True","FFlagCMSUseSharedUGCValidation":"True","FFlagStudioFixAutoCompleteInAnonymousFunctionDef":"True","FIntNotMovingSleepThresholdMult":"1","DFIntFriendshipEndpointMigrationRolloutPercentage":"0","FFlagGraphicsGLPerFrameQuery":"False","FFlagStudioCheckPlaceVersionMatchInTeamCreate":"True","FFlagStudioOpenModuleScriptIfNotFoundWhileDebugging":"True","FFlagFixModuleScriptBreakpointNotHitWhenParentScriptNotOpened":"False","FFlagStudioQuickOpenReopenShowHistory":"True","FFlagTrailClearCrashFix":"True","DFFlagComputeSolverDisplacementForWake_PlaceFilter":"True;679715583","FFlagUseSolverDisplacementForWake_PlaceFilter":"True;679715583","FFlagUseNewSleepStage_PlaceFilter":"True;679715583","DFFlagDeferTickleAssemblyWakes_PlaceFilter":"False;679715583","DFFlagRaknetBandwidthMetrics":"False","DFIntRaknetBandwidthInfluxHundredthsPercentage":"0","DFFlagEnableCallingWakeUpMechanicalJointsForAssembly":"True","FIntESGamePerfMonitorReportDetails":"1","FFlagLegacyShadowMapFormatRG8":"True","DFFlagUseRaisePropertyChangeForSoundPlaying":"True","FFlagRefactorPluginLoading":"False","FFlagFixWeakFunctionRefInPlugin":"True","FStringStudioUrlInsertObjectStreamlining":"https://web.archive.org/web/20200624170102/https://devforum.roblox.com/t/object-insertion-workflow-improvements-beta-2/468307","DFFlagPremiumGameIdFix":"True","FFlagUpsellDirectToPackage":"True","DFFlagStreamingFasterTargetRadiusIncreaseAfterGC":"True","FFlagFixNotificationScriptError":"True","FFlagUserRemoveTheCameraApi":"True","DFIntVideoStreamMaxBufferMs":"200","DFIntVideoStreamMinBufferMs":"100","DFFlagUseThresholdForMotor6DWakes":"False","DFFlagWakePartsOnGravityChange":"True","FFlagStudioFixPublishSuccessNameIcon":"True","FFlagPublishPlaceToRobloxLuaPlugin":"True","FFlagStudioRefactorStudioVerbsSavePublishDuplicateCode":"False","FFlagStudioFixPhantomBreakpointOnLineDelete":"True","DFStringGlobalUniverse17sIds":"14743789;1482020489","DFFlagGlobalToggle17sApis":"True","DFFlagHttpRbxApiEnable17sApis":"True","DFFlagEnableMacWindowCloseButton":"True","DFFlagJointInstanceEnabled":"True","DFFlagEconomyCreatorStatsApiWhitelist":"True","DFFlagPostPremiumUpsells":"True","FFlagLogPremiumImpressions":"True","FFlagEnableRobuxIconXbox":"True","FFlagXboxReportPlayerLocFix":"True","FFlagStudioScriptEditorContentsChangingRefine":"False","DFFlagUseRaisePropertyChangeForSoundTimePosition":"True","FFlagStudioScriptFindElideCopies":"True","LuaAppPercentRolloutGameDetailMoreAnalytics":"100","FFlagXboxLessInfiniteFunctionMarshaller":"True","FFlagFixRobloxInputBadArrayLengthChecks":"True","FFlagUserChatNewMessageLengthCheck2":"True","FFlagAvatarEditorFixCutOffItemName":"True","FFlagLuaChatAliasesSizingFixV2":"True","FIntLuaAppLogoutUserOnUnauthorizedPercentRollout":"100","FFlagStudioPressEndToEndOfLine":"True","FFlagStudioFoldSafeLexer":"True","FFlagStudioFixGetClassIcon":"True","FFlagDoTeleportCloseCurrentDMBlocking":"False","FFlagRemoveDmCheckInSetLocalPlayerInfo":"True","DFFlagSimLDLProgramNewStatsEnabled":"False","DFFlagRejectEarlyHumanoidChanges2":"True","FFlagAssetManagerLuaCleanup1":"True","FFlagTrailLockFailCrashFix":"True","DFFlagDebugRealityCheck3":"True","DFFlagRemoveOldNFWL":"True","FFlagAlwaysGenerateGuid2":"True","DFIntStreamingPauseVelBufMaxDurationMS":"4000","FFlagStudioReportOpenPlace":"True","FFlagStudioReportLoginAnalytics":"True","FFlagStudioReportBaseUrl":"True","FFlagStudioGameSettingsGroupGamePermissionChanges":"True","DFFlagVideoModifyMutexes":"True","DFFlagVideoEnableDeviceTuning":"True","DFFlagVideoFixAbsurdlySlowDataCopy":"True","DFFlagVideoEnableGetInfo_PlaceFilter":"True;4587054145;4521759066;4589144917;1921623329;4710199611;4786133739","DFFlagAlwaysLongStep":"True","FFlagStudioConfirmPublishWithDirtyDrafts":"True","FFlagStudioQuickImproveResponsiveness":"True","FFlagJIRA_RIDE_184_V2":"True","FFlagVersionControlServiceScriptCollabEnabledByDefault":"True","FFlagStudioFixAssetPreviewTreeView":"True","DFFlagSimDontResetContactsOnNotifyAssemblyPrimitiveMoved":"True","DFFlagTweenServiceOnStepped":"False","FFlagLocalizationToolsLocalizationEnabled":"True","DFFlagFixRijndaelCBC":"True","FFlagLoadTheLoadingScreenEvenFaster":"true","DFFlagClientNetworkSendGameInstanceId":"True","FFlagOutputWidgetFindEnabled":"False","FFlagCoreScriptOverrideRefactor":"true","FFlagXboxUseNewBundleEndpoints2":"True","DFFlagVectorMinMax":"True","FFlagXboxHardwareBundleEnabled":"True","FFlagStudioEnhanceEmulationDeviceManager":"True","FFlagBindToAllInterfaces":"True","DFFlagConnectIPv6ServerInLAN":"True","FFlagRakNetSupportIpV6":"True","FFlagImproveCatalogPerformance":"True","DFFlagPremiumUpsellUserId":"True","FFlagLuauImmutableUpvalues":"True","FFlagLuauCaptureOp":"True","FFlagPremiumUpsellPrecheck":"True","FFlagRefactorPluginLoadingForDeadlock":"True","FFlagScaleToolUseBinarySearch":"True","DFFlagUseRefactoredHitTest":"False","DFFlagUseRefactoredRaycast":"False","DFFlagRefactoredIkSolve":"True","FFlagDisableAutoTranslateForKeyTranslatedContent":"True","FFlagDisableReconnectAfterPotentialTimeout":"True","DFFlagFixCoreScriptModuleDebuggerDataNotMappingOnBaseLevelScript":"True","FFlagStudioFixOpenCoreScriptDocDatamodelMapping":"True","DFLogPartStreamingRequests_PlaceFilter":"6;2291717546;2623652930;2753554889;3027055174;4599786547","FFlagStudioEnableProjectConfig":"True","FFlagScriptContextEnableDetailedErrorSignal":"True","FFlagLuaAppUseDetailedErrorSignal2":"True","FIntInstrumentGuacRollout":"100","FFlagLuaAppPolicyMockRefactor":"True","FFlagLuaAppPolicyUseGuac":"True","FFlagEnableAppPolicyDefaultsFile":"True","FFlagLuaAppMorePagePolicyFix":"True","FFlagLuaAppTopBarCustomBackButton":"True","DFFlagSimLDLProgramNewStatsEnabled2":"True","FFlagCJVNotFallbackToEnglishForUGCEnabled":"True","FFlagStudioDisplayNameCrashFixEnabled":"True","FFlagSimLDLProgramMemoryOptimization":"True","FFlagStudioDeprecateQuickFindScriptTotally":"True","FFlagStudioFixNullptrTeamCreateDCCrash":"True","FFlagStudioEnableCoreScriptOpeningForInternalDevs":"True","FFlagStudioDisablePluginButtonsInProgress":"False","FFlagStudioCreateGroupOwner":"False","FFlagStudioGameSettingsUserGameEditPermissionsRestriction":"True","FIntStudioBFRolesetAccessPermissions":"4","FFlagEnableStartupControllerOnWindows":"True","FFlagCFrameVectors":"True","FFlagNoMoreDraggerFloatingPointError":"True","FFlagRemoveImplicitIkDraggerUndoWaypoint":"True","FFlagStudioServiceShowConstraintDetails":"True","FFlagStudioAllowBuiltinActionOverride":"True","FFlagStudioDisablePublishButtonsInProgress":"True","FFlagStudioCreateGameGroupOwner":"True","FFlagUWPLocaleManagerEnabled":"True","DFFlagSimEnableTouchEventManager":"True","FFlagStudioReportPlaceSize":"True","DFFlagFasterHasNanInf":"True","DFFlagBodyAtomicUpdate":"True","DFFlagParallelCollisionsFaster":"True","FFlagStudioLanguageService":"False","DFFlagMegaRepOnlyClearWhenNewlyAlive":"true","DFFlagInstanceOrderCheck":"False","FFlagStudioAutoFocusNewScripts":"True","FFlagStudioDefaultPopulateFindWidget":"True","FFlagStudioFixLocalShutdownRequest":"False","DFFlagLogIsAPVAdornment":"False","FFlagLuauHighlightContinue":"true","FFlagStudioLuauWarningTelemetry":"False","FFlagRankMatchByMatchedLength":"True","FFlagTryTranslateParameterOnSourceMatch":"True","DFFlagReportParameterContent":"True","FFlagAllowPasteKeysBetweenAnimations":"True","FFlagFixMockStudioTheme":"True","FFlagUseGetKeyframeSequenceIgnoreCache":"True","FFlagAddStatCounters":"True","FFlagStudioEnableResume":"False","FFlagRefactorPluginLoading2":"False","DFFlagFastVisuallyMovingCounters":"False","FFlagAndroidSetSafeZoneOffsets":"True","FFlagStudioDeviceEmulatorSetSafeZone":"True","FFlagFixRunServiceStopFromPlugin":"True","FFlagStudioGameSettingsAccessPermissions":"True","FFlagStudioCloseOnMiddleButtonRelease":"True","FFlagStudioFixMacFileOpen":"True","FFlagStudioUseAnimationEditorAnalytics2":"True","FFlagLuauNewResume":"False","FFlagEnableDoubleClickSupport":"True","FFlagInGameMenuSinglePaneDesign":"True","FFlagInvalidateNanTimeStamp":"True","DFIntTrackCountryRegionAPIHundredthsPercent":"100","FFlagMacStudioInitCrashHandlingFirstAfterFlagLoaded":"True","FFlagGraphicsGLProperCheckForFramebuffer":"True","FFlagAccountReplicatorQueueItemTypes":"True","FFlagStudioQuickOpenSearchActions":"True","FFlagStudioTightenSaveMutexLocks":"True","DFFlagRCCMonitoringInitializeCpuVariables":"True","DFFlagRaknetBandwidthMetricsAddServerIp":"False","FFlagCollectAnalyticsForSystemMenu":"True","DFFlagRCCMonitoringCustomTimeouts":"True","DFIntHttpRbxApiMaxRetryBudgetPerMinute":"10","DFIntHttpRbxApiMaxRetryCount":"3","FFlagPlayerListFixStatFlickering":"True","FFlagCorescriptThumbnailsRespectBaseUrl":"True","FFlagPlayerListBetterDropDownPositioning2":"True","FFlagPlayerListUseUIBloxIcons":"True","FFlagPlayerListFixTouchInputState2":"True","FFlagNewIrradianceCalculation":"True","DFFlagRccUseCmdLineLimits":"True","DFFlagRaknetBandwidthAddDataCenterId":"False","DFFlagRequireModulesTypeCheckAnalyticsEnabled":"True","DFIntRequireModulesTypeMismatchWarningCount":"8","DFIntAssetTypeCheckPermyriad":"1000","FFlagDoesNotLoadCachedFileSyncItemsForLuaApp":"True","FFlagStudioFixCDNUrlForProjectConfig":"True","FFlagStudioSandboxCrashFix":"True","DFFlagTouchQueueMetrics":"True","DFIntTouchQueueMetricsSendEveryXSeconds":"300","DFIntTouchQueueMetricsInfluxHundredthsPercentage":"10000","FFlagStudioFixTemplateModerationHashRemovalOnTCEnable":"True","DFFlagSimLDLComponentMemoryUseComputationFix":"True","FFlagStudioEnableAssetManagerService":"True","FFlagStudioAddBulkImportView":"True","FFlagStudioEnableBulkImportFromLua":"True","FFlagDoNotGetAntiAddictionPolicyInRenderStep":"False","FFlagStudioMakeActivityCounterListCrashDueToLocale":"True","FFlagStudioPlaceSessionModelIncorrectLocaleCountryCrash":"True","FFlagStudioIncorrectLocaleInLogFile":"True","FFlagGraphicsGLDisableTimerQueryAdreno":"False","FFlagGraphicsGLPerFrameQuery2":"False","FFlagStudioEnableEmulationDeviceEditor":"True","FFlagStudioAssetManagerBetaFeature":"true","FIntStudioBFRolesetAssetManager":"2","DFIntReportParameterContentHundredthsPercent":"8000","DFFlagLocalizationServiceGetCountryCodeAPINullptrCheckFix":"True","DFFlagPlayerPolicyGetApiUrlForRequestPolicyInfoFix":"True","DFFlagPlayFabPlayerLoginLogoutAsServerEvents":"False","DFFlagPlayFabEmitMarketplaceEvents":"False","FFlagPackageDiffBugFix":"True","FFlagStudioChatSessionHandlerCrashFix":"True","FFlagLuaAppSiteBannerLinks":"True","FFlagTopBarHideSiteBanner":"True","FFlagWebViewsUseLuaGameDetails":"False","FFlagEnableAppsFlyerLinks":"True","EnableAppsFlyerDeferredLinks":"True","FFlagEnableGameStartUniversalLink":"True","FFlagLuaAppRefactorInAppLinks2":"True","FFlagAppBridgeExplicitDefaultPlayerParams":"False","DFFlagClientDisableLuaTicket":"True","FFlagStudioUpdateRuiDialog":"True","FIntDataModelPatcherEventPercentage":"1","FFlagEnablePluginPermissionsPage2":"True","FFlagPluginIdentityFix":"True","FFlagPluginManagementPrettifyDesign2":"True","FFlagStudioFetchPluginName":"True","FFlagStudioHttpServiceUsePluginPermissions":"True","FFlagStudioPermissionsServiceEnabled":"True","FixChromebookEnterKeyIssue":"True","FFlagStudioDontHideWatchItems":"True","FFlagAlwaysWriteLegacyLock":"True","FFlagAppShellReporterMonitorFrameTime2":"True","FFlagMemoryFromAppShellReporter2":"True","FFlagGameDetailsPeekViewAnalyticsEvents2":"True","FIntTaskSchedulerThreadMin":"0","FFlagStudioTimerRefactor":"False","FFlagDumbSpatialHash":"False","DFFlagTweecall":"True","FFlagStudioInsertObjectStreamliningv0_Consolidated":"True","FFlagStudioInsertObjectStreamliningv2_TranslatedToolTips":"True","FFlagStudioInsertObjectStreamliningv2_SharedModelBugFix":"True","FFlagStudioInsertObjectStreamliningv2_MultiWindowContextPlacementBugFix":"True","FFlagStudioInsertObjectStreamliningv2_DataModelLifetimeBugFix":"True","FFlagStudioInsertObjectStreamliningv2_ShowRecommendedObjectsOnly":"True","FFlagStudioInsertObjectStreamliningv2_ExpandedView":"True","FFlagStudioInsertObjectStreamliningv2_InsertMenuShortcut":"True","DFFlagBallSocketMaxFrictionTorqueEnabled":"False","DFFlagAngularVelocityReactionTorqueEnabled":"True","FFlagStudioDefaultGroupInDropdownPublish":"True","DFFlagStopSoundTaskOnChannelTreeNullified":"True","FFlagRemoveLinkFromKinematicJoints":"False","FFlagSpanningEdgeCacheIsInTree":"True","FFlagConsistentCofmForAnimatedAssemblies":"True","DFFlagParallelSendTouches":"False","DFFlagDoNotRepeatRedundantPlayingEvents":"True","DFFlagDoNotRepeatRedundantVideoPlayingEvents":"True","DFFlagReportReplicationVariantLimitHit":"True","DFIntClientSendEventStringDataLimitBytes":"75000000","DFIntClientSendEventVariantCountLimit":"1500000","DFIntRCCReceiveEventStringDataLimitBytes":"75000000","DFIntRCCReceiveEventVariantCountLimit":"1500000","DFFlagSimLDLProgramForceUnroll":"True","DFFlagLuaNoResetStack":"True","FFlagLuauTypeAnnotationsEverywhere":"True","FFlagAvatarExperienceImproveBackgroundTransition":"True","FFlagAvatarExperienceUseInternalBackgroundAsset":"True","FFlagStudioEnablePhoneAndTableDefault":"True","DFFlagBallSocketMaxFrictionTorqueEnabled_PlaceFilter":"True;4588303397","DFFlagDisableDebuggerDisconnect":"True","FFlagStudioInsertObjectStreamliningv2_Consolidated":"True","DFFlagAllowLuauUpdates":"True","DFFlagWarnTypeCheckOnRequire":"False","DFFlagForceTypeCheckOnRequire":"True","FFlagAddSidToGameJoinLoadTime":"True","FFlagEnableConvertToTerrainBeta":"True","FFlagSerializerIgnoresMD5":"True","FFlagStudioDeviceManagerAddPreview":"true","DFFlagPlayFabEmitTeleportEvents":"True","FFlagPeekPreviewMenuClose":"True","FFlagCatalogAnimationIdlePreview":"True","DFFlagSimLDLPGSStatsBufferBreakdownReporting":"True","FFlagAvatarExperienceOutfitRecommendations":"False","FFlagRenderImproveStreaming":"False","FFlagTerrainToolsImportImproveColorMapToggle":"True","FFlagTerrainToolsRefactorAssetIdSelector2":"True","FFlagTerrainToolsSmoothToolIgnoreWater":"True","DFFlagEnable17sNotifications":"True","FFlagPlayerListFixLeaderboardDisabledError":"True","FIntNumberParalleNarrowPhaseThreads":"16","FIntParalleNarrowPhaseThreads":"16","FIntLDLPGSMaxParallelTasks":"16","FFlagUnlockOnlyCountTheRecentGamesOnce":"True","FFlagCheckInstanceIsInScope":"True","FFlagFixModuleScriptBreakpointNotHitWhenParentScriptNotOpened2":"True","FFlagStudioFixStringHighlightingWithBackslashZ2":"True","FFlagStudioRefactorStudioVerbsSavePublishDuplicateCode2":"True","FFlagImmHandlerFixJapaneseAndKorean":"False","FFlagReportInputMethodAnalytics":"False","FFlagFixTextSelectionForHighDpi":"True","FFlagStopCheckingFrontendProcessingInTextLayout":"True","FFlagStudioUILibFixAssetTypeMap":"True","FFlagEnableUIGradientEnabledProperty":"False","FFlagStudioEnableVirtualKeyboardAnimation":"True","DFFlagConsumePlatformNameOverAlternateName":"False","FFlagSuperSmoothMouseWheelScrolling":"True","DFIntReplicationVariantLimitHundredthPercent":"10000","FStringEnableiCloudWebCredentialsBtIdsList":"49593556386,49593556386,44219219422,49373021284,49849080647","FIntSmoothMouseSpringFrequencyTenths":"45","FFlagDefaultLocDelimFix":"True","DFFlagPremiumUpsellRecheckPremium":"True","FFlagPluginManagementFixRemovePlugins":"True","FFlagLuaAppMorePageFixEventLoading":"True","FFlagLuaAppMorePageMoveEventsToPosition6":"True","FFlagLuaAppUseNewMorePage":"False","DFFlagRenameDisplayNameToPlatformName":"True","DFFlagVisualEngineTrackHeadless":"True","DFFlagPartMassEnabled":"True","DFFlagAnimatorApplyJointVelocities":"True","FFlagLuauPreciseLocals":"True","FFlagCoreScriptTopBarStartup":"False","FFlagStudioInfoBar2":"True","FFlagStudioInfoBarOnDraftCreation":"True","FFlagLuauNewResume2":"True","FFlagLuauNewDebugger":"True","FFlagEnableLuaDraggersBetaFeature":"True","FFlagXboxAppShellSiblingZIndex2":"True","DFFlagFixPlayerGetTeamNeutral":"True","FFlagPlayerListFixTeamUpdates":"True","FStringNewTopBarForcedUserIds":"959520514,656046844,146914182,975669155,344925094,247305679,956690111,1026207482,485327537,166540505,1300488959,1220631541,169775909,1498251806,401950003,751568948,2231221,7210880,931389991,1478764079,597663806,1298953044,1542933305,1182179679,1516442,1155027644,648897862","FFlagEnableOverrideAssetCursorFix":"True","FFlagStudioNewDirtyPublishWarningDialog":"True","FFlagDataModelPatcherAlwaysRecordErrors":"True","FFlagReplicatorInitializeSharedSchema":"True","DFFlagReplicatorUseSharedSchema":"True","FFlagStudioSandboxVerifyIntegrityOnInitialize":"True","FFlagStudioScriptEditorEventsCrashFix":"True","FFlagStudioReportSavePlaceTime":"True","FFlagStudioFixSessionLengthCap":"True","FFlagReportMechanismChangeDuringGameplayCount":"True","DFFlagUseRefactoredRaycast3":"True","DFFlagUseRefactoredHitTest2":"True","DFFlagDebugForcePubKeyExchange":"True","DFFlagNetworkAuditEn2":"True","DFFlagPreventDeepTuples":"True","DFFlagMoreNfPlayer":"True","DFFlagReplicateAllowLuauOnly":"True","DFFlagUseThresholdForMotor6DWakes2":"False","FFlagStudioFixMeshPartPreview":"True","FFlagStudioAssetPreviewTreeFix2":"True","FFlagTruncateDevFrameworkHyperlinkText":"True","FFlagWorldModelV4":"False","FFlagAllowWorldModelCreationV2":"True","FFlagWorldModelRefactorV3":"False","DFFlagInstanceOrderCheck2":"True","FFlagRenderEmitterRecomputeOnChange2":"False","FFlagEnableReadingNewConvexDecompositionPath":"True","FFlagStudioChangeMinimumSizeOfPublishWindow":"True","FFlagStudioCreateNewGameRewritesName":"True","FFlagLuaAppMediumTileInGameSearchPage":"True","FIntLuaAppPercentRolloutFeaturedGameTileInSearch":"100","FFlagLuaAppPreloadDataInProgressWait":"True","FFlagLeaveStartingCoreScriptsToPlaceLauncher":"True","FFlagFixNavigationToChatFromPN":"True","FFlagDataModelPatcherBootstrapEnabled":"True","FFlagRenderShadowDisableBottomClip":"True","FFlagRenderMetalFixMaxFP16Samples":"True","FFlagRenderHalfresShadowsVulkan":"True","FFlagRenderGrassUpdateBudgetFix":"True","FFlagRenderShadowmapNoMSAADepth":"True","DFFlagBallSocketMaxFrictionTorqueEnabled2":"True","FFlagJointInstanceRenderAdornCheck":"True","FFlagLuaAppUseSessionization":"True","FFlagLaunchAppWaitForABTestsInitialized":"True","FFlagEnableAvatarExperienceLandingPageABTest3":"True","FFlagAELandingPageAnalytics":"True","FFlagPerformPurchaseNewBundleInfoTypeEnabled":"True","FFlagEmotesMenuNewKeybinds":"True","FFlagStudioPreventAccidentalTyposWhenHittingBreakpoint":"True","FFlagLuaAppSendLogsToBacktrace":"True","FFlagLuauFixSetMetatableType":"True","FFlagUseNewSleepStage2":"True","FStringFeature_NewGameJoinTeleport":"426;100","DFFlagOnlyOneRightGrip_PlaceFilter":"True;189707;4837595186;4586741827;3487742603;2747834912;4388574342","FFlagStudioLuauWarningTelemetry2":"True","DFIntParallelNarrowPhaseSerialCutoff":"50","DFFlagPlayerPolicyGetDMFromService":"True","DFFlagPlayerPolicyReportHttpFailureOnEveryAttempt":"True","FFlagMobileUseApplicationDirectories":"True","FFlagQtReadSystemProxy":"True","FFlagLuaAppUseNewEventsPage":"True","FFlagAvatarExperienceBackgroundThemeFix":"True","DFFlagDeferTickleAssemblyWakes2":"True","FFlagStudioFixDisappearingVirtualKeyboard":"True","FFlagGfxPartInvalidationLimitToTime":"False","FFlagGraphicsVulkanPreRotate":"False","FFlagStudioSavePlaceAs":"False","FFlagFixStartupGameLaunchFromLink":"True","FFlagGameSettingsUseUILibraryCheckBox":"True","FFlagGameSettingsUsesNewIconEndpoint":"True","FFlagWebViewsUseLuaGameDetails2":"True","FFlagLuauLookupImportedTypeCorrectly":"True","FFlagStudioFixMultipleAssetsImportLogic":"True","FFlagAvatarEditorAttachmentCameraFocus":"False","FFlagRenderMsaaShadowsVulkan":"True","FFlagLuauNewDebuggerGracefulYields":"True","DFFlagUseThresholdForMotor6DWakes2_PlaceFilter":"False;679715583","DFFlagAlwaysLogTcDisco":"True","FFlagAvatarCatalogCloseSearchWhenAvatarIsTapped":"True","DFFlagDeferTickleAssemblyWakes2_PlaceFilter":"False;441585237","DFFlagVideoCleanUpTimeHandling":"True","FFlagPassPointerActionsToGuiObjects":"True","FFlagIgnoreActiveWhenProcessingPointerActions":"True","FFlagScrollingFrameTrackpadSupport":"True","FFlagPublicIKSolve":"True","FFlagColor3ToHSVMethod":"True","FFlagStudioServiceDrawConstraintsOnTop":"True","FFlagEnableRaycastParams":"True","FFlagEnableGizmoRaycast":"True","FFlagFixAdvancedObjectsDragDropAssert":"True","FFlagExtendSelectionBoxAdornee":"True","FFlagStudioReportTCStatusWhenOpenPlace":"True","FFlagStudioAddTCConnectTimeout":"True","FFlagStudioFixTextBoxFocusAndToolTipCloseClashHang":"False","DFFlagPhysicsServiceCorrectPlayerCountForTouch_PlaceFilter":"True;4599786547;467050215","DFFlagParallelSendTouches2_PlaceFilter":"True;4599786547","FFlagAvatarEditorRecommendedUIBloxButton":"True","FFlagStudioInsertObjectStreamliningv2_FeedbackImprovements":"True","FStringStudioUrlAssetManager":"https://web.archive.org/web/20200624170102/https://devforum.roblox.com/t/asset-manager-is-here-beta/517475","FFlagStudioAddBulkImportView2":"True","DFFlagAssetManagerPackageSymbolicLinkFix":"True","DFFlagSimLDLProgramWorkspaceAndRSIStats":"True","FFlagFixTreeViewFlatListDefault":"True","FFlagStudioFixTreeViewForSquish":"True","FFlagStudioFixUILibraryRequireForPreviewInToolbox":"True","FFlagStudioFixAssetPreviewCloseButton":"True","FFlagStudioFixTreeViewForFlatList":"True","DFFlagCacheSoundStats":"True","DFFlagReplicatorProcessPacketMicroprofilerCleanup":"True","DFFlagUseUniqueProfilePorts":"True","FFlagAvatarExperienceAnimationLookAroundFix":"True","FFlagAvatarExperienceCatalogAnimationIdleFix":"True","FFlagStudioAlwaysCompleteFunctionEnd":"True","DFFlagOnlyOneRightGrip":"True","FFlagGetTranslatorApiOnlyForPublishedGame":"True","FFlagEnableAuthV2Login":"True","DFFlagStudioRefactorSaveToRoblox":"True","FFlagSkipFirstMechanismChangeReport":"True","FFlagTerrainToolsTerrainBrushNotSingleton":"True","FFlagTextViewStdReplace":"True","FFlagAvatarExperienceUseUIBloxAlerts":"True","FFlagPlayerListMorePerfImprovements":"False","FFlagHumanoidCacheNameplate":"True","FFlagStudioAllowCorePackagesAndStarterScriptDebugOnStart":"True","FFlagLuauParseArgTypesRefactor":"True","FFlagLuauSkinnyArrows":"True","FFlagAppBridgeNewGameJoinTeleport":"False","DFIntFriendshipEndpointMigrationRolloutPercentageV2":"100","FFlagUGCValidateTags":"True","FFlagUGCValidateMeshBounds":"False","FFlagUGCValidateTextureSize":"True","FFlagUGCValidateHandleSize":"False","FFlagUGCValidateProperties":"True","FFlagUGCAllowThumbnailCameraValue":"False","FFlagUGCUseNewAssetTypeInfoSchema":"True","FFlagEnableThumbnailCameraValue":"False","FFlagRemoveLinkFromKinematicJoints2":"True","FFlagStudioFixPluginWidgetEnabledSignal":"True","FFlagStudioDebuggerLazyLoadVariables":"True","FFlagStudioRewriteEmulatorWithMask2":"False","DFIntGetFriendsOnlineEndpointMigrationRolloutPercentage":"100","DFFlagVideoFixDeviceTuningForAudioOnlyFiles_PlaceFilter":"True;4898980405","FFlagCMSTabErrorIcon":"True","FFlagStudioHashtagIsNotAComment":"True","FFlagImmediatelyApplyFlagsButton":"True","FFlagEnableFRMInSoloMode":"True","FFlagUseInitialTerrainCacheForNonStreaming_PlaceFilter":"True;2317712696","DFFlagDisableLegacyPlayerJoin":"True","FFlagMouseWheelEventSinkingPropagatesToGUI":"True","FFlagMultiBinaryAssets":"True","FFlagUserFixZoomInZoomOutDiscrepancy":"True","FFlagClickDetectorUsesHRPForDistanceCalculation":"True","FFlagDumbSpatialHash2":"True","FFlagModifiedMinimumDistance":"True","FFlagCullByDistanceToPOI":"True","FFlagTopBarUseNewIcons":"True","FFlagInGameMenuSmallerSideBar":"True","FFlagTopBarBetterStateInit":"True","DFFlagSimSolverBufferPurgeEnabled":"True","DFFlagSimLDLProgramFlopCountStats":"True","DFFlagRejectInvalidToolParentChanges2":"True","FFlagUseBlake2BHashInSharedString":"False","DFFlagCompletenessDeadParentRemovingChildFix":"True","FFlagLuauFixConditionRepeatUntil":"True","FFlagAvatarEditorShowEquippedItem":"True","FFlagItemDetailsClosePeekViewFixes":"True","FFlagPeekViewSinkInputTo3dView":"True","FFlagRefactorPluginLoading3":"False","FFlagParallelFetchInternalPermission":"True","FFlagStudioEnableFileWatcherDelay":"True","FFlagDataModelPatcherFixMajorVersionReporting":"True","FFlagDragWeirdConstraints":"True","FFlagDraggerUseModelCFrame":"True","FFlagDontReselectSelectTool":"True","FFlagLazyBoxSelect":"True","FFlagTrackMouseDownState":"True","FFlagTrackAttachmentBounds":"True","FFlagDragOutsideWorkspace":"True","FFlagMinScaleSizeFix":"True","FFlagClearHoverBoxOnDelete":"True","FFlagSinglePartAlwaysLocalSpace":"True","FFlagContextMenuSupportLuaDraggers":"True","FFlagEnableMotor6DTransformFixBetaFeature":"False","FFlagXboxCheck2sv":"True","FStringMotor6DTransformFixBetaUrl":"https://web.archive.org/web/20200624170102/https://devforum.roblox.com/t/changes-to-motor6d-transform-coming-monday/526807","DFFlagReplicatorKickReadEventStringDataAndVariantLimit":"False","DFFlagReplicatorKickWriteEventStringDataAndVariantLimit":"False","FFlagFixPlaybackWithEndFrameAtZero":"True","FFlagUseInitialTerrainCacheForNonStreaming":"True","DFFlagPubKeyExchange22":"False","FFlagStudioFixVirtualKeyboardRect":"True","FFlagAccelerateDuplicateCollisionFidelityReprocess":"True","FFlagFixHACDHullPointLoss":"True","FFlagPhysicsNewConvexDecompositionEnabled":"False","FFlagStudioDraftsWidgetCommitButton":"True","FFlagStudioMigrateGlobalToCJVInChina":"False","FFlagStudioEnableEmergencyMessageDisplayV2":"True","FFlagStudioEnableUrlLinkForEmergencyMessage":"True","FFlagStudioCheckEmergencyMessageOnUserLogIn":"True","FFlagStudioMoveMorpherEditorInsideGameSettings":"True","FFlagStudioPopulateIntlInfo":"False","FFlagStudioRestrictUiLibraryUsage":"True","FFlagStudioUiLibraryErrorOnNilIncludes":"True","FFlagStudioFixNullUniverseInGetResourceByCategory":"True","FFlagTerrainToolsOnlyImportInEditMode":"True","FFlagTerrainToolsFixMergeEmpty":"True","FFlagTerrainToolsFixRegionEditorCleanup":"True","FFlagPromptRobloxPurchaseEnabled":"True","FFlagCanvasPosChangedOnStepElasticBounds":"True","FFlagLuaUIBloxModalWindowAnchorPoint":"True","FFlagCatalogSortAndFilters2":"True","FFlagStudioQuitMessingWithHotKeys":"True","FFlagFixTestServiceWithDebugging":"True","FFlagStudioWrapScriptTextEditorInQPointer":"True","FFlagStudioFixTCTimeoutReport":"True","FFlagStudioAlignBlockEnderOuter":"True","FFlagAvatarEditorClearTryOnFix":"True","DFFlagUseTaskSchedulerThreadLimit":"True","FFlagLuauCompileError":"True","DFFlagDontClearTouchEventsDuringInterpolation":"True","FFlagStudioEncodeEmergencyMessage":"True","FFlagEnableiOSGameTimerFix2":"True","FFlagMaterialGeneratorRefactorV1":"True","FFlagEnableParamsBasedRaycast":"True","DFFlagMotor6DTransformFix":"True","DFFlagMotor6DParentNameEnabled":"True","FFlagSystemAddressIsPeerId":"False","FIntABTestRequestTimeoutMilliseconds":"5000","DFFlagHumanoidInstanceGuard":"True","DFIntRCCLoadPackageRetryTimeDelay":"0","DFIntRCCLoadPackageRetryTimes":"4","FFlagAppBridgeNewGameEvents":"True","FFlagPremiumSettingsLabel":"True","DFFlagDeprecateRakNetRand":"True","FFlagDataStoreAdditionalMetricsEnabled":"True","FFlagTerrainToolsUseDevFramework":"False","DFFlagContactStepAsyncFaster":"True","FFlagLuaAppReportConnectFailSeparately":"True","FFlagLuaAppAEUseAppPolicyForCustomCostumeNames":"True","FFlagLocalStorageQueuePendingFlush":"True","FFlagEnableUIGradientEnabledProperty2":"True","FFlagFixMakeFriendsNavCrash":"True","FFlagStudioPublishMediatorFailedConnection":"True","FFlagStudioCreateNewGameRewritesName2":"True","FFlagStudioAssetManagerDisableTileOverlay":"True","FFlagStudioAssetManagerBulkImportUniverseLoadError":"True","DFFlagHandleFMODConstructorReturningNonNullInvalidPtr":"True","FFlagFixDisplayScriptsFolderInAssetManager":"True","FFlagVersionControlServiceScriptCollabEnabledByDefaultFalse":"True","DFFlagFastVisuallyMovingCounters2":"False","FFlagAdditionalExtJoinData":"True","DFFlagEnableExtendedAnalytics":"True","FFlagFixZeroNormalInDecompositeGeometry":"True","FFlagScrollingFrameLayoutV3":"False","FFlagDevConsoleUseZeroCanvasWidthLogOutput":"True","FFlagScrollingFrameFixElasticBoundingDecrease":"True","FFlagInGameMenuUseUIBloxButtons":"True","FFlagFixLocalShutdownRequest":"False","FFlagDedupePackagesInAssetManager":"True","FFlagDetailedRequireErrorMsg":"True","DFFlagPlayFabEventsV2":"True","DFFlagPlayFabEmitMarketplaceEvents2":"True","FFlagStudioLocalizationInGameSettingsEnabled":"False","FFlagCatalogFullAvatarWifiIcon":"True","FFlagDropToolCaptureMouse":"True","FFlagMoverSwapWeld":"True","FFlagScaleAlwaysAnchors":"True","FFlagTreatToolAsModel":"True","FFlagFixHoverBoxThickness":"True","FFlagLuaDraggerIconBandaid":"True","FFlagTakeAScreenshotOfThis":"True","FFlagStudioCommandBarAlwaysEnabled":"True","FFlagTerrainToolsTweakBrushPower":"True","FFlagFixDevFrameworkDockWidgetRestore":"True","FFlagStudioApplyFiltersToReplaceAll":"True","FFlagScriptEditorEnableShowWhitespace":"True","FFlagResellersListClickThrough":"True","FFlagUseBlake2BHashInSharedString_PlaceFilter":"True;4939501074","DFFlagHACDUseDistancePlaneChecks":"True","DFFlagUseLockFreeVoronoiSimplexContainer":"True","DFFlagVideoFixTextureInitialization":"True","DFFlagVideoFixFrameSizing":"True","FFlagEnableThumbnailConfiguration":"True","FFlagUGCAllowThumbnailConfiguration":"True","DFFlagVideoShowInitialFrameAsTexture2":"True","DFFlagVideoFixDeviceTuningForAudioOnlyFiles":"True","DFFlagVideoCleanUpAudioDeviceStartStop":"True","FFlagPlayerListMorePerfImprovements2":"True","FFlagMinimizePlayerListWhenTopBarOpen":"True","FFlagXboxAppShellSiblingZIndex3":"True","FFlagRobloxGuiSiblingZindexs2":"True","FFlagFixRobloxInputBadArrayLengthChecksTheSagaContinues":"True","FFlagStudioAddDebuggingFlowLocation":"True","FFlagStudioStopRBXASSERTOnDeleteStandalonePlugin":"True","FFlagStudioFixMultilineCommentEditingBehavior":"True","DFFlagCreateServerPlayerSetsIdAndName":"True","FIntAppConfigurationExpiry":"86400","FFlagFixKeepingFolderAcquiredInStudioThroughTheFileSystem":"True","FFlagStudioMigrateGlobalToCJVInChina2":"True","FStringStudioEmergencyMessageV3":"eyAicmVnaXN0cnlLZXkiOiAiRW1lcmdlbmN5TWVzc2FnZUZvckNoaW5lc2VTdHVkaW8iLCAicGxhdGZvcm1zIjogWyAiV2luZG93cyIgXSwgIm1lc3NhZ2UiOiB7ImVuIjogIlRvIGdldCB0aGUgYmVzdCBTdHVkaW8gZXhwZXJpZW5jZSBhbmQgcGVyZm9ybWFuY2UgaW4gQ2hpbmEgdXNlIHRoZSBDaGluZXNlIHZlcnNpb24gb2YgU3R1ZGlvIGF2YWlsYWJsZSBvbiA8YSBocmVmPWh0dHA6Ly93d3cucm9ibG94ZGV2LmNuPmh0dHA6Ly93d3cucm9ibG94ZGV2LmNuPC9hPiIsICJ6aF9DTiI6ICJcdTU5ODJcdTY3OWNcdTRmNjBcdTYwZjNcdTRmNTNcdTlhOGNcdTU3MjhcdTRlMmRcdTU2ZmRcdTY3MDBcdTdhMzNcdTViOWFcdTc2ODRcdTAwNTNcdTAwNzRcdTAwNzVcdTAwNjRcdTAwNjlcdTAwNmZcdTcyNDhcdTY3MmNcdWZmMGNcdThiZjdcdTRmNjBcdTUyNGRcdTVmODAgXHUwMDNjXHUwMDYxIFx1MDA2OFx1MDA3Mlx1MDA2NVx1MDA2Nlx1MDAzZFx1MDA2OFx1MDA3NFx1MDA3NFx1MDA3MFx1MDAzYVx1MDAyZlx1MDAyZlx1MDA3N1x1MDA3N1x1MDA3N1x1MDAyZVx1MDA3Mlx1MDA2Zlx1MDA2Mlx1MDA2Y1x1MDA2Zlx1MDA3OFx1MDA2NFx1MDA2NVx1MDA3Nlx1MDAyZVx1MDA2M1x1MDA2ZVx1MDAzZVx1MDA2OFx1MDA3NFx1MDA3NFx1MDA3MFx1MDAzYVx1MDAyZlx1MDAyZlx1MDA3N1x1MDA3N1x1MDA3N1x1MDAyZVx1MDA3Mlx1MDA2Zlx1MDA2Mlx1MDA2Y1x1MDA2Zlx1MDA3OFx1MDA2NFx1MDA2NVx1MDA3Nlx1MDAyZVx1MDA2M1x1MDA2ZVx1MDAzY1x1MDAyZlx1MDA2MVx1MDAzZSBcdTRlMGJcdThmN2RcdTdmNTdcdTVlMDNcdTRlNTBcdTYwMWRcdTcyNDggXHUwMDUzXHUwMDc0XHUwMDc1XHUwMDY0XHUwMDY5XHUwMDZmXHUzMDAyIn0sICJzaHV0ZG93biI6IGZhbHNlIH0=","FFlagStudioCheckEmergencyMessageAtStart":"True","FFlagRenderFixSun3TimesRender":"True","FFlagRenderImproveStreaming2":"False","FFlagCatalogSnFResetButtonFix":"True","FFlagUGCFixModerationCheck":"True","FFlagCatalogFilteredSearch":"True","FFlagLuaAppFillScrollingFrameWithLoadMore2":"False","FFlagAvatarExperienceOutfitRecommendations2":"False","FFlagUserChatAddServerSideChecks2":"True","FFlagToolboxTruncateOverrideAssetNames":"True","DFFlagParallelSendTouches2":"True","FFlagNoRedrawWindow":"True","DFFlagHttpRbxApiServiceDontRetryOn429":"True","FFlagCancelButtonTouchEventOnMouseDragOff":"True","FFlagFixFirstPersonMouseCursorSnapping_CenterPos":"True","FFlagFixFirstPersonMouseCursorSnapping_ForceCursor":"True","FFlagFixFirstPersonMouseCursorSnapping_UWP":"True","FFlagStudioStartServerIfNotStartedWhenStartingClient":"False","DFFlagDontHandlePlayerReplicationDataAsSpecialCase":"False","FFlagAvatarExperienceCharacterManagerOnSlowNetwork":"True","FFlagAvatarImporterRoact":"True","FFlagUseRebroadcastEventSharedQueue":"False","FFlagMegaReplicatorInitializeTaskQueue":"True","DFFlagMegaReplicatorParallelDisconnect":"True","FFlagDisableFollowInGameMenu":"True","FFlagEnableCorePackagesOverride":"True","FFlagJIRA_RIDE_192":"True","FFlagStudioPopulateInsertObjectMenuAfterLogin":"True","FFlagJIRA_RIDE_630":"True","FFlagShowWarningsForUnregisteredOptions":"True","FFlagStudioAllowCoreScriptReloads2":"True","DFFlagStudioReportPackageRequestWebCopyError":"True","FFlagReportStudioPublishSaveFailure":"True","FFlagWorldModelV5":"True","FFlagWorldModelCatchInsertRawErrors":"True","FFlagWorldModelRefactorV4":"True","FFlagGetScreenPositionOffsetCamPtrGuard":"True","FFlagEnableAvatarExperienceLandingPageForAll":"True","FFlagIgnoreLocaleInJoinScriptData":"True","FFlagRemoveInGameFollowingEvents":"True","FFlagRemoveInGameFollowingServer":"True","FFlagFixPluginInvoke":"True","DFFlagMegaReplicatorDisconnectSwapAndPop":"False","FFlagCreateAndUpdateDataReplicationCache2":"False","DFFlagSupportJoinDataItemV2ii":"False","FFlagNoCostumeSaveButtonFix":"True","FFlagLuaAppUseUIBloxToasts2":"True","FFlagStandardizeVector3Case":"True","DFIntRCCFailedToEvictPlayerInfluxHundrethsPercentage":"100","FFlagGameSettingsPreventClosingDialogWhileSaveInProgress":"True","FFlagEnableBackgroundModeWhenInactive":"False","DFFlagUseNewTelegrafPriorityTag":"True","DFIntTelegrafPriorityThrottleHundredthsPercent":"500","DFFlagUseNewTelegrafMethod":"True","DFFlagEnablePerfDataMemoryCollection":"True","DFIntPerfDataGlobalThrottleHundredthsPercent":"10000","DFStringPerfFilterPlaceId":"4599786547","DFStringPerfTelegrafAddress":"100.20.191.133","FFlagLuaAppChatPageWaitUntilUserABTestsInitialized":"True","FFlagLuaChatShareGameToChatFromChatABTestEnabled":"True","FFlagLuaChatPlayTogetherABTestEnabled":"True","FFlagResetPluginMouseIcon":"False","FFlagSetInsertPoint":"True","FFlagStudioTrimBeforeToggleComment":"True","FFlagStudioDontMoveCursorToEofWhenOpening":"True","FFlagStudioFixProjectConfigForStartInPlayMode":"True","FFlagAllowReturnToConfirmRespawnCharacter":"True","DFFlagPhysicsPacketCountUnderLimit":"False","FFlagAvatarShopFixBlankResellersPage2":"True","FFlagAvatarEditorAttachmentCameraFocus2":"True","FFlagUserDontAdjustSensitvityForPortrait":"True","FFlagLuaAppAddGameSearchSessions":"True","FFlagSystemAddressIsPeerId2":"True","FFlagPlaceLauncherCollectOnMainThread":"True","FFlagRenderDXT_KTX":"True","FFlagStudioEnableCSGv2SmoothingBeta":"False","FFlagLuaAppABTestSearchResultsQ2DGameEmphasis":"True","FFlagLuaAppABTestUseSearchResultsQ2DHideBadGames":"True","FFlagAppConfigurationEnableMultiBehaviorSupport2":"False","FFlagLuaChatAliasesSizingFixAgainV1":"False","DFFlagPhysicsSenderNoEmptyPackets":"True","DFFlagLuaFastToFloat":"True","FFlagLuaTaggedUdataGc":"True","FFlagViewSelectorLightUpdate":"True","DFIntDetailedBandwidthStatsInfluxHundrethsPercentage":"10000","DFFlagDetailedBandwidthStatsInflux_PlaceFilter":"true;4599786547","DFIntDetailedBandwidthStatsPlayerLotteryHundrethsPercentage_PlaceFilter":"10000;4599786547","FFlagFixGettingAssetOwnerNameInAssetPreview":"True","FFlagAppUsesAutomaticQualityLevel":"True","FFlagDepthOfField":"True","FFlagDontLoadCoreScriptsForEditDM":"True","FFlagStudioMuteOnlyOnUnfocus":"True","FFlagStudioRewriteEmulatorWithMask3":"True","FFlagUseCanManageForDeveloperIconServer":"False","FFlagGraphicsMetalCompactGeometry2":"True","FFlagTopBarHightightIconsOnHover":"True","FFlagTopBarCloseContextMenuWhenHotkeysUsed":"True","FFlagStudioUseNewAnimationImportExportFlow":"True","FFlagTapAwayToCloseBackpack":"True","FFlagTopBarEscapeCloseMenu":"True","FFlagAddCopyIDToResultPage":"True","FFlagStudioEnableResume3":"True","FFlagStudioMacOverrideStepIntoShortcut":"True","FFlagScrollingFrameLayoutV3_2":"True","FFlagEnableFavoritesForAssetPreviewInAssetManager":"True","FFlagLuaCatalogFixRemoveSellToastIcon":"True","FFlagLuaAppFixToastNotchOverlap":"True","FFlagStudioToolboxShowNoPluginResultsDetail":"False","FFlagStudioAssetCopySaleStatusFix":"True","FFlagFixAssetUploadFailedColor":"True","FStringRENAME_ABTEST_AllUsers_GameSearch_Q2DRankingEmphasisHideBad":"AllUsers.GameSearch.Q2DRankingEmphasisHideBadV2","FFlagLuaAppGameSearchQ2DEvents":"True","FFlagSimEnablePreciseConvexDecomposition":"True","FStringLuaDraggersBetaUrl":"https://web.archive.org/web/20200624170102/https://devforum.roblox.com/t/say-hello-to-the-new-lua-dragger-beta/504815","FFlagPlayTogetherFromGameCard":"True","FFlagSupportDeathTypeClient":"True","FFlagSupportDeathTypeServer":"True","DFFlagWaitForChildThrowNan":"True","DFFlagWaitForChildNoInfiniteTimerTask":"True","FFlagLuaAppGameImpressionsAnalyticsV2":"True","DFFlagEveryJointIsManualJoint":"True","FFlagLuaAppGameSearchImpressionsEvent":"True","FFlagInternalGameLocaleEnabled":"True","FFlagUseCanManageForDeveloperIconClient":"False","FFlagRemoveAssetUploadUrlSuffix":"True","FFlagEnableOverrideAssetGroupCreationApi":"True","FFlagLuaPublishFlowFixCreateButtonInChinese":"True","FFlagUserHandleChatHotKeyWithContextActionService_PlaceFilter":"True;4738806136","FFlagRenderSurfaceAppearance_v2_PlaceFilter":"True;5004798193","FFlagTerrainOpenCloseMetrics":"True","FFlagTerrainToolTabMetrics":"True","FFlagStudioServiceHoverInstance":"True","FFlagOnlyReadyHover":"True","FFlagFFlagFixMenuIcons":"True","DFFlagUseNewPostAuthenticationRequest":"True","DFFlagMicroprofileGroupAtLastStack":"True","FFlagRenderSurfaceAppearance_v1_ColorMapOnly_PlaceFilter":"True;5004798193","FFlagRenderAtmosphere":"True","FFlagCMSConsolidateAssetTypeInfo":"True","FFlagAssetConfigDarkerScrollBar":"True","FFlagUGCRemoveLearnMoreText":"True","FFlagToolboxUseNewAssetType":"True","FFlagStudioResizeEmulationDeviceWriteLock":"True","FFlagLuaAppRefreshScrollingFrameRefactor3":"False","FFlagStopDriveBySwipesOnScrollingFrames":"True","DFFlagAdminServerLogs":"True","FFlagPlayerDisplayName":"True","FFlagUserServiceWhiteListV2":"True","FFlagUserServiceEnabledV2":"True","FFlagTopBarFixCloseButtonMobile":"True","FFlagHideTopBarWhenInspectOpen":"True","FFlagNewInGameTopBarForEveryone":"True","FFlagABTestLoadingTimeStats":"True","FStringStudioUrlCSGv2SmoothingBeta":"https://web.archive.org/web/20200624170102/https://devforum.roblox.com/t/introducing-smoothingangle-property-for-partoperation/552810","FFlagUseRebroadcastEventSharedQueue2":"True","DFFlagGCNotAlwaysMemory":"True","DFIntStreamingMaxTargetPercentage_PlaceFilter":"200;4599786547","FFlagHandleCanceledToolboxDrag":"True","DFFlagTranslatorApiCloudAssetLoadingFix":"True","FFlagFixPackageDragSlow":"True","FFlagStudioCollectLocationType":"True","DFFlagReportBaseUrlForHttpAnalytics":"True","DFFlagDisablePackageRequestCache":"True","DFFlagStudioDelayModificationCheck":"True","DFFlagInitiateMultipleParallelConnection":"True","FFlagStudioSupportNilContextServices":"True","FFlagStudioGameSettingsResetStoreAction":"False","FFlagMoveViaSelectionCenter":"True","FFlagStudioMinorFixesForAssetPreview":"True","FFlagFixGetAssetTypeErrorHandling":"True","DFFlagEnableGetPlayFabTitleFromService":"True","DFFlagEnableAnalyticsServiceSetApiKeyEventSteam":"True","DFIntGetPlayFabTitleFromServiceRolloutPercentage":"100","FFlagCMSPremiumBenefitsLink":"False","FFlagStudioBetaFeaturesHideInfoButtonForMissingUrls":"True","FFlagStudioFixCrashInSendMockKeyboardNotificationsToLua":"true","FFlagRefactorPluginLoading4":"False","FFlagFuzzyTerrainNormal":"True","FFlagHandleFlakeyMouseEvents":"True","FFlagImprovedHandleParams":"False","DFIntLoadPackageFirstTimeDelayMs":"0","FFlagScriptEditorEnableRulers":"True","FFlagRenderImproveStreaming3":"True","FFlagNavHighlightUseUIBloxAnimatedItem":"True","FFlagAvatarExpereienceUseShimmerPanel":"True","FFlagAvatarExpereienceReplaceFitScrollingFrame":"True","FFlagSellPageUseVerticalScrollView":"True","DFFlagHumanoidDisplayNameEnabled":"True","FFlagAvatarExperienceBodySizeIndicator":"True","FFlagStudioAssetManagerDisableMagicCharacters":"True","FFlagAssetManagerContextMenuActionFixes":"True","DFFlagUseTimeoutMessage":"True","DFFlagEnsureNullCheckOnDisconnect":"True","DIntPackagePermissionPullingIntervalInSeconds":"10","FFlagFixAssetUploadName":"True","FFlagAssetConfigUseItemConfig":"True","DFFlagRemovePackageSymbolicLinkKId":"True","FFlagUserHandleChatHotKeyWithContextActionService":"False","FFlagDataModelPatcherReportToInflux":"True","FFlagLocalStorageDisablePathChangeChecks":"True","FFlagLuaAppUseLoadableEventTile":"True","FFlagPlayerListUseDisplayNameChina":"True","FFlagStudioSavePlaceAs2":"True","FFlagStudioPublishMediatorFailedConnection2":"True","DFFlagVideoLoadAssetsInStudioEdit":"True","FFlagLuauStringFastcall":"True","DFFlagLuauFasterUnpack":"True","FFlagScriptContextLastResume":"True","FFlagLuauNoGcDebt":"True","FFlagRenderTerrainGrassNoSpecular2":"False","DFFlagSupportIPv6MappedIPv4ForFloodCheck":"True","DFFlagVideoDoNotResetTimePositionOnStop":"True","FFlagNavigationTabBarVisibilityWithBack":"False","FFlagLuaAppSearchBarNoWrap":"True","FFlagStudioCloudEditShowErrorCode":"True","FFlagLuaAppDisplayNamesEnabled":"True","FIntMaxClients":"1023","FFlagUseInitialTerrainCache":"False","FFlagStudioThunkWithArgsMiddleware":"True","FFlagLuaCalculateJumpHeight":"True","DFFlagIPV6RobloxStudioCleanUp1":"True","FFlagAllowTextEntryToTakeSizeAndPositionProp":"True","FFlagStudioRestoreWatchTab":"True","FFlagRenderCorrectLinearUnderWaterFog":"True","FFlagRenderAtmosphereRefreshSky":"True","FFlagRenderAtmosphereRefreshSky2":"True","FFlagGameSettingsFixNameWhitespace":"True","DFFlagEnableDateTimeInReplicator":"True","FFlagEnableDateTimeInNetworkValueFormat":"True","FFlagUseDateTimeType3":"True","FFlagUseCorrectEndpointForPlaceVersion":"True","FFlagStudioCloudEditLogErrorCode":"True","FFlagAddHWModelForMac":"True","FFlagFixAssetManagerInsertWithLocation":"True","FFlagLuauCoroutineC":"True","FFlagHandleNoRotateTarget":"True","FFlagStudioHideStartPageUrlLinksCJV":"True","FFlagStudioShowUserFacingWebsiteCJV":"True","DFIntVideoImageReductionFactor":"1","DFFlagHttpServiceBetterUserAgent":"False","FFlagStudioCloudEditFixErrorCode":"True","FFlagHttpServiceNeverCache":"True","FFlagPolicyServiceStoreHttpResponseToLocalStorage":"True","FFlagEventIngestServiceRefactor":"True","FFlagLuaAppSidePaddingInChildren":"False","FFlagAvatarExperienceRemoveTempRouterFix":"True","FFlagPlayerListFixTitleBarTransparency":"True","FFlagStudioTransferBreakpointsFromBothPlayDMsToEditMode":"True","FFlagStudioUseInternalScriptDescendantForAllCases":"True","DFFlagFixAnalyticsServiceSetApiKey":"True","DFFlagPolicyServiceLuaApiAdaptiveToHttpResponse":"True","DFFlagPlayerPolicyReportHttpFailureToInfluxOnEveryAttempt":"True","DFFlagMeshLODVertexNormalFix":"True","FFlagSimBulletContactInitilizesConnector":"False","FFlagSimSolverOptimizedIslandizer2":"False","FFlagPackageFixDiffRootNameChange":"True","DFFlagFixPackageModificationCheckForPendingState":"True","DFFlagStudioDelayPackageAutoUpdate":"True","DFIntPackageAutoUpdateDelayMs":"0","DFFlagEphemeralCounterInfluxReportingEnabled":"True","DFIntEphemeralCounterInfluxReportingThrottleHundredthsPercent":"10000","DFIntEphemeralCounterInfluxReportingPriorityHundredthsPercent":"10000","DFFlagEphemeralStatsInfluxReportingEnabled":"True","DFIntEphemeralStatsInfluxReportingThrottleHundredthsPercent":"50","DFIntEphemeralStatsInfluxReportingPriorityHundredthsPercent":"10000","DFFlagInfluxEnableTypeEventTag":"True","DFFlagFixClientNetworkMetricsForParallelConnection":"True","FFlagVerifySliceCenterOnRenderNotSet":"True","FFlagFixInGameMenuMissingAssets":"True","FFlagPlayerListFixContextMenuFlashing":"True","FFlagFixActivatedEventDoubleFire":"True","DFFlagStreamingPrefetch":"True","FFlagRenderFixGrassUpdates":"True","FStringFeature_NewGameJoinInstance":"431;100","DFFlagFreeFmodGroupIfUnusuable":"True","DFFlagGetContextFreeDSPs":"True","DFFlagGetContextFreeSoundGroup":"True","DFFlagFreeDSPsIfUnusable":"True","FFlagLuauRequireTracer":"True","FFlagStudioLuauWarningTelemetry4":"True","FFlagStudioLSP_V1_1":"False","FFlagAppConfigurationEnableMultiBehaviorSupport3":"True","FFlagStudioLuauWarningTelemetry3":"True","FFlagDataModelPatcherReportToInflux2":"True","DFIntDataModelPatcherFunnelInfluxHundredthsPercentage":"1000","DFIntDataModelPatcherErrorInfluxHundredthsPercentage":"10000","DFIntDataModelPatcherFunnelInfluxPriorityHundredthsPercentage":"10000","DFIntDataModelPatcherErrorInfluxPriorityHundredthsPercentage":"10000","FFlagUseBlake2BHashInSharedString2":"True","DFFlagVideoFixSeekingBeyondTheEnd":"True","DFFlagVideoFixTextureLeak":"True","FFlagFixDraggerCursors":"True","FFlagLuaDraggerTerrainFixes":"True","FFlagDisallowFloatingPointErrorMove":"True","FFlagHandleOddNesting":"True","DFFlagVideoFixWebmParsing":"True","DFFlagVideoCacheTimePosition":"True","DFFlagVideoFixServerTimekeeping":"True","FFlagImprovedHandleParams2":"True","FFlagMinCursorChange":"True","FFlagRetainHoverPart":"True","FFlagStudioDeviceManagerDesignTweak":"True","DFFlagInstanceGuard":"True","FFlagShowAssetConfigReasons2":"False","DFIntStudioLuauIceInfluxHundredthsPercentage":"10000","DFIntStudioLuauWarningInfluxHundredthsPercentage":"10000","FFlagFixInspectAndBuyGamepad":"True","FFlagStudioTestServiceRunStateRecovery":"True","FFlagLuaAppGridViewRemoveStateDelay":"True","FFlagStudioRemoveExtraFindAction":"True","FFlagABTestResponseCounter":"True","FFlagProtectedStringUsesSharedString2":"True","FFlagStudioFixHashFromFileContentsLeak":"True","FFlagStudioShowCursorWhenSwitchingScripts":"True","FFlagUseCentralTime":"True","FFlagABTestControllerListener":"False","DFFlagFixUncaughtModuleContentSetParentException":"True","DFFlagStudioAddIsPackageAtTheEndOfRequestURL":"True","FFlagStudioSupportLinkForChina":"True","DFFlagUseSharedStringForScriptReplication2":"False","FFlagWaterReflectionWaveFix":"True","FFlagSortsAndFiltersFitComponentFix":"True","FFlagFastClusterCachePrimitive":"True","FFlagStudioGameSettingsNewUseRoactRodux":"True","FFlagStudioGameSettingsResetStoreAction2":"True","FFlagStudioConvertGameSettingsToDevFramework":"True","FFlagStudioStandaloneGameMetadata":"True","FFlagStudioUnrestrictPluginGuiService":"True","FFlagPublishPlaceSupportUnicodeTextLength":"True","DFFlagHttpTlsVerificationErrorCode":"True","DFFlagHttpServiceTlsProbeRetry":"True","DFIntHttpServiceTransportFailureInfluxHundrethsPercentage":"10000","FFlagStudioFixQPointerForTooltipView":"True","DFFlagStreamingAddAncestors2":"False","DFFlagReplicatorStreamingReportAncestorsSentWithoutAllDescendants":"False","FFlagStudioNewTableOutputWidgetSourceStr2":"True","DFFlagStreamingAddAncestors2_PlaceFilter":"True;4923553838;4923599624","FFlagLuaAppQ2DUXAdjustmentsBugfixes":"True","FFlagLuaAppUseNewGameTileGridStyle":"False","FFlagAEFitComponentMigration":"False","FFlagStudioEnablePVHBetaFeature":"True","FStringStudioUrlPlaceVersionHistory":"https://web.archive.org/web/20200624170102/https://devforum.roblox.com/t/beta-place-version-history-in-studio/607597","FStringStudioPlaceVersionHistoryHelpLink":"https://web.archive.org/web/20200624170102/https://devforum.roblox.com/t/beta-place-version-history-in-studio/607597","FFlagLuauCompoundAssignment":"True","FFlagLuauCompactLineInfo":"True","FFlagAvatarExperienceUseContextualMenu":"True","FFlagStudioFixFlatTerrainDefaultSaveLocation":"True","FFlagEnableUIBloxIcons":"True","FFlagRenderSuperLQTerrainGLES2":"True","DFFlagHttpServiceTlsProbe":"True","DFIntHttpServiceTlsProbePercent":"10","DFFlagDataStoreMoreInfoForVagueError":"True","FFlagFixShadowBiasYetAgain":"True","FFlagRenderShadowmapBatchUpdates":"True","FFlagLuaAppSidePaddingInChildren2":"True","FFlagLocalizationToolsPluginV3Enabled":"True","FFlagLuaAppsLocalizationToolsDeprecated":"True","FFlagEnableLuaStartupManager":"False","DFIntHttpServiceTlsProbeInfluxHundrethsPercentage":"10000","FFlagHideOneChildTreeviewButton":"False","FFlagCLIAPPBRIDGE414":"True","FFlagAvatarExperienceUseNewCharacterManager":"False","FFlagJIRA_RIDE_697":"False","FFlagJIRA_RIDE_711":"False","FFlagJIRA_RIDE_785":"True","FFlagXboxAppBridgeRewrite5":"False","DFIntJoinInfluxHundredthsPercentage_PlaceFilter":"10000;5064251723","FFlagCoreScriptsUseRoactRoduxNewConnectionOrder":"True","FFlagLuaAppUseRoactRoduxNewConnectionOrder":"True","FFlagXboxUseRoactRoduxNewConnectionOrder":"True","FFlagFixBlockedListInitLogic":"True","FFlagFixGamepadOldMenuOpening":"True","FFlagCoreScriptsNoHotKeysWhenMenuOpen":"True","FFlagLuauNativeTypeof":"True","FFlagLuauTypeofFastcall":"True","DFFlagCantSendTheseAnymore":"True","FFlagStudioLSP_V1_2":"True","FFlagGraphicsDisableMetalIntel":"True","FFlagStudioReportOpenPlaceTime":"True","FStringStudioReportOpenPlaceTimeFilter":"95206881","FFlagStudioCloudEditAddReadyAnalytics":"True","FFlagMegaReplicatorSharedClassInfo":"True","FFlagConnectErrorHandlerInLoadingScript":"True","DFFlagFixPrintJoinSizeBreakdown":"True","DFFlagOnlyReadPlayerOsOnServer":"True","DFLogClientRecvFromRaknet":"10","DFFlagDebugRakPeerReceive":"True","DFIntDebugRakPeerReceiveAfterSeconds":"10","DFFlagDebugRakPeerReceiveCountDistributedPackets":"True","DFIntHttpClientExternalTlsPeerVerificationFailHundrethsPercentage":"10000","FFlagQueryFrustumAndUpdateRange":"False","FFlagInterpolateCullDistance":"False","DFFlagCSGOperationStatisticsGA":"False","DFFlagCSGOperationsRespectsCollisionFidelityAtCreation":"True","FFlagImmHandlerFixJapaneseAndKorean_PlaceFilter":"False; 252877716","FFlagLuauEndMismatch":"True","FFlagRewriteScriptDocumentChangeEvent":"True","FFlagScriptEditorEnableMoveLinesCmd":"True","FFlagBatchBoundsChanged":"True","FFlagScaleUnionsUniformly":"True","FFlagDraggerBasisRotate":"True","FFlagLuaDraggerHandleScale":"True","FFlagAllowDragContinuation":"True","FFlagInventoryApiInHttpWhitelist":"True","DFStringHttpRbxApi17sAllowedHosts":"chat.roblox.com;presence.roblox.com;avatar.roblox.com;catalog.roblox.com;inventory.roblox.com","FFlagLuaDraggerPerf":"True","FFlagUseBulkMove":"True","DFFlagStreamingDontGCLocal":"True","DFFlagGetFriendsOnlineCachingEnabled":"True","DFFlagSimSolverLargeWorkloadReporting":"True","FFlagAddCountryCodeToUserModel":"True","FFlagToolboxUseNewPluginEndpoint":"False","DFFlagDataStoreNoSerializedDataInCache_PlaceFilter":"True;1052132952","FFlagRenderTerrainGrassNoSpecular3":"False","FFlagLuaAppGameSortGridABTestEnabledV2":"True","FStringLuaAppGameSortGridABTestJSONV2":"{\"ABTestData\" : { \"Control\" : {\"GridEnabled\" : false, \"GridRows\" : 0, \"UseGridMediumTile\" : false }, \"Variation1\" : { \"GridEnabled\" : false, \"GridRows\" : 0, \"UseGridMediumTile\" : false }, \"Variation2\" : { \"GridEnabled\" : true, \"GridRows\" : 2, \"UseGridMediumTile\" : false, \"ExcludedSorts\" : [\"MyRecent\"], \"SeeAllButtonType\" : 1 }, \"Variation3\" : { \"GridEnabled\" : true, \"GridRows\" : 2, \"UseGridMediumTile\" : false, \"ExcludedSorts\" : [\"MyRecent\"], \"SeeAllButtonType\" : 2 }, \"Variation4\" : { \"GridEnabled\" : true, \"GridRows\" : 2, \"UseGridMediumTile\" : false, \"ExcludedSorts\" : [\"MyRecent\"], \"SeeAllButtonType\" : 3 } }}","FFlagLoadCoreScriptsBeforeLock":"True","FFlagSimSolverOptimizedIslandizer3":"False","FFlagSupportContentIdDictionaryRemoval":"True","FFlagStudioEnablePVHBetaFeature2":"True","FFlagFixKeyframeDetectionV2":"True","FFlagStudioHideStandalonePluginScripts":"True","FFlagStudioFixTimingOnTeamCreateRestart":"True","FFlagEnableStudioProfiler":"True","FFlagAssetManagerFixAssetRemoval":"True","DFFlagPlayHereFix":"True","FFlagSingleSurfaceAppMarshallerDoTeleport":"True","FFlagRenderMarkDirtyOnlyRenderableChunks":"True","FFlagStudioFetchABTestForLuaApp":"True","FFlagFixTopBarOverLoadingScreen":"True","FFlagUseCanManageForDeveloperIconServer2":"True","DFFlagStudioHttpServiceProtectLegacyPathsForPlugins":"False","FFlagStudioServiceDraggerSolveConstraints":"True","FFlagFixOverriddenDragAssert":"True","FFlagAdultConfirmationEnabled":"False","FFlagAvatarExperienceRunSceneFix":"True","DFFlagDontHandlePlayerReplicationDataAsSpecialCase2":"True","FFlagJoinDataCacheOptimizeBlobCount":"True","FFlagJoinDataCacheCompressionImprovement":"True","FFlagArePartsTouchingOthers":"True","DFFlagDataStoreNoSerializedDataInCache":"False","FFlagCreateAndUpdateDataReplicationCache3":"True","DFFlagAnalyticsServiceMonitoring2":"True","FFlagScriptEditorRCityTelemetry":"True","FFlagRenderGlassTintLOD2FogFix":"True","FFlagRenderFixIncompleteMipChain":"True","FFlagAssetManagerLocalizationUpdate":"True","FFlagGameSettingsOnlyInPublishedGames":"True","DFFlagStreamingGCJobFixCharacterCheck":"True","FFlagAEReplaceFitImageTextFrame":"True","FFlagTopBarNewGamepadMenu_PlaceFilter":"True;2567750478","FFlagAddMissingConsoleAgreementTextInGameSettings":"True","FFlagFixFitToContentOnCloseError":"True","FFlagFixTextChangedFromEmptyForTextEntry":"True","DFFlagTeamCreatePublishToEventIngest":"True","FFlagStudioLoadCoreScriptsFromModel":"True","DFFlagEnableHumanoidControllerSubstepping_PlaceFilter":"True;4306999063","DFFlagEnableLowerFrequencyWorldSteps_PlaceFilter":"True;4306999063","FFlagUseSteppingParamsInsteadOfConstants_PlaceFilter":"True;4306999063","FFlagDebugDontForceCollisionsOnHumanoidParts_PlaceFilter":"True;4306999063","DFIntDebugDefaultTargetWorldStepsPerFrame_PlaceFilter":"1;4306999063","FFlagToolboxHideSearchForRecent":"True","FFlagStudioEnableBFSupportPluginDebugging":"True","FFlagLanguageServiceDoesntDirtyDataModel":"True","FFlagRefactorPluginLoading5":"True","FFlagSimDeprecateConstraintLegacyAngularVelocity":"True","FFlagResetPluginMouseIcon2":"True","FFlagStudioServiceHoverInstanceFix":"True","FFlagSelectWeldConstraints":"True","FFlagEnableUICornerBetaFeature":"True","FFlagFixInGameMenuSliderClamping":"True","FFlagCameraSensitivityAllowGranularKeyboardInput":"True","FFlagStudioPluginManagerInterface":"True","FFlagStudioTeleportServiceSanitize":"True","FFlagWrappedDevFrameworkLinkText":"True","FFlagUseCanManageForDeveloperIconClient2":"True","FFlagFixBadNormal":"True","FFlagFrameStepJointsParallel":"False","FFlagStudioSupportUploadGroupAnimations":"True","SFFlagTerrainRaycastsRespectCollisionGroups":"True","FFlagStudioTimeStampFix":"True","DFFlagRaknetBandwidthMetricsReportValidPing":"False","DFFlagRaknetBandwidthMetricsV2":"True","DFIntRaknetBandwidthInfluxHundredthsPercentageV2":"1000","DFFlagRaknetBandwidthAddPhyPacketsLossPercent":"True","DFIntRaknetBandwidthPingSendEveryXSeconds":"300","FFlagDeveloperEventIngestVerifyFeature_PlaceFilter":"True;3182856628","DFIntAnalyticsServiceEventIngestSwitchPercentage_PlaceFilter":"100;3182856628","DFFlagEnableAnalyticsSeriveEventIngest_PlaceFilter":"True;3182856628","FFlagABTestSystemShutoff":"False","FFlagStudioFixUndoAfterInsertByDrag":"True","FFlagFixOverrideAssetGroupPlugins":"True","FFlagStudioFixGroupCreatorInfo":"False","FFlagFixHorizontalScrollBarInControlsPage":"True","FFlagScrollInOnlyDirectionAvailable":"True","FFlagLuaAppEventsWithSession":"True","FFlagLuauBuiltinOs":"True","FFlagAllowGamepadConnectionEventsWhenNotFocused":"True","FFlagResetMobileGamepadsOnDataModelLoad":"True","FFlagAllowMobileGamepadCursor":"True","FFlagFixGamepadR3LastInputType":"True","FFlagEnableR3ButtonIOS":"True","FFlagFixGamepadMenuButtonIOS":"True","FFlagFixCaseSensitiveAssetNames":"True","FFlagFixGamepadCursorIdlePosition":"True","TreatAndroidInputSourceAsBitmask":"True","DFFlagCSGv2NormalSmoothing":"True","FFlagABTestControllerListener2":"True","FFlagFixOutBoundAccessInBoxMappedMesh":"False","FFlagLuaAppGameDetailsMorePWF":"True","FFlagLuaAppGameDetailsPlayWithFriendsABTest":"True","DFFlagEnableTelegrafPriorityTag":"True","FFlagStudioRemoveStudioInfluxHundredthsPercentage":"True","FFlagStudioAddDistTypeToUserAgent":"True","FFlagStudioExternalLoginEnabled":"False","FFlagStudioUserAgreementCheckEnabled":"False","FFlagStudioAddReloadOptionInLoginDialog":"False","FFlagMakePluginsActivatableInScripts":"True","FFlagLuaPremiumCatalogIGIAB":"True","FFlagLuaPremiumCatalogTileFix":"True","FFlagIAPProductReducerV2":"True","FFlagLuaAppNativePurchase":"True","FFlagLuaAppBulletSizeFix":"True","FFlagLuaFixEconomyCreatorStatsUrl":"True","FFlagLuaAppPremiumUpsellCancelFix":"True","FFlagLuaAppPeekViewHeightChangeFix":"True","FFlagIGPPPremiumPrice":"False","FFlagPremiumCatalogAESort":"True","FFlagLuaPremiumCatalogAEV2":"True","FFlagLuaPremiumCatalogIGPP":"True","DFFlagEnableSoapMicroprofiles":"True","FFlagLuaAppUseNewAccordion":"True","FFlagLuaAppUseNewLoadableImage":"True","DFFlagSupportEncryptedAssets":"False","DFFlagPerformAssetDecryptionOnAnAsyncTask":"True","FFlagDisableSpecialShapeInMeshPart":"True","FFlagGfxPartInvalidationLimitToTime2":"True","FFlagLuauStricterLib":"True","FFlagLuauInternalAlloc":"True","FFlagLuauVersion":"True","FFlagLuauFasterHash":"True","FFlagRemoveUILibraryTimeline":"True","FFlagDataModelPatcherConfigurerEnabled3":"True","FFlagRemoveEndOfScrollMessage":"True","FIntHttpCacheRedirectsTimeoutMs":"14400000","FFlagPlayerListFixXboxLayout":"True","AllowVideoPreRoll":"True","AxisAdornmentGrabSize":"12","CaptureCountersIntervalInMinutes":"5","CaptureQTStudioCountersEnabled":"True","DFFlagBoxMappedMeshLODFix_v2":"True","DFFlagCLI120342":"False","DFFlagCLI120342p7":"True","DFFlagCLI120342p72":"True","DFFlagCSGMeshLevelOfDetailV2":"True","DFFlagCyclicExecutiveThrottlingCancelWorldStepAccum":"False","DFFlagDebugVisualizerTrackRotationPredictions":"True","DFFlagDoNotRenderMeshLODByDefault":"True","DFFlagEnableRemoteProfiling":"True","DFFlagEnableRemoteProfilingForDevConsole":"True","DFFlagFavorIPV4Connections":"False","DFFlagFindClosestHandleHitTestFixEnabled":"True","DFFlagFixCutAndUndoAfterSavingCSGUnionToNewFile":"True","DFFlagForceNoBloomInThumbnail":"True","DFFlagGenerateMeshLOD_Fix1":"True","DFFlagGetPolicyInfoForPlayerAsyncEnabledClient":"True","DFFlagGoodbyeChoiceActiveProperty":"True","DFFlagHttpCleanupRbxCurl":"True","DFFlagLockViolationInstanceCrash":"False","DFFlagLockViolationScriptCrash":"False","DFFlagOrder66":"False","DFFlagPreventReturnOfElevatedPhysicsFPS":"True","DFFlagPugiCrashOnUnhandledXml":"True","DFFlagRakNetDetectNetUnreachable":"True","DFFlagReflectionLoggingEnabledClientWin32_3":"True","DFFlagReflectionLoggingEnabledGlobal":"True","DFFlagReflectionLoggingpPlacelauncherInitialization":"True","DFFlagRenderGatherMsFrame2":"True","DFFlagReportClientMemoryCat":"True","DFFlagReportInfluxRenderMsFrameMetrics2":"False","DFFlagReportOutlines":"True","DFFlagScrollWhenInsideFocusedTextBox":"True","DFFlagServerCopiesPlayerGui3_PlaceFilter":"false;142823291","DFFlagSkipLQNeonWhenOff":"True","DFFlagStudioSendOnlyOneShutdownEvent":"True","DFFlagSupportMeshLOD":"True","DFFlagSupportMeshLOD_PlaceFilter":"True; 2900823006","DFFlagTextBoxesNeverSinkMouseEvents":"True","DFFlagThrottleDebuggerMetrics":"True","DFFlagThumbnailFixSrgb":"True","DFFlagUsePugiXmlForPlaces":"True","DFFlagUserInputServiceProcessOnRender":"True","DFFlagYouAreNotSupposedToBeHere":"True","DFIntAnalyticsCDNProbeInfluxPermyriad":"100","DFIntAnalyticsNS1CDNProbeChancePercent":"5","DFIntAndroidInfluxHundredthsPercentage":"0","DFIntApiRateLimit":"200","DFIntBgUpdateRedirectsHttpErrInfluxHundredthsPercentage":"100","DFIntBroadPhaseIslandBufferZoneMinPartLimit":"0","DFIntBroadPhaseIslandBufferZoneMinPartLimit_PlaceFilter":"5;1105449649","DFIntCSGLevelOfDetailSwitchingDistance":"250","DFIntCSGLevelOfDetailSwitchingDistanceL12":"500","DFIntDraggerMaxMovePercent":"60","DFIntElevatedPhysicsFPSReportThresholdTenths":"585","DFIntGroupServiceRolesApiV2":"0","DFIntHttpCacheCleanMaxFilesToKeep":"7500","DFIntHttpCacheCleanMinFilesRequired":"10000","DFIntHttpParallelLimit_RequestContentProvider":"0","DFIntHttpSendStatsEveryXSeconds":"300","DFIntICMPPingHundrethsPercentage":"0","DFIntLocServicePerformanceAnalyticsHundredthsPercentage":"1000","DFIntMacInfluxHundredthsPercentage":"0","DFIntMaxMissedWorldStepsRemembered":"16","DFIntReflectionLoggingRolloutPerMil":"2000","DFIntRenderMsFrameInfluxHundredthsPercentage":"1000","DFIntReportReplicatorStatsToInfluxHundredthsPercent":"5000","DFIntS2PhysicsSenderRate":"15","DFIntSendJoinTimeDeltasToDiag_HundredthsPercentage":"100","DFIntSendRakNetStatsThrottle":"2","DFIntStreamJobMaxBufferHealthThresholdHundredths":"75","DFIntStreamJobMaxBufferHealthThresholdHundredths_PlaceFilter":"50;1526666203","DFIntStreamJobMinBufferHealthThresholdHundredths":"40","DFIntStreamJobMinBufferHealthThresholdHundredths_PlaceFilter":"30;1526666203","DFIntTargetTimeDelayFacctorTenths":"20","DFIntTeleportExceptionInfluxHundredthsPercentage":"9000","DFLogPlaceLauncherTeleportLog":"6","DFLogSoundTrace":"4","DFStringCrashUploadToBacktraceBlackholeToken":"7705528468a303e4e34a13fbcf9e42e219633ed6868e143e5ab16cd33bd2a069","DFStringCrashUploadToBacktraceMacPlayerToken":"24cb37449e120c3a0618b1bf0585e339571828cae4dc73c7b8c99f67fcd751e9","DFStringCrashUploadToBacktraceWindowsPlayerToken":"417ecb0fbc032ce087e6af3b780c298e3356089f050c8130d2318109e80417a4","DFStringGamePerfMonitorPercentageCountryOverride":"CN,50,AU,50,NZ,50","DFStringHttpInfluxDatabase":"prod","DFStringOverrideSendRakNetStatsThrottleCountries":"CN,50,JP,20,NO,20,FI,20,SE,20,NZ,20","DFStringSendJoinTimeDeltasHundPrecCountryOverride":"CN,5000,US,100,AU,3000,KR,2000,NZ,3000,JP,4000,NO,2000,FI,2000,SE,1000,FR,1000,DK,1000","DFStringSendJoinTimeStatsHundPrecCountryOverride":"CN,5000,US,100,AU,3000,KR,2000,NZ,3000","DFStringSendJoinTimeStatsHundPrecCountryOverride_PlaceFilter":"CN,10000,US,10000,AU,10000,KR,10000,NZ,10000;189707","DFStringWorkspaceMessageLink":"https://web.archive.org/web/20200624170102/https://devforum.roblox.com/t/physics-deprecating-the-legacy-spring-physics-solver/163521","DFStringWorkspaceMessageText":"We are in the process of disabling and removing the legacy solver. Click here for more info...","EnableRemoteThemeCheckOnAndroidV3":"True","FFlagAdditionalTextBoxShortcuts":"True","FFlagAdvancedMouseSensitivityEnabled":"True","FFlagAllowBackpackBinding":"True","FFlagAppBackgroundMode2":"True","FFlagApplyPlaceFilterEarly2":"True","FFlagAvatarEditorEmotesSupport":"True","FFlagAvatarEditorEnableThemes2":"True","FFlagAvatarEditorHideSliderHighlightOnInit":"True","FFlagAvatarEditorLightThemeFix2":"True","FFlagBrilliantBorders":"True","FFlagCLI18241":"True","FFlagCLI18241A":"True","FFlagCLI18241B":"True","FFlagCLI21289":"True","FFlagCLI23302":"True","FFlagCLI26327":"True","FFlagCLI26526":"True","FFlagCLI26775":"True","FFlagCLI26856":"True","FFlagCLI26858":"False","FFlagCLI27641A":"True","FFlagCLI27760":"True","FFlagCLI28630":"True","FFlagCLI28759":"True","FFlagCSGv2BalanceExponents":"False","FFlagCSGv2FixOrientationWhenSeparatingNegates":"True","FFlagCSGv2UnionOrientationFromFirstPart":"True","FFlagCSGv2UnparentPartsBeforeModifyingCFrames":"True","FFlagCSGv2UseImprovedSphereAndCylinder":"True","FFlagCSGv2UseIterativeSimplification":"True","FFlagClientFireEventPlaceLauncherFail3":"True","FFlagCompatibilityUseSpecularMult":"True","FFlagConnectionScriptEnabled_PlaceFilter":"False;1608755154","FFlagCoreScriptBetterEmotesErrorMessaging":"True","FFlagCoreScriptEmotesMenuAnalytics":"True","FFlagCoreScriptEmotesMenuBetterMouseBehavior":"True","FFlagCoreScriptEmotesMenuEnabled2":"True","FFlagCoreScriptPlayerListPremiumIcon2":"True","FFlagCoreScriptSettingsHelpRightKeys":"True","FFlagDebugCSGExportFailure":"False","FFlagDebugCrashEnabled":"False","FFlagDebugGraphicsIntelCrash":"False","FFlagDebugUseDefaultGlobalSettings":"True","FFlagDevConsoleBetterResize":"True","FFlagDevConsoleFixCommandBarForNonOwners":"True","FFlagDevConsoleFixMicroprofilerSyncIssues":"True","FFlagDevConsoleFixTopBarDragging":"True","FFlagDevConsoleFixTopBarIcons":"True","FFlagDevConsoleIsVeryStickyWhyWillItNotLetGo":"False","FFlagDevConsoleLogNewLineFix":"False","FFlagDevConsoleNoDisableAllFilters":"True","FFlagDevConsoleTabMetrics":"True","FFlagDevConsoleUpdateLayering":"True","FFlagDisabledLayerCollectorsShouldNotSinkInput":"True","FFlagDontDisconnectJointUpdateUnlessNecessary":"False","FFlagDontSubmitBlankGameReports":"True","FFlagDontUseUploadUrlForPublish":"True","FFlagEmotesMenuRemoveOpenKeybinds":"True","FFlagEmotesMenuShowUiOnlyWhenAvailable":"True","FFlagEnableAndroidVsync":"True","FFlagEnableContactsApiService":"False","FFlagEnableDisablingNetworkPause":"True","FFlagEnableGameSignalRWithAllPlatforms1":"False","FFlagEnableGranularMemoryTabStats":"True","FFlagEnableIsPremiumSettings":"True","FFlagEnableLuaEventStreamRelease":"True","FFlagEnableNetworkPauseGui":"True","FFlagEnableRbxThumbAPI":"True","FFlagEnableRemoteThemeCheckOniOSV2":"True","FFlagErrorPromptTakeExtraConfigurations":"True","FFlagFFlagAvatarEditorFixToolStuckOnRightArmEquip":"True","FFlagFetchPremiumMigrationNoticeOnlyForBcUsers":"True","FFlagFixAndroidKeyboardInput":"True","FFlagFixFolderDescendantSelection":"True","FFlagFixGamepadReportPlayer":"True","FFlagFixGamepadVibrationNotEnding":"True","FFlagFixIECompatiblityBug":"True","FFlagFixMacFullscreenTrackingInMenu":"True","FFlagFixOutOfBoundsMouseLocation":"True","FFlagFixQuickCancelPurchase":"False","FFlagFixScrollingFrameClipRect":"True","FFlagFixSmallSurfaceGuiMouseInput":"True","FFlagFixTerrainAnisoVoxelisation":"True","FFlagFixTextureCubeFramebuffers":"True","FFlagForceCursorVisibleOnPurchasePrompt":"True","FFlagFutureIsBrightCompatibilityMode":"True","FFlagFutureIsBrightForceCompatibilityOverLegacy":"True","FFlagFutureIsBrightPhase2Android":"True","FFlagFutureIsBrightPhase2FPCheck":"True","FFlagFutureIsBrightPhase2iOS":"True","FFlagGameExplorerCopyPath":"True","FFlagGraphicsGL3InstancingEnabled5":"True","FFlagGraphicsGL3UseUBO3":"True","FFlagGraphicsGLDisableVAO":"True","FFlagGraphicsGLDoubleBufferDynamic":"True","FFlagGraphicsMetalPrivateMemory":"True","FFlagGroupEditDevConsoleButton":"True","FFlagHelpMenuShowPlaceVersion":"True","FFlagHowToSendAMessage":"True","FFlagHttpServiceWorldsMostOverkillFlagForMovingCodeFourLines":"True","FFlagInterpolationAwareTargetTime":"True","FFlagJoinTimeCounters":"True","FFlagLocServiceNullPtrCheckGetTranslator":"True","FFlagLocServicePerformanceAnalyticsEnabled":"True","FFlagLuaAppConvertUniverseIdToStringV364":"False","FFlagLuaAppEnableErrorReporterRateLimit":"True","FFlagLuaAppEnableStyleProvider":"True","FFlagLuaAppGameSearchPlayerSuggestion376":"True","FFlagLuaAppPremiumUpdatePrompt3":"True","FFlagLuaAppSiteMessageBannerEnabled":"True","FFlagLuaAppSizesWithValidDefaults":"True","FFlagLuaAppUseGraphicWithBorderForPresenceV373":"True","FFlagLuaAppUseNewPremiumIcon2":"True","FFlagLuaChatAnalyticsEnabled":"True","FFlagLuaChatBoldUnreadMessageText":"True","FFlagLuaChatCenterAndroidHeader":"True","FFlagLuaChatEnableFrequentUsersDiag":"True","FFlagLuaChatFixConversationHubHeaders369":"True","FFlagLuaChatHeaderEnableHomeButton":"True","FFlagLuaChatOnlyMarkUnreadWhenChatIsFocused":"True","FFlagLuaChatPressEnterToSend":"True","FFlagLuaChatRecoverSignalRConnection":"True","FFlagLuaChatResizeUserChatBubbleModerationError":"True","FFlagLuaChatRoactAssetCard":"True","FFlagLuaChatScreenManagerAlwaysUpdatesWithDefaultsV390":"True","FFlagLuaChatScreenManagerResumeAndPauseAfterNavigation":"True","FFlagLuaChatShareGameBottomBarOverride":"True","FFlagLuaChatSwipeToGoBackFromConversation369":"True","FFlagLuaChatToastRefactor369":"True","FFlagLuaDebuggerBreakOnError":"True","FFlagLuaEnableRemoteThemeCheckV4":"True","FFlagLuaHomePageShowAddFriendsButtonV361":"True","FFlagLuaInviteFailOnZeroPlaceIdV384":"True","FFlagLuaInviteGameHandleUnknownResponse":"True","FFlagLuaInviteGameMockTextLocalization":"True","FFlagLuaInviteModalEnabledV384":"True","FFlagLuaInviteNewAnalytics":"True","FFlagMainBufferGuiLayoutTextAt1x":"False","FFlagMainBufferGuiLayoutTextAt1x2":"True","FFlagMemoryFromAppShellReporterIOS":"True","FFlagMeshLODFixOutOfBoundAccess":"True","FFlagMeshLODUseAsyncHttpPost":"True","FFlagMetricCorrection":"True","FFlagMicroProfilerSessionAnalytics":"True","FFlagMonitorBatteryLevel":"True","FFlagNewDefaultScriptSource":"True","FFlagPGSAlwaysActiveMasterSwitch":"True","FFlagPerformPurchaseAcceptsGamePassInfoType":"True","FFlagPerformanceProfilerAnalytics":"True","FFlagPhoneHomeSooner":"True","FFlagPlaceLauncherScriptShutdownTimeout":"True","FFlagPlayerListNewIcons":"False","FFlagPlayerListPremiumPadding":"True","FFlagPointerActions2":"True","FFlagPreCoreBlurChunksMdrSpace":"True","FFlagReconnectToStarterPlace":"True","FFlagRemoveWakeForRenderJob":"True","FFlagRenderEmitterRecomputeOnChange":"False","FFlagRenderEnableMSAAShadows":"True","FFlagRenderForcefieldCacheFix":"True","FFlagRenderForcefieldFix":"True","FFlagRenderForcefieldMaterial2":"True","FFlagRenderInstancingEnabled8":"True","FFlagRenderMetalMemorylessTargets":"True","FFlagRenderNewMinShadingLevel":"True","FFlagRenderPartInstancingEnabled6":"True","FFlagRenderShadowClearFix":"True","FFlagRenderShadowDynamicInstancing":"True","FFlagRenderShadowLODFix":"True","FFlagRenderShadowSingleCascade":"True","FFlagRenderUseShadowGeometryForLegacyShadows":"True","FFlagReportDevConsoleOpenClose":"True","FFlagReportInGameAssetSales":"True","FFlagReportLocalizationDataLoadingException":"True","FFlagReportWndGestures":"False","FFlagResetMouseDeltaFix":"True","FFlagRobloxGuiSiblingZindexs":"True","FFlagScrollingFrameSinkMoreInput":"False","FFlagSetClientJobId":"True","FFlagSetPlaceIdInAdvance3":"True","FFlagSettingsHubInviteReleaseStreamTimeAs10":"True","FFlagSettingsHubInviteToGameDefaultThumbnailSize150x150":"True","FFlagSkyNoTranslationAndSaturate":"True","FFlagStudioABTestFramework":"True","FFlagStudioCollectGPUInfo":"True","FFlagStudioEnableWebKitPlugins":"True","FFlagStudioFixSciptOpenBehavior":"False","FFlagStudioImagePickerFix":"True","FFlagStudioOutputSaveFileAsLink":"True","FFlagStudioShowTutorialsByDefault":"True","FFlagStudioTrustsPlayersImmediately":"True","FFlagStudioTutorialSeeAll":"True","FFlagTextBoxOverrideManualFocusRelease":"False","FFlagTextMeasureTemporaryPatch":"True","FFlagTrackWindowsVideoRecording":"True","FFlagTranslateAvatarContextMenu":"True","FFlagUSC180727A":"True","FFlagUSC180727C":"True","FFlagUSC180727D":"True","FFlagUSC24644":"True","FFlagUSC26572":"True","FFlagUnlockMouseIfKicked":"True","FFlagUnlockedTopbarTransparency":"True","FFlagUseNewErrorStrings":"True","FFlagUseRBXThumbInToolbox":"True","FFlagUseSetForegroundWindowForPlayer":"False","FFlagUserAnimateScriptEmoteHook":"True","FFlagUserBetterDynamicTouchstickCamera":"True","FFlagUserBetterHandlingVehicleInputStates":"True","FFlagUserBetterInertialScrolling":"False","FFlagUserClickToMoveBetterCleanup":"True","FFlagUserClickToMoveCancelOnMenuOpened":"True","FFlagUserDTDoesNotForceAutoJump":"True","FFlagUserDTDoesNotTrackTools":"True","FFlagUserDTFastInit":"True","FFlagUserDynamicThumbstickUseContextActionSevice":"True","FFlagUserEnableDynamicThumbstickIntro_PlaceFilter":"True;1817743405","FFlagUserFixCharacterRemovingControlModule":"True","FFlagUserFixChatMessageLogPerformance3":"False","FFlagUserFixChatMessageLogPerformance4":"True","FFlagUserFixChatMessageLogPerformance_PlaceFilter":"True;370731277","FFlagUserFixClickToMoveWithACM":"True","FFlagUserFixMovementCameraStraightDown":"True","FFlagUserFixTouchGuiWhenNoCharacter":"True","FFlagUserHttpAPIVisible":"True","FFlagUserInputServicePipelineMacClient":"True","FFlagUserInputServicePipelineStudio":"True","FFlagUserInputServicePipelineWindowsClient":"True","FFlagUserNavigationFixClickToMoveInterruption":"True","FFlagUserNewClickToMoveDisplay":"True","FFlagUserNewDefaultCameraAngle":"True","FFlagUserNewPoppercam":"False","FFlagUserNewPoppercam3":"True","FFlagUserNewPoppercam3_PlaceFilter":"False;1997193809;734159876","FFlagUserNewPoppercam4":"True","FFlagUserNewPoppercam_PlaceFilter":"False;855499080;606849621;537413528;402122991","FFlagUserNoCameraClickToMove":"True","FFlagUserNoDynamicThumbstickRecenter":"True","FFlagUserPlayEmoteBySlotEnabled":"True","FFlagUserPlayEmoteChatCommand":"True","FFlagUserPlayerScriptsBindAtPriority":"False","FFlagUserPlayerScriptsBindAtPriority2":"True","FFlagUserPointerActionsInPlayerScripts":"True","FFlagUserPoppercamLooseOpacityThreshold":"True","FFlagUserThumbstickFrameIsActuallyFrame":"True","FFlagUserUpdateCameraConstants":"True","FFlagUserUseNewControlScript":"True","FFlagVideoDocumentationPluginEnabled":"True","FFlagVideoRecordDeadlockFix":"True","FFlagVideoRecordFix":"True","FFlagVideoRecordFix2":"True","FFlagWorldAvatarLocalization":"True","FIntCLI20390_2":"16","FIntCompatibilityModeSpecularMultiplierDiv100":"30","FIntGamePerfMonitorPercentage":"10","FIntGraphicsVulkanARMVaryingBufferMb":"160","FIntGraphicsVulkanMinAndroidVersion":"25","FIntGraphicsVulkanMinDriverVersionPVR":"4981305","FIntHttpCurlMaxCachedHandlesPerHost":"8","FIntLocalizationAnalyticsSamplesPerMillion":"1000000","FIntLuaAppMorePagePremiumIcon":"2","FIntNewDevConsoleMaxHttpCount":"300","FIntNewDevConsoleMaxLogCount":"500","FIntNumberParallelNarrowPhaseTasks_PlaceFilter":"10;189707;3229213183;654732683","FIntPercentReportingNetworkProfileAfterStartup":"20","FIntRegLambda":"1400","FIntSendScreenOrientationToEventIngestHundredthsPercentage":"100","FIntStartupInfluxHundredthsPercentage":"100","FIntStudioInsertDeletionCheckTimeMS":"30000","FIntUSC180727B":"32","FIntValidateLauncherPercent":"100","FIntWeldConstraintAdornSize":"10","FIntZoomOutDistance":"500","FLogBrowserActivity":"3","FLogCloseDataModel":"3","FLogDXVideoMemory":"4","FLogFullRenderObjects":"0","FLogGraphics":"6","FLogHangDetection":"3","FLogLuaBridge":"2","FLogNetworkItemQueueDtor":"1","FLogPlayerShutdownLuaTimeoutSeconds":"1","FLogVR":"6","FStringCLI27760S":"nn62qq5r3q8n9sn537r1r00o43nq1p458391556o","FStringGamesUrlPath":"/games/?referrer=roblox-player","FStringSettingsHubInviteToGameThumbnailSize":"Size150x150","FStringStudioTutorialsTOCUrl":"https://web.archive.org/web/20200624170102/http://wiki.roblox.com/index.php?title=Studio_Tutorials_Landing&studiomode=true","FStringStudioTutorialsUrl":"https://web.archive.org/web/20200624170102/http://wiki.roblox.com/index.php?title=Studio_Tutorials_Test&studiomode=true","GoogleAnalyticsAccountPropertyID":"UA-43420590-3","GoogleAnalyticsAccountPropertyIDPlayer":"UA-43420590-14","GoogleAnalyticsLoadStudio":"1","PublishedProjectsPageHeight":"535","PublishedProjectsPageUrl":"/ide/publish","PublishedProjectsPageWidth":"950","StartPageUrl":"/ide/welcome","VideoPreRollWaitTimeSeconds":"45","FFlagFutureIsBrightPhase2_5_v1":"True","FFlagEnableRobuxABTest":"True","FFlagFutureIsBrightPhase2_5_v2":"False","DFFlagTattletaleUseStrstr":"True","DFFlagDebugCurlOption12":"True","DFFlagDebugCurlOption22":"True","FFlagRecordRecording":"True","FFlagTheseAreSomeOfMyBestAttributes":"True","DFFlagTheseAreSomeOfMyBestAttributes":"True","FIntDebugForceMSAASamples":"1000","DFIntDebugForceMSAASamples":"1000"}}) + return res.json({ + applicationSettings: { + DFFlagRCCKickDuplicatePlayersOnJoin: "True", + FFlagRCCKickDuplicatePlayersOnJoin: "True", + DFFlagDebugAllowLocalRccKicks: "True", + FFlagDebugLocalRccServerConnection: "False", + FFlagChinaLicensingApp: "False", + FFlagShowConnectionErrorCode: "True", + FFlagCoreScriptFasterCreate: "True", + FFlagLocalizeErrorCodeString: "False", + DFFlagAccoutrementWeldingFilteringEnabled: "False", + DFFlagAddOSToPlayerInfoTable: "True", + DFFlagAddSoundEnabledInitializationParam: "True", + DFFlagAddStreamingAndResourceUsageUrlParams: "True", + DFFlagAllowJoinsToWait: "True", + DFFlagAllowPackageLinkAncestoryClone: "True", + DFFlagAnalyticsCDNProbeOnlyQueryOneHost: "True", + DFFlagAnalyticsReportHttpStatsAtExit: "True", + DFFlagAnalyticsServiceMonitoring: "True", + DFFlagAnimationLoadSimplification: "False", + DFFlagAnimationLoadSimplification2: "True", + DFFlagAnimatorOnSteppedKeepAlive: "True", + DFFlagAssumeNoBreakableJoints: "True", + DFFlagAttemptFixXBoxCrash: "True", + DFFlagAvoidResetCurrentRegion4: "True", + DFFlagBatchApiAssetArchiving: "False", + DFFlagBatchAssetApiNoFallbackOnFail: "True", + DFFlagBatchAssetApiTrackFailedUrls2: "True", + DFFlagBetterTimeStamp: "True", + DFFlagBetterTypeErrors: "True", + DFFlagCSGMeshDeserializationFix: "True", + DFFlagCSGMeshLevelOfDetailV2_PlaceFilter: + "True;2434889832;2568147212", + DFFlagCSGMeshLevelOfDetail_Fix2: "True", + DFFlagCSGMeshV4DeserializerEnabled: "True", + DFFlagCSGv2SkipDegenerateTriangles: "True", + DFFlagCSGv2StatisticsFix: "True", + DFFlagCSGv2UseMegaAssetFetcher: "True", + DFFlagCSGv2UsePositionClustering: "True", + DFFlagCacheAverageClientPing: "True", + DFFlagCacheInAssemblyForSending: "True", + DFFlagCatchCharacterLoadingErrors: "True", + DFFlagCheckCoreLocalizationLoading: "True", + DFFlagCheckForNullSoundChannel: "True", + DFFlagCheckForNullWhenCloningInstances: "True", + DFFlagCheckGameValidityInDoTeleport: "True", + DFFlagCheckMultipleLoadCharacterCalls: "True", + DFFlagCheckPVDifferencesForInterpolationChoice: "True", + DFFlagClampPitch2: "True", + DFFlagCleanCacheMoveMutex: "True", + DFFlagClearUnusedLuaRefsWithJob: "True", + DFFlagClientHappyNewYear1: "True", + DFFlagClientJoinProcessToEventIngest: "True", + DFFlagCloudTablesEnforceAccountAge: "True", + DFFlagCloudTablesPhase2_AddCloudTableToListOnCreate: "True", + DFFlagCloudTablesPhase2_CreateTableEarly: "True", + DFFlagCloudTablesPhase2_IgnoreEmptyManifestReport: "True", + DFFlagCloudTablesPhase2_MissingSourceTextScraperFix: "True", + DFFlagCloudTablesPhase2_TrackLocaleFetchCallsites: "True", + DFFlagCloudTablesPhase2_WaitForSourceFix: "True", + DFFlagCollectSoundInfo: "True", + DFFlagContactManifoldCountReportingEnabled: "True", + DFFlagContentProviderAssetdeliveryRolloutEnabled2: "True", + DFFlagContentProviderUseLambdas: "True", + DFFlagDarwinIncludeMemReusable: "True", + DFFlagDataModelSetAnalyticsDatacenterId: "True", + DFFlagDataStoreAutoHttpRetry: "False", + DFFlagDataStoreDontTouchCachedRecordOnGetAsync: "True", + DFFlagDebugAnalyticsForXBoxCrash: "True", + DFFlagDebugAnalyticsForXBoxCrashOnSuccessAlso: "True", + DFFlagDebugEnableRemoteProfiling2: "True", + DFFlagDebugGAReportThrottledSessions: "True", + DFFlagDebugLaunchTimeByCountryPlaceSpecific_PlaceFilter: + "true;189707", + DFFlagDebugReportSoundAssetsFromList: "True", + DFFlagDeleteEventInvocationArgsSerially: "True", + DFFlagDidNotEatPizzaToday: "True", + DFFlagDoNotInvalidateMe: "True", + DFFlagDoNotRepositionSeated: "True", + DFFlagDoNotRunAnimationEditorInPlayMode: "True", + DFFlagDoParallelInterpolationFixUnguardedBufferClear: "True", + DFFlagDoParallelInterpolationSetPV2: "True", + DFFlagDontCallOnMovingAssemblyRoot: "False", + DFFlagDontWhitelistUserInputConnectionCounts: "True", + DFFlagDynamicFastVariableSupportFileSource: "True", + DFFlagDynamicLocalizationTablesNonBlocking2: "True", + DFFlagDynamicReloaderDoWork: "True", + DFFlagEmoteLoadingEnabled: "True", + DFFlagEmotesApiEnabled: "True", + DFFlagEnableFillCylinder: "True", + DFFlagEnableMeshHeadAttachments: "True", + DFFlagEnableMeshHeadNative: "True", + DFFlagEnableMessagingService: "True", + DFFlagEnableMessagingServiceAnalysis: "True", + DFFlagEnablePlayFabBatchEventCompression: "False", + DFFlagEnablePrintJoinSizeBreakdown: "True", + DFFlagEnableWakingPGSJointsForNonSolverPrimitives: "True", + DFFlagEnforceSlaveStateEnabledStatus: "True", + DFFlagEvenBetterTimeStamp: "True", + DFFlagExternalWakeOtherAssembly2: "False", + DFFlagFasterResetRoot: "True", + DFFlagFasterVectorIndex: "True", + DFFlagFileSystemReadDirFix: "True", + DFFlagFileWatcherMultipleEventPerUpdateCall: "True", + DFFlagFireHealthChangedLater: "True", + DFFlagFixCLI28389: "True", + DFFlagFixCharacterAppearanceLoadedEvent2: "True", + DFFlagFixDataStoreWarningKeyEmpty: "True", + DFFlagFixEmotesInventoryOverwrite: "True", + DFFlagFixEquipToolAssertWhenHumanoidNotInDataModel: "True", + DFFlagFixExtractFirstLOD: "True", + DFFlagFixInvalidateCache: "True", + DFFlagFixManualJointAdornCrash: "False", + DFFlagFixMasslessInertiaContribution: "True", + DFFlagFixMeshNormalsForNonUniformScaling: "True", + DFFlagFixMoveToSlowAfterAnalogControls: "True", + DFFlagFixNewTriangleMeshCreation: "True", + DFFlagFixPVSpaceTransform: "True", + DFFlagFixReadCache: "True", + DFFlagFixRootPartCollisionForR6: "True", + DFFlagFixSetupAnimationWeights: "True", + DFFlagFixSpawningPerformanceAndInaccuracies: "True", + DFFlagFixThrottlingCalculationForRot: "True", + DFFlagFixTimeConversion: "True", + DFFlagForwardRefCheckMegaReplicator: "True", + DFFlagGenericPublicKeyIndex2: "True", + DFFlagGetAutoTranslationEntriesEnabled2: "True", + DFFlagGetBundleDetailsAPI: "True", + DFFlagGetCountryRegionForPlayerAsyncEnabled: "True", + DFFlagGetPolicyInfoForPlayerAsyncEnabled: "True", + DFFlagGetTeamLazyEvaluation: "True", + DFFlagGetTranslatorForLocaleAsyncEnabled2: "True", + DFFlagGroupTeleportAddTeleportIdParameter: "True", + DFFlagGroupTeleportJoinDataOverWrite: "True", + DFFlagHoldTrottleValue: "True", + DFFlagHttpAssetArchiveWarning: "False", + DFFlagHttpBatchApiSupportAssetdeliveryInputUrls: "True", + DFFlagHttpBatchCompress: "True", + DFFlagHttpCacheAsync: "True", + DFFlagHttpCacheCleanupNew: "True", + DFFlagHttpCacheMissingRedirects: "True", + DFFlagHttpClientCleanTimedCallbacks: "True", + DFFlagHttpClientDisabledSkipCache: "True", + DFFlagHttpErrMessageFix: "True", + DFFlagHttpErrorNestingFix: "True", + DFFlagHttpMarkExternalRequests: "True", + DFFlagHttpStatisticsFix: "True", + DFFlagHttpTcpKeepalive: "True", + DFFlagHumanoidWithPGSConstraintsUsePhysicsState: "True", + DFFlagInWithTheNew_PlaceFilter: "true;1034242130;2528277338", + DFFlagInventoryFetchUseInventoryApi: "True", + DFFlagJoinDataCacheChecksClientOwnedParts: "True", + DFFlagJsonParsePrimitives: "True", + DFFlagLDLPGSStatsEnabled: "True", + DFFlagLetTouchFlush: "True", + DFFlagLinkedSourceLoadSimplification: "True", + DFFlagLocServiceTrackPlayerTextScraping1: "True", + DFFlagLocService_InvalidateTranslationsOnChildAdded: "True", + DFFlagLocTableNormalizeLocaleAttemptTranslation: "True", + DFFlagLocalizationLanguageDelimiterFix: "True", + DFFlagLockTheftInstanceCrash: "True", + DFFlagLogMemoryStatsOnCompressionError: "True", + DFFlagLuaTableMove: "True", + DFFlagLuauFixFenv: "True", + DFFlagMechanismInterpolationLikesLocalSpace: "True", + DFFlagMegaReplicatorOnlyTrackReplicatableProperties: "True", + DFFlagMegaReplicatorOptimizePendingNewInstanceItemTracking: "True", + DFFlagMessagingServiceFixErrorMessage: "True", + DFFlagMessagingServiceFixUnsubscribeTwiceOnClose: "True", + DFFlagMessagingServiceForTest: "True", + DFFlagMessagingServiceSentUtcTime2: "True", + DFFlagMessagingServiceSuggestedErrorMessage: "True", + DFFlagMessagingServiceTopicEmptyChecking: "True", + DFFlagMiscIndividualAssetRequestUseAssetdelivery2: "True", + DFFlagMoreWeldRestrictions: "False", + DFFlagMoveAssetFetchEndpointToAssetDelivery: "True", + DFFlagMoveAudioDeviceReporting: "True", + DFFlagMpsRateLimit: "True", + DFFlagMpsRateLimitReport: "True", + DFFlagMpsRateLimitReport_PlaceFilter: "false;370731277", + DFFlagMpsRateLimitWarn: "True", + DFFlagNPCUnequipTools: "True", + DFFlagNamesOccludedAsDefault: "True", + DFFlagNavigationServiceAnalytics: "True", + DFFlagNetworkParallelPhysicsOut: "True", + DFFlagNewRejoinMessage_PlaceFilter: "True;1034242130;2528277338", + DFFlagNewShowStreamedRegionDiag: "True", + DFFlagNewSortAndFilter: "True", + DFFlagNoFaceHeadMeshTagR6: "True", + DFFlagNoInfiniteLoopOnChatInfoLoadFailure: "True", + DFFlagNoMoreSinglePhysicsSenderJob: "True", + DFFlagNoStringDump: "True", + DFFlagNoYieldCaptured: "True", + DFFlagNonBlockingAnalyticsExit: "True", + DFFlagOnlyFireHealthChangedWhenHealthChanges: "True", + DFFlagOwnershipDistributionCheckIgnoredJoint: "True", + DFFlagPGSSolverSimIslandsEnabled2: "True", + DFFlagPGSWakeOtherAssemblyForJoints: "True", + DFFlagPGSWakeOtherIfOneAssemblyIsAwake: "False", + DFFlagPLTIGetLocaleFallback: "True", + DFFlagPackageMoveModificationToRCCStage3: "True", + DFFlagPackageMoveModificationToRCCStage4: "True", + DFFlagPackageMoveModificationToRCCStage5: "True", + DFFlagParallelCollisionDoNothingFaster: "True", + DFFlagParallelCollisions2: "True", + DFFlagParallelCollisionsUseBetterGImpactCaching: "True", + DFFlagParameterizeHandlerNamedParameterEnabled: "True", + DFFlagParameterizeHandlerPureUsernameFix: "True", + DFFlagParameterizeInThread: "True", + DFFlagPreloadAsyncCallbackFunction: "True", + DFFlagPreventLuaFunctionMigration: "True", + DFFlagProfileAvoidRecordingEmptyFrames: "False", + DFFlagRaiseCorrectException: "True", + DFFlagRbxFormatMultiByteSizeFix: "True", + DFFlagRccDoNotSetZeroPlaceIdFilter: "True", + DFFlagRccUseHttpRequestForPlaceFetch: "True", + DFFlagReduceSendDataCriticalSection: "True", + DFFlagReduceTrussSearchDistance2: "False", + DFFlagRejectRebelReceipt: "True", + DFFlagRemovePrepareInstancesLocks: "True", + DFFlagRemoveRedundantQueryParams: "True", + DFFlagReplicatorCollectItemCountOnSend: "True", + DFFlagReplicatorJDIOnlyUpdateCacheWhenParentIsUpToDate: "True", + DFFlagReplicatorLabelItemTypesProcessed: "True", + DFFlagReplicatorOptimizeDescendantOfWorkspace: "True", + DFFlagReportCharacterLoadTimeMetrics2: "True", + DFFlagReportCoalescingStats: "True", + DFFlagReportCollisionDetectionTime: "True", + DFFlagReportCounterToGameInstancesApi: "True", + DFFlagReportDataStoreErrorCases: "True", + DFFlagReportGALightingTechnology: "True", + DFFlagReportGPUMetrics: "True", + DFFlagReportInfluxLightingTechnology: "True", + DFFlagReportInterpolationPerformance: "True", + DFFlagReportInterpolationPerformanceClient: "True", + DFFlagReportJoinTimeImpactStats: "True", + DFFlagReportLightingTechnology: "True", + DFFlagReportMp3ParsingAnomalies: "True", + DFFlagReportOggParsingAnomalies: "True", + DFFlagReportParsingAnomalies: "True", + DFFlagReportPhysicsFPSStatsPlaceSpecific_PlaceFilter: + "True;606849621;171391948;189707", + DFFlagReportPhysicsSolverStatsPlaceSpecific_PlaceFilter: + "True;606849621;171391948;189707", + DFFlagReportPhysicsStatsToHUD: "True", + DFFlagReportReplicatorStatsToInflux: "True", + DFFlagReportSolverUsageStats: "True", + DFFlagReportStatsCurrentLessThanMin2: "True", + DFFlagReportStatsPauseDuration: "True", + DFFlagReportTriangleMeshPartMigrationData: "True", + DFFlagRomarkAdjustCharacterReportThrottle: "True", + DFFlagRoundToScreenScaleUseFloor: "True", + DFFlagSanitizeCofmVariablesNanInf: "True", + DFFlagScriptContextImproveValidateThreadAccess: "True", + DFFlagScriptContextTraceLocalTime: "True", + DFFlagSendClientNewJoinData: "True", + DFFlagSendPackageRequestFailureMessageOnlyOneTime: "True", + DFFlagSendTypeAsStringDuringCacheValidation: "True", + DFFlagServerConfigurerDoCDNProbe: "True", + DFFlagServerCopiesPlayerGui3: "True", + DFFlagServerProfileSeparateThread: "True", + DFFlagServerReportPhysicsThrottleWithDatacenterId: "True", + DFFlagSetNumberEmotesLoaded: "True", + DFFlagSignalRCrashFix: "True", + DFFlagSimDecisionBaseOnExtents2: "True", + DFFlagSimplifyRakNetConnectionHandshake: "False", + DFFlagSkipContainerCheckOnJoin: "True", + DFFlagSkipLowRes: "True", + DFFlagSkipLowRes_PlaceFilter: "True;3027055174", + DFFlagSkipSDILogName: "True", + DFFlagSocialServiceDevPromptGameInvites: "True", + DFFlagSpecialCaseSupportRbxCdnInAppDataModel2: "True", + DFFlagSpecificGravityDummyFunctionGA: "True", + DFFlagSpecificGravityDummyReturnsZero: "False", + DFFlagStreamingExtentsForceUpdateOnlyWhenAlive: "True", + DFFlagStreamingGameplayPausedAPI: "True", + DFFlagStreamingGameplayPausedAPIStudioProperties: "True", + DFFlagStreamingSetPlayerPausedFirst: "True", + DFFlagStreamingUpdateWorldExtentsWhenPlayerMoves: "True", + DFFlagStrictMp3Parsing: "True", + DFFlagStrictOggParsing: "True", + DFFlagStrictOggParsingFix: "True", + DFFlagSupportYouTubeInAppDataModelIfRbxCdnAllowed: "True", + DFFlagTeamCreateSaveAnalyticsServiceApiKey: "True", + DFFlagTextScraperEnableCaptureDateTime: "True", + DFFlagTextScraperParameterizeV2: "True", + DFFlagTextScraperReportOSPlatform: "True", + DFFlagTextScraperReportSessionId: "True", + DFFlagTextScraperStopReportPureParameterFix: "True", + DFFlagThrottleGetUserThumbnailAsync: "True", + DFFlagThrowErrorWhenRequestedURLFailed: "True", + DFFlagThumbnailSupportFocusOnPart: "True", + DFFlagUpdateCofmOnMasslessRootChange: "True", + DFFlagUpdateHipHeightClamping: "True", + DFFlagUseAssemblyExternalEdgeListCachedForWake: "True", + DFFlagUseBaseUrlNotHardcodedUrl: "True", + DFFlagUseDistanceThinning: "True", + DFFlagUseLowResTerrain: "True", + DFFlagUseLowResTerrain_PlaceFilter: "True;3027055174", + DFFlagUseMomentumThinning: "True", + DFFlagUseMomentumThinning_PlaceFilter: + "False;1694497805;1225846869", + DFFlagUseNewPemKeys: "True", + DFFlagUseNewQueryParamUtility: "True", + DFFlagUseNewTerrainProtocol: "True", + DFFlagUseNewTerrainProtocol_PlaceFilter: "True;3027055174", + DFFlagUseNoneLuaBuildRigFromAttachments: "True", + DFFlagUsePemKeyFormat: "True", + DFFlagUsePositionPropWhenKnown: "True", + DFFlagUsePositionPropWhenKnown_PlaceFilter: "True;3027055174", + DFFlagUsePugiXmlForSettings: "False", + DFFlagUseRoundRobin: "False", + DFFlagUseSort: "False", + DFFlagUserAccessUserSettings: "True", + DFFlagUserAdjustHumanoidRootPartToHipPosition: "True", + DFFlagUserAllowDisableCustomAnims2: "True", + DFFlagUserChatPrivacySetting: "True", + DFFlagUserFixCharacterSoundIssues: "True", + DFFlagUserHttpAPIEnabled: "True", + DFFlagUserPlayCharacterLoopSoundWhenFE: "True", + DFFlagUserPlayCharacterSoundWhenFE: "True", + DFFlagUserPreloadAnimations: "True", + DFFlagUserServerFollowers: "True", + DFFlagUserUseLuaVehicleController: "True", + DFFlagUserUseSoundDispatcher: "True", + DFFlagUsingHeadsIsBadForOwningThings: "True", + DFFlagUsingHeadsIsBadForPhysicsReplication: "True", + DFFlagVerifyWorldInTryFloor: "True", + DFFlagVersionedIdSync: "True", + DFFlagViewportFrameLight: "True", + DFFlagWebParserAddIsNumberCatchall: "True", + DFFlagWhitelistStreamingPauseState: "True", + DFFlagWhitelistUserInputEvents: "True", + DFFlagXboxDisableTextChat: "True", + DFIntAnalyticsForXBoxCrash_JoinInfluxHundredthsPercentage: "1", + DFIntAnalyticsMaxSendWaitTimeMs: "1500", + DFIntBatchApiAssetArchivingErrorDateSec: "1565895600", + DFIntBulletContactBreakOrthogonalThresholdPercent: "200", + DFIntBulletContactBreakThresholdPercent: "200", + DFIntCSGLevelOfDetailSwitchingDistanceL12_PlaceFilter: + "500;2434889832;2568147212", + DFIntCSGLevelOfDetailSwitchingDistance_PlaceFilter: + "250;2434889832;2568147212", + DFIntCSGv2LodMinTriangleCount: "100", + DFIntCSGv2LodsToGenerate: "3", + DFIntCSGv2OperationInfluxHundredthsPercentage: "100", + DFIntCanHideGuiGroupId: "4358041", + DFIntChatCap: "100", + DFIntChatTime: "10", + DFIntClientJoinProcessPositiveSamplesThousandths: "10", + DFIntClientNetworkInfluxHundredthsPercentage: "500", + DFIntContentProviderAssetdeliveryRolloutPercentage: "100", + DFIntCrashUploadHttpResponseDefaultTimeoutMillis: "80000", + DFIntCrashUploadToBacktracePercentage: "10", + DFIntDataStoreInfluxReportNonParsableDataPerMyriad: "10000", + DFIntDataStoreMaxValueSize: "262144", + DFIntDefaultBalanceD: "100", + DFIntDefaultBalanceP: "7000", + DFIntDynamicReloaderFailureInfluxHundrethsPercentage: "10000", + DFIntDynamicReloaderFileFailureInfluxHundrethsPercentage: "10000", + DFIntExpireMarketPlaceServiceCacheSeconds: "60", + DFIntGamePassOwnershipCacheSeconds: "30", + DFIntGetUserThumbnailAsyncThrottleTime: "3", + DFIntHttpCacheStatsReportingIntervalSeconds: "180", + DFIntHttpConnMaxAge: "600000", + DFIntHttpConnectDefaultTimeoutMillis: "60000", + DFIntHttpCurlConnectionCacheSize: "-1", + DFIntInfluxReportLocalFilterStringPermyriad: "500", + DFIntInfluxReportRCCStatsHundredthsPercentage: "5000", + DFIntJSONOverflowDepth: "200", + DFIntJoinInfluxHundredthsPercentage: "100", + DFIntLDLPGSStatsRatePercentPlaceSpecific: "25", + DFIntLocalizationServiceContentLoadErrorHundredthsPercentage: + "1000", + DFIntLogGroupTeleportInfluxPerTenThousand: "1000", + DFIntMaxClusterKBPerSecond: "400", + DFIntMaxDataOutJobScaling_PlaceFilter: "20;3260091322", + DFIntMaxDataPayloadSize: "96000000", + DFIntMaxFramesToSend: "2", + DFIntMaxReceiptSize: "100", + DFIntMpsRateLimitCapacity: "10", + DFIntMpsRateLimitDuration: "10", + DFIntNewSettingsEndpointExceptionInfluxPermyriad: "10000", + DFIntNumberFramesSubmergedBeforeVSquaredViscocity_PlaceFilter: + "0; 1221071288; 1107780422; 1223560318", + DFIntOnDisconnectHTTPTimeout: "500", + DFIntPercentApiRequestsRecordGoogleAnalytics: "5", + DFIntPlayerConfigurerCDNProbeDelayMs: "10000", + DFIntPrimStatsGANumDelimited: "3000", + DFIntRakNetConnectionStartWindow_HundredthsPercentage: "1000", + DFIntRakNetResendMaxThresholdTimeInUs: "2000000", + DFIntRakNetResendScaleBackFactorHundredthsPercent: "6500", + DFIntReplicatorAnimationTrackLimitPerAnimator: "50", + DFIntReplicatorAnimationTrackLimitPerAnimator_PlaceFilter: + "120;2116452049", + DFIntReplicatorCountLimitInfluxHundrethsPercentage: "10000", + DFIntReplicatorMaxPacketBytesSentToInfluxOnError: "256", + DFIntReportAnimationTrackSpamInfluxHundrethsPercent: "500", + DFIntReportDeviceInfoRate: "100", + DFIntReportParsingAnomalyRate: "1", + DFIntReportSoundAssetsRate: "1", + DFIntS2NumPhysicsPacketsPerStep: "2", + DFIntS2NumPhysicsPacketsPerStep_PlaceFilter: "8;3260091322", + DFIntSendJoinTimesToDiag_HundredthsPercentage_PlaceFilter: + "4000;370731277", + DFIntSendRakNetStatsInterval: "300", + DFIntServerBandwidthPlayerSampleRate: "20", + DFIntSmoothTerrainPhysicsRayAabbSlop: "1", + DFIntStepsToJoin: "2", + DFIntStreamPauseVelBufFactorHundredths: "100", + DFIntTextScraperReportUserIdSize: "5", + DFIntThrottledVelocityThresholdTenths: "15", + DFIntTimePermyriad: "10000", + DFIntWaterViscosityDragFudgeFactor_PlaceFilter: + "500; 1221071288; 1107780422; 1223560318", + DFIntWebParserInfluxWriteNanInfPerMyriad: "1000", + DFIntWeldPermyriad: "100", + DFIntWorldStepDtAveExpFactorHundredth: "1", + DFLogErrorDescription: "6", + DFLogMessagingService: "6", + DFLogSignalRConnection: "6", + DFLogSoundCheckResult: "4", + DFStringAdditionalBlacklistHeaders: "SOAPAction", + DFStringAnalyticsNS1BeaconConfig: + "https://web.archive.org/web/20200624170102/https://c0ll.rbxcdn.com/test-50kb.png|g2kd2s|https://c0hw.rbxcdn.com/test-50kb.png|g2iyic|https://c0cfly.rbxcdn.com/test-50kb.png|g2hjxw|https://c0ak.rbxcdn.com/test-50kb.png|g2g5dg", + DFStringDataStoreThrottleMsg: + "DataStore request was added to queue. If request queue fills, further requests will be dropped. Try sending fewer requests.", + DFStringR15CollisionTypeField: "universeAvatarCollisionType", + DFStringReportSoundAssetsAssetList: + "rbxassetid://1837038213,rbxassetid://1846492029,rbxassetid://1841601627,rbxassetid://1845571507,rbxassetid://1836362602,rbxassetid://1846368341,rbxassetid://1847611722,rbxassetid://1845891180,rbxassetid://1845891141,rbxassetid://1842957560,rbxassetid://1836553363", + DFStringRobloxAnalyticsURL: + "https://web.archive.org/web/20200624170102/http://ecsv2.roblox.com/", + DFStringSendPingForCnConnectingToDcList: "111,174,191,133", + FFlagAddEndedSignalToSoundJobStudio: "True", + FFlagAdjustHipTranslationBasedOnHipHeight: "True", + FFlagAllowCatalogItemCreatorAssetConfig: "True", + FFlagAllowMeToParseMyOwnJoinBlob: "True", + FFlagAllowNegativeDisplayOrder: "True", + FFlagAlwaysLuau: "True", + FFlagAnimationSampleCorrection: "True", + FFlagAnthroArtistIntentFBXImporterIntermediateState: "False", + FFlagAppShellReporterMonitorFrameTimeIOS: "True", + FFlagAvatarEditorAnthroSlidersUIOnly: "True", + FFlagAvatarEditorCostumeSignalR: "True", + FFlagAvatarEditorFixLegCameraPosition: "True", + FFlagAvatarEditorFixSliderSensitivity: "True", + FFlagAvatarEditorInitializeModelEarly: "True", + FFlagAvatarEditorKeepYourColor: "True", + FFlagAvatarEditorRefactorPageType: "True", + FFlagAvatarEditorRemoveDefaultClothingMessage: "True", + FFlagAvatarEditorSelectivelyUseDefaultAsset: "True", + FFlagAvatarPartScaleTypeFix: "True", + FFlagAvoidCrashOnThreadResourceError: "False", + FFlagAvoidFindFirstChildCallsInGuiBase2d: "True", + FFlagBackpackScriptUseFormatByKey: "False", + FFlagBadgeReadDisabledFromInfo: "True", + FFlagBatchAssetApi: "False", + FFlagBestProximatePartFix: "True", + FFlagBillboardGuiDistanceStepping2: "False", + FFlagBreakJointsOnDeath: "True", + FFlagCJVNotFallbackToEnglishForCoreGuiEnabled: "True", + FFlagCMSEndPointsAPI: "True", + FFlagCSGv2ControlSignificands: "False", + FFlagCSGv2EnableEmptyMeshError: "True", + FFlagCSGv2EnablePerPrimitiveBoxMaps: "True", + FFlagCSGv2ForceEnabled: "True", + FFlagCSGv2InGameEnabled: "True", + FFlagChangeNarrowToSlender: "True", + FFlagChatServiceAnalyticsOnFilterStringCalls: "False", + FFlagCheckIntentWhenInitDefaultScripts: "True", + FFlagClickDetectorCursorIconEnabled: "True", + FFlagCloudEditServerGeneratesPlayerCameraPosition: "True", + FFlagConnectionScriptEnabled: "True", + FFlagConstraintAdornCleanup: "True", + FFlagContentProviderTempDirWithPid2: "True", + FFlagCoreScriptEnableInspectAndBuy: "True", + FFlagCoreScriptEnableInspectAndBuy_PlaceFilter: + "True;3155066112;3157761435;3204147952;189707", + FFlagCoreScriptEnableRobloxTranslatorFallback: "True", + FFlagCoreScriptEnableRobloxTranslatorFallback_PlaceFilter: + "True;3155066112;3157761435;3204147952;189707", + FFlagCoreScriptNoPosthumousHurtOverlay: "True", + FFlagCoreScriptTranslateGameText2: "True", + FFlagCoreScriptsUseLocalizationModule: "True", + FFlagCoreUseRoact1_x: "True", + FFlagCrashReporterNew: "False", + FFlagCurlOption53: "True", + FFlagCurlProbe4: "True", + FFlagDatamodelServicesConnectionFix2: "True", + FFlagDebugClientNetworkPerPlaceMetrics: "False", + FFlagDebugClientNetworkPerPlaceMetrics_PlaceFilter: + "True;1818;3498890;189707", + FFlagDelayPurchasePromptActivation: "True", + FFlagDisableDrawingStudsInEdit: "True", + FFlagDisableReJoinForSurfaceTool: "True", + FFlagDontInsertGroundJoints: "True", + FFlagDontStoreCharacterModelBeingLoadedInPlayer: "False", + FFlagEasingExpansion: "True", + FFlagEnableAbsoluteCellSizeAndCellCount: "True", + FFlagEnableAssetConfigVersionCheckForModels: "True", + FFlagEnableAssetPreviewDynamicVote: "True", + FFlagEnableAvatarEditoriOSTablet: "True", + FFlagEnableCatelogForAPIService: "True", + FFlagEnableDataForAssetConfig: "True", + FFlagEnableDataModelFetchAssetAsync: "True", + FFlagEnableDeveloperGetManageGroupUrl: "True", + FFlagEnableFSEventWatcher: "True", + FFlagEnableInsertAssetCategoryAnalytics: "True", + FFlagEnableLuaBottomBarWithTextOnPhone: "False", + FFlagEnableLuaBottomBarWithTextOnTablet: "False", + FFlagEnableMarketplaceFavorite: "True", + FFlagEnableMouseUpEventFireForCurrentDragGuiObj: "True", + FFlagEnableNewChatApi: "True", + FFlagEnablePreviewTabSelection: "True", + FFlagEnableReplaceBodyPartR15: "True", + FFlagEnableStudioServiceGetUserId: "True", + FFlagEnableSurfaceGuiPixelsPerStud: "True", + FFlagEnableTextBoxPasswordDev: "True", + FFlagEnableTextSelection2: "True", + FFlagEnableToolboxGetAssetsFailedCaseFix: "True", + FFlagEnableToolboxUploadReport: "True", + FFlagEnableToolboxVoteFix: "True", + FFlagEndKeyboardEventsOnFocusChange3: "True", + FFlagExitProcessOnExit: "True", + FFlagFasterInstanceCheck: "True", + FFlagFireAncestryChangedJointSignalAfterWorldInsert4: "True", + FFlagFireChangedForCursorPosition: "True", + FFlagFixAssetUploadSuccssMessage: "True", + FFlagFixBadDirtyStateSetForUIConstraint: "True", + FFlagFixButtonR2MouseClickOnGui: "True", + FFlagFixCrashChangingHierarchyInRelayout: "False", + FFlagFixG3DFpChecks: "True", + FFlagFixIAdornableCollectorCrash3: "False", + FFlagFixInspectMenuAnalytics: "True", + FFlagFixLoadTimeReporting: "True", + FFlagFixLoadableImageDoesNotLoadCachedImage: "True", + FFlagFixLuaAppAvatarDraggable: "True", + FFlagFixModalGuisInFoldersBeingIgnored: "True", + FFlagFixModelPreviewSelection: "True", + FFlagFixMousePositionInWindowCheck: "True", + FFlagFixMultiWindowMouseMovements: "True", + FFlagFixPluginQWidgetInitialization2: "True", + FFlagFixPromiseUtilitiesBatch: "True", + FFlagFixScalingValueRename: "True", + FFlagFixScalingValueRename_PlaceFilter: "False;370731277", + FFlagFixToggleOffDarkName: "True", + FFlagFixXSwipe: "True", + FFlagFlyweightServiceDataRecievedCallbackCrashFixEnabled: "True", + FFlagFreeCameraForAdmins: "True", + FFlagFreecamInTestServers: "True", + FFlagGameMediaEntryIDOptional: "True", + FFlagGamePerfMonitorGameCloseFix: "True", + FFlagGamePerfMonitorStatsWindowFix: "True", + FFlagGameinternationalizationApiWhitelist: "True", + FFlagGamepadInputRaceConditionFix: "True", + FFlagGetFVariableThrowsAgain: "True", + FFlagGraphicsGLFixCopyFramebufferMip: "True", + FFlagGraphicsGLHD3000DisableGL3: "False", + FFlagGraphicsGLHD3000DisableUBO: "True", + FFlagGraphicsGLSeparateCB: "True", + FFlagGreyOutPublishForAssetConfigIfServiceIsSelected: "False", + FFlagGuestFriendCheckFailImmediate: "True", + FFlagHttpClientDisconnectResultSignals: "True", + FFlagHttpUseContentCacheFlag3: "True", + FFlagHttpUseMinGzip: "False", + FFlagHumanoidPreventDuplicateAnimatorChildren: "True", + FFlagIESuppressErrors: "True", + FFlagIOSNowSupportsAussieMode: "True", + FFlagIgnoreCollisionPairs: "True", + FFlagInGameUIForceDefaultLocaleOnOSX: "True", + FFlagInGameUIForceDefaultLocaleOnWin10: "True", + FFlagInGameUIForceDefaultLocaleOnWin32: "True", + FFlagInitializeModCodesForWindows: "True", + FFlagInspectMenuEnableEmotes: "True", + FFlagInspectMenuProgressiveLoading: "True", + FFlagInspectMenuUpdateDisabledColor: "True", + FFlagIsPasswordTextRendering: "True", + FFlagJoinTime_AvatarFastClusterSignal: "True", + FFlagJoinTime_AvatarTextureCompositorSignal: "True", + FFlagJoinTime_HttpQueuePrio: "True", + FFlagJoinTime_LocalUserAnimationPriority: "True", + FFlagJoinTime_LocalUserClusterPriority: "True", + FFlagJoinTime_LocalUserMeshPriority: "True", + FFlagJoinTime_LocalUserTexturePriority: "True", + FFlagJoinTime_PassTexturePriority: "True", + FFlagJointsUseNoCollideJointCount3: "True", + FFlagKeyDownAcrossAllWindows: "False", + FFlagKeyframeSequenceEnableFrozen: "True", + FFlagKillDownAwayState: "True", + FFlagKillSurfaceJointsPart1: "True", + FFlagLineHeightEnabled: "True", + FFlagLoadCoreScriptsEvenInTeamCreate: "True", + FFlagLoadTheLoadingScreenFaster: "False", + FFlagLoadTimesFromAppShellReporter: "True", + FFlagLocalesInUserInfoOniOS: "True", + FFlagLocalizationTableTruncateFix: "True", + FFlagLuaAppEnableHomePageWithAvatarABTest3: "False", + FFlagLuaAppEnablePageBlur: "True", + FFlagLuaAppEnableStopWatchReporter: "False", + FFlagLuaAppFixAndroidNavigation: "True", + FFlagLuaAppFixInfiniteRerender: "True", + FFlagLuaAppGameDetailsHideEmptySections: "True", + FFlagLuaAppGameSetTargetIdAnalytics: "True", + FFlagLuaAppGamesPagePreloadingDisabled: "False", + FFlagLuaAppHandlePurchaseFailWhenOwned: "True", + FFlagLuaAppHomeIconPolicy: "True", + FFlagLuaAppHttpsWebViews: "True", + FFlagLuaAppMakeAvatarThumbnailTypesEnum: "True", + FFlagLuaAppNewEconomyApi2: "True", + FFlagLuaAppPolicyRoactConnector: "True", + FFlagLuaAppPurchaseErrorToastRefactor2: "True", + FFlagLuaAppRefreshScrollingFrameRefactor: "False", + FFlagLuaAppSeeAllFriendsWebPage: "True", + FFlagLuaAppSocialLinksSplitGroup: "True", + FFlagLuaAppTabNameGamesToDiscoverOnIOS: "True", + FFlagLuaAppUseGameSetTargetId: "True", + FFlagLuaAppUseUIBloxToasts: "False", + FFlagLuaAppUseWithLocalization: "False", + FFlagLuaGameDetailsPolishV367: "True", + FFlagLuaGameDetailsRenderTransparentBackground2: "True", + FFlagLuaGameDetailsUseGothamInDarkTheme: "True", + FFlagLuaHomeMoveMyFeedToMore: "True", + FFlagLuaHomePeopleListV1V361: "True", + FFlagLuaHttpUrlBuilder: "True", + FFlagLuaInviteGameFixMessageAlignment: "True", + FFlagLuaInviteGameTextLocalization: "True", + FFlagLuaPageLoadEvent: "True", + FFlagLuauBuiltinCalls: "True", + FFlagLuauTypesInCoreScripts: "False", + FFlagLuauTypesInCoreScripts2: "True", + FFlagMakeAEGetAssetInfoPromise: "True", + FFlagMalformedJoinBlobIsUnknownError: "True", + FFlagMeasureJoinToOutsidersUse: "True", + FFlagMegaReplicatorIsCloudEditInitialize: "True", + FFlagMemoryFromAppShellReporterAndroid: "False", + FFlagMigrateTriangleMeshData3: "True", + FFlagMobileChatOneIcon: "True", + FFlagModelInstanceCompletenessRefactor: "True", + FFlagMouseServiceWantsToBeIndependent: "True", + FFlagNavigationDebugDrawIterateSpiral: "True", + FFlagNavigationFixPathUpdateEventCall: "True", + FFlagNavigationFixPathUpdateImplCall: "True", + FFlagNetworkDeprecateScopeNames: "True", + FFlagNetworkDeserializePacketsInAJob: "True", + FFlagNetworkStreamingPhysicsObserverInit2: "False", + FFlagNoCollisionConstraintHumanoidFix: "True", + FFlagNoFaceHeadMeshTag: "True", + FFlagNoMoreCursorErrors: "True", + FFlagNoSpaceAfterReturnInTextBox: "True", + FFlagNotificationScript2UseFormatByKey: "True", + FFlagOnlyCheckHeadAccessoryInHeadShot: "True", + FFlagOptimizedPrimitivesHere: "True", + FFlagOptmizedVec3Int32HasherEnabled: "True", + FFlagPGSAdaptiveCollisionMarginFixEnabled: "False", + FFlagPGSConstraintAlign2AxesCompliantCacheFix: "True", + FFlagPartCastShadow: "True", + FFlagPassDataModelDPIScale: "True", + FFlagPluginActionSetChecked: "True", + FFlagPluginActionSetDefaultShortcut: "True", + FFlagPluginActionSetEnabled: "True", + FFlagPluginManagementInStudio2: "True", + FFlagPointsServiceNewEndpoints: "True", + FFlagPurchasePromptPremiumEnabled2: "True", + FFlagQuantumGuiClipScreenGuiToViewport2: "False", + FFlagQuantumScrollingFrame4: "False", + FFlagQueueUIEventsDuringLayout: "False", + FFlagRCCSupportTeamTest: "True", + FFlagRealtimeFriendsContextualMenuRefactor: "True", + FFlagRecalculateAbsolutePlacementFix: "True", + FFlagRecordHopperServiceStats: "True", + FFlagRecordInGameDeaths: "False", + FFlagRemoveKeyboardOnShutdownIOS: "True", + FFlagRemoveOldPhysicsPacketCache: "True", + FFlagRemoveUnlocalizedButtonText: "True", + FFlagRemoveVehicleSeatCameraCFrameSet: "True", + FFlagRenderAdornFixMdrColor: "True", + FFlagRenderBiasGlassTint: "True", + FFlagRenderFixDDSCubeLoad: "True", + FFlagRenderFixEmojiPadding: "True", + FFlagRenderMessagesAsGui: "True", + FFlagReportExplicitAutoJointsJoinAll: "True", + FFlagReportJoinAllCount: "True", + FFlagReportRuntimeJoinCount: "True", + FFlagReportTimeToPlay: "True", + FFlagRetranslateOnTextScraperStart: "True", + FFlagRoactPurchasePromptAllowBundles: "True", + FFlagRoactPurchasePromptAllowBundles_PlaceFilter: + "True;3155066112;3157761435;3204147952;189707", + FFlagRotateCameraForRightPart: "True", + FFlagSHAllowArbitraryLevelCount: "True", + FFlagSHComputeExtentsTimeReportingEnabled: "True", + FFlagSHStatReportingEnabled: "True", + FFlagScrollingFrameDoNotProcessMouseCancel: "True", + FFlagSendJoinTimesToDiag_PlaceFilter: "true;370731277", + FFlagSeparateSendFromProcessMouseMove: "True", + FFlagSignalStopForZeroWeight: "True", + FFlagStartClearUnusedRefsJob: "True", + FFlagStartWarningStoppers: "True", + FFlagStopTheBrokenCursors: "True", + FFlagStoreInstalledPluginsInCloud: "True", + FFlagStreamingUISkipFirstPause: "True", + FFlagStudioAnimationEditorCheckForSavedChanges: "False", + FFlagStudioAnimationEditorClearEventNames: "True", + FFlagStudioAnimationEditorContinueScrollingWithSelectionArea: + "True", + FFlagStudioAnimationEditorEnableRigSwitching2: "True", + FFlagStudioAnimationEditorFixAnimationsWithLongNames: "True", + FFlagStudioAnimationEditorFixEventsTooltips: "True", + FFlagStudioAnimationEditorFixRenameKeyOption2: "True", + FFlagStudioAnimationEditorFixRigSelection: "True", + FFlagStudioAnimationEditorFixScalingBarPosition: "True", + FFlagStudioAnimationEditorFixWorldSpaceJointPanel: "True", + FFlagStudioAnimationEditorIKMode: "True", + FFlagStudioAnimationEditorKeepClipboardAfterMove: "True", + FFlagStudioAnimationEditorScaleKeys: "True", + FFlagStudioAnimationEditorSelectEventsOnEdge: "True", + FFlagStudioAnimationEditorShiftSelectJointsOn: "True", + FFlagStudioAnimationEditorUseQWidgetsForPopups: "True", + FFlagStudioAnimationEdtiorOptimizationsEnabled2: "True", + FFlagStudioEnableSurfaceJoinChangeBeta: "False", + FFlagStudioFixToolboxDialog: "True", + FFlagStudioFixUnhandledRunTimeError: "True", + FFlagStudioGameSettingsBindToClose: "True", + FFlagStudioRemoveAxisWidget: "True", + FFlagStudioUILibraryRoundTextBoxNoTooltip: "True", + FFlagSurfaceGuiDefaultPixelsPerStud: "True", + FFlagTSMk2ThrottleStreamJob: "True", + FFlagTaskSchedulerSTDThreadwrapper: "True", + FFlagTeamCreateSaveAnalyticsServiceApiKeyReplicator: "True", + FFlagTenaciousGamePerfMonitor: "True", + FFlagThrowDetailedMessageForBadEntries: "True", + FFlagThwartPurchasePromptScams: "True", + FFlagTighterCylinderBoundingSpheres: "True", + FFlagTolerantLexerForStudio: "True", + FFlagToolboxJointMigrationApi: "True", + FFlagToolboxWithCMSV2: "True", + FFlagTouchEventSameSHCellBugFixEnabled: "True", + FFlagTrackCurlTimeProfile: "True", + FFlagTrackEventWithArgsEnabled: "True", + FFlagTrackResetCharacterButtonUsage: "True", + FFlagTweenServiceGetValueEnabled: "True", + FFlagUDim2FromScaleAndOffsetConstructors: "True", + FFlagUIInlineLayout2_PlaceFilter: + "True;3299508970;3299511698;3299515879", + FFlagUIViewportFrameSetCameraNearZ: "True", + FFlagUniverseIdChangedEvent: "True", + FFlagUpdateExtentsForManualStep: "True", + FFlagUpdateInspectAndBuyOffsaleText: "True", + FFlagUpdateScaleBeforeBuildRig: "True", + FFlagUrlSupportNewGamesAPI: "True", + FFlagUseAccuratePlaySoloForced: "True", + FFlagUseAdvancedCharacterScales3: "True", + FFlagUseBaseUrlInPlugins: "True", + FFlagUseHipHeightInKeyframeSequences2: "False", + FFlagUseKeyframeMarkersForEvents2: "True", + FFlagUseLDLPGSSolver4: "True", + FFlagUseLuaGameDetailsOnIPad: "True", + FFlagUseLuaGameDetailsOnIPhone: "True", + FFlagUseMTSolver: "True", + FFlagUseMatrix3ForInertiaTensor2: "True", + FFlagUseNewSpatialHash5: "True", + FFlagUseNewTriangleMeshPart: "True", + FFlagUseNormalWeld: "True", + FFlagUseOptimizedGetPartsObscuringTarget: "True", + FFlagUseOtterMasterForLuaApp: "True", + FFlagUseVectorForDirtyMechanisms: "True", + FFlagUserAllCamerasInLua: "True", + FFlagUserAnimationSpeedDampening: "True", + FFlagUserClickToMoveFollowPathRefactor: "True", + FFlagUserFixChatMessageLogPerformance: "False", + FFlagUserFixChatMessageLogPerformance2: "False", + FFlagUserInGameChatUseNewFilterAPIV2: "True", + FFlagUserIsNowADynamicThumbstick: "True", + FFlagUserJSONConvertInfAndNanToNull: "True", + FFlagUserJumpButtonPositionChange: "True", + FFlagUserNavigationClickToMoveNoDirectPath2: "True", + FFlagUserNavigationClickToMoveSkipPassedWaypoints: "True", + FFlagUserNavigationClickToMoveUsePathBlocked: "True", + FFlagUserNavigationFixClickToMoveJump: "True", + FFlagUserNewCameraRaycastingAPIsEnabled: "True", + FFlagUserNoMoreKeyboardPan: "True", + FFlagUserNoUpdateOnLoop: "True", + FFlagUserRbxUtilityCreateSetParentLast: "True", + FFlagUserShouldClipInGameChat: "True", + FFlagUserShouldLocalizeGameChatBubble: "True", + FFlagUserShouldLocalizeServerMessages: "True", + FFlagUserTheMovementModeInquisition: "True", + FFlagUserThirdGamepadZoomStep: "True", + FFlagUserToolR15Fix: "True", + FFlagUserTouchSensitivityAdjust: "True", + FFlagUserUseCachedFriendChecksForChat: "False", + FFlagUsingSendMeasureBatch2: "True", + FFlagVerifyBuiltInPlugins: "True", + FFlagWebLocMarkLocTableListDirtyOnServer: "True", + FFlagWhateverFloatsYourContact: "True", + FFlagWhitelistThumbnailsAPI: "True", + FFlagXboxAppBridgeRewrite2: "False", + FFlagXboxDetachShowAccountPicker2: "True", + FFlagXboxFixAwardedBadges: "True", + FFlagXboxGetLocaleFromAccount: "True", + FFlagXboxKeyboardInitInCallbacks: "True", + FFlagXboxStartGameRefactor: "True", + FFlagXboxValidateConnectPeer: "True", + FFlagXboxVoiceChatFixes: "True", + FFlagXboxVolumeFadesInCallbacks: "True", + FFlagYouDontKnowMe: "True", + FIntAntiSpamSpamLimit: "1000", + FIntAppShellFPSReportPeriod: "120", + FIntAppShellMemoryReportPeriodicity: "120", + FIntAvatarEditorNewCatalogButton2: "100", + FIntCameraFarZPlane: "100000", + FIntCameraMaxZoomDistance: "400", + FIntCurlProbePermyriad: "10000", + FIntDelayBeforeFirstPostStatsSeconds: "180", + FIntEnableFriendFooterOnHomePageV369: "100", + FIntJointTime_TextureCooldown: "0", + FIntLuaAppNonFinalThumbnailMaxRetries: "1", + FIntLuaAppPercentRollOutNewThumbnailsApiV3: "100", + FIntLuaAppRenderTransparentPageMaxCount: "1", + FIntLuaAppUseNewAvatarThumbnailsApi4: "0", + FIntMaxCameraMaxZoomDistance: "100000", + FIntMaxLevelForAnchored: "3", + FIntPGSAngularDampingPermilPersecond: "950", + FIntPGSPStageStiffnessWorseFitnessThreshold: "2", + FIntPGSVStageStiffnessAggressiveValue: "99995", + FIntPGSVStageStiffnessConservativeValue: "99000", + FIntPGSVStageStiffnessWorseFitnessThreshold: "2", + FIntPartMinSizeMul1000: "50", + FIntPercentLuaGameDetailsPageOnAndroidPhone: "100", + FIntPercentLuaGameDetailsPageOnAndroidTablet: "100", + FIntPercentReportingByCountryCode: "100", + FIntPercentReportingGamesListRTT: "5", + FIntPercentReportingGamesSortsRTT: "50", + FIntPercentReportingLeaveGameAnalytics: "10", + FIntTaskSchedulerAutoThreadLimit: "8", + FIntTeleportMethodAnalyticsHundredthPct: "100", + FLogFastLogValueChanged: "0", + FLogNetwork: "7", + FStringABTestNameIPhoneLuaGameDetails: + "iPhone.AllUsers.LuaGameDetails2", + FStringStudioUrlSurfaceJoinChange: + "https://web.archive.org/web/20200624170102/https://devforum.roblox.com/t/changes-to-part-surfaces-beta-feature/334420", + SFFlagFixBallRaycasts: "True", + SFFlagFixRaysInWedges: "True", + SFFlagNetworkUsePeerId: "True", + SFFlagPgsForAll: "True", + SFFlagUseNativePathWaypoint: "True", + EnableBackupCookie: "True", + FFlagFixGamepadNavigationWithACM: "True", + DFFlagSpawningDontIgnoreCanCollide: "True", + FFlagFixBackpackDraggingReset: "True", + FFlagFixBindActionTouchButtonError: "True", + FFlagFixGetStringForKeyCodeDeadKeyState: "True", + DFFlagEmoteThumbnailsRotationEnabled: "True", + DFFlagDataStoreInitialThrottlingBudgetFix: "True", + DFFlagStreamQuotaRoundUp: "True", + DFFlagNaivePacking: "True", + DFIntPercentageThresholdUsingFriendsV2: "0", + DFFlagNetworkUseSharedStreamingObserver2: "False", + FFlagStudioLogPluginSettingsFileAccess: "True", + DFFlagTrackRunUpdateCycleTime: "False", + DFIntTrackRunUpdateCycleReportInfluxPermyriad: "1000", + FFlagXboxAppBridgeRewrite3: "False", + DFFlagFixStudioDegenerateMouseRaycast: "True", + FFlagStudioDisableAutoClosingInComments2: "True", + FFlagVersionControlServiceForceDraftsUsage_PlaceFilter: + "True;4203193037;2772125205;3069606769;4094440665;2413179002;3344058302;3566618597;4041475807;2061558182;4074515213;2309740430;2670461983;4137940225;3096515841;4133172402;4163865257", + FFlagStudioCrashOnInvalidColor3Cast: "True", + FFlagStudioFixAnimEditorDescendants: "True", + FFlagStudioHoldDataModelLockAtBreakpointHit: "True", + FFlagBadgeApiV1UserHasBadge: "True", + FIntBadgeApiV1UserHasBadgePercentage: "100", + FFlagLuaAppRefreshScrollingFrameRefactor2: "False", + FFlagEnableGameSignalRWithOSX1: "True", + DFFlagDoNotDecrementPendingNewInstancesWhenProcessingDelete: "True", + FFlagStudioDoNotSaveWhenUserSaysNo: "True", + FFlagRoactGameSharePageV2: "False", + FFlagStreamingParallel2: "False", + DFIntDesiredStreamJobTimeMS: "24", + FFlagLuauTranspilerCompliance: "True", + FFlagCanWeAddContinue2: "True", + FIntLuaChatUseNewFriendsEndpoints: "25", + DFFlagSDISkipJDINetworkStream: "True", + FFlagFixAnimEditorManipulators: "True", + FFlagFixRigUtils: "True", + FFlagNewCharacterSoundScript: "True", + DFFlagFixManualJointAdornCrash2: "True", + DFFlagUpdateCofmUseHeapStack2: "True", + FFlagFixLightgridAsyncInvalidations: "True", + FFlagUseCorrectLocaleForPluginGuis: "True", + FFlagCLI29967: "True", + FFlagLocalizePlaceholderText: "True", + FFlagGraphicsMetalFixD16Check: "True", + FFlagGraphicsAdrenoDisableExtFmt: "False", + FFlagGraphicsVulkanAndroidExtendedFormats2: "False", + FFlagGraphicsGLAndroidExtendedFormats2: "False", + FFlagStudioLuauLinter: "True", + FFlagLuauExtendedLiterals: "True", + FFlagCLI27641B: "False", + DFFlagAnalyticsNS1BeaconSupportLimitedRobloxUrls: "True", + DFFlagFixPriorityAscDesc: "True", + FFlagLuaAppSecondaryButtonSpecifiesFont: "True", + FFlagNetworkDeserializePacketsInAJob_PlaceFilter: + "False;2291717546", + DFFlagAsyncPublishImprovement: "True", + FFlagQuantumScrollingFrame5: "True", + FFlagClampCanvasPositionInLayoutStep: "False", + FIntStudioBFRolesetSaveToCloudV2: "4", + FFlagSocialLibraryEnabled: "True", + FFlagStudioMeasureRigidJointsNotInWorld: "True", + FFlagStudioDoNotShowHideAutoCompleteMenuV2: "true", + FFlagStudioClearCallStackWidgetOnGSTChange: "true", + FFlagEnableInputObjectIsModifierKeyDown: "True", + FFlagStudioRefactorPlaceSessionModel3: "true", + FFlagApplyModifiersToInputObjects: "False", + FFlagStudioRelayQtModifiersToRobloxInput: "False", + FFlagUseRoactPlayerList: "False", + FFlagStudioFixCannotSetBreakPoint: "True", + DFFlagDontSendEmptyTouchPackets: "True", + DFFlagParallelAddInstanceWhenParalleStream: "True", + FFlagStudioLoadLesserQtTranslationFiles: "True", + DFFlagLuaDebuggerDoNotResetStackForLuaThreadWithError: "True", + FFlagStudioGamePresenceToFixSyncCallHangWhenQuit: "True", + FFlagStudioFileLockRelatedFixes: "True", + FFlagEnableReturnKeyPressedEvent: "True", + FFlagMultipleBoxesManualFocusRelease2: "True", + FFlagXboxLocV2: "True", + FFlagStudioShowVariableTooltipOnErrorLine: "True", + FFlagEnableLegalText: "True", + FFlagStudioCheckArgPhraseForInFunctionCall: "True", + FFlagStudioNewFoldState: "True", + FFlagDoNotLoadUnverifiedBuiltInPlugins: "true", + FFlagLuaAppPreloadChatRefactor: "True", + FFlagLuaAppDeepLinkEventReceiver: "True", + FIntAvatarEditorRedesignRolloutPercentageAndroidPhone: "100", + FIntAvatarEditorRedesignRolloutPercentageAndroidTablet: "100", + FIntAvatarEditorRedesignRolloutPercentageIphone: "100", + FIntAvatarEditorRedesignRolloutPercentageIpad: "100", + FIntAvatarEditorRedesignRolloutPercentageOther: "100", + FIntLuaCatalogRolloutPercentageAndroidPhone: "100", + FIntLuaCatalogRolloutPercentageAndroidTablet: "100", + FIntLuaCatalogRolloutPercentageIphone: "100", + FIntLuaCatalogRolloutPercentageIpad: "100", + FIntLuaCatalogRolloutPercentageOther: "100", + FFlagLuaAppEnableAERedesign3: "True", + FFlagLuaAppEnableLuaCatalogPage3: "True", + FFlagUseCreationToFetchMyOverrideData2: "True", + FStringStudioUrlAnimationEditor: + "https://web.archive.org/web/20200624170102/https://devforum.roblox.com/t/keyframes-animate-everything-around-me/360033", + FFlagGraphicsVulkanPixelbookDisable: "True", + FFlagLuaAppGameplayIntentReferralSource: "True", + FFlagEnableAndroidSetPendingTagOnContactFriendRequest: "True", + DFFlagUseDefaltShirtAndPants2: "True", + FIntLuaChatAliasesRolloutV3: "0", + FFlagEnableContactsApiServiceV2: "True", + DFFlagESGamePerfMonitorEnabled: "True", + DFIntESGamePerfMonitorDelayBeforeFirstReportInSeconds: "60", + DFIntESGamePerfMonitorHundredthsPercentage: "200", + DFIntESGamePerfMonitorReportTimerInSeconds: "30", + DFFlagStrictOggParsingFix2: "True", + DFFlagStrictOggParsingSeekFix: "True", + DFFlagReportMoreParsingAnomalies: "True", + DFIntReplicatorJoinSnapInfluxHundrethsPercentage: "50", + FFlagPackageRemoveJointInstanceWhenHashing: "True", + FFlagStudioPackageVersionCheckInEditDMOnly: "True", + FFlagStudioAddPackagePermissions: "True", + DFFlagHandleLowTriggerStreamingGC: "True", + DFFlagAvoidVelBufWhenGC: "True", + DFFlagInitialSourceHashConsistencyFix: "True", + FFlagStudioShowDotsForScriptEditors: "True", + FFlagStudioDraftsServiceGetEditors: "True", + FFlagMeasureRigidJointsNotInWorld: "True", + FFlagCMSRemoveAssetTypeBackendMap: "True", + FFlagCMSRemoveUGCContentEnabledBoolean: "True", + FFlagStudioUseNewMergeDialog: "True", + DFFlagVersionControlServiceBroadcastOnEditorsChange: "False", + FFlagUserFixMouseCapture: "False", + FFlagNotGroundhogsDay: "True", + FFlagCrossDmScriptingInPlugins: "False", + FFlagPluginMDIInterface: "False", + FFlagStandalonePluginsSupport: "False", + FFlagUnfocusTextBoxBeforeAncestorEvent: "true", + FLogError: "6", + FFlagRenderShadowmapCheckCB: "True", + FFlagRenderFixEvsmFiltering: "True", + FIntLuaAppUseNewAvatarThumbnailsApi5: "100", + FFlagRenderFixHamArray: "False", + FFlagCautiouslyInitilaizeSoftwareCursorVisible: "True", + DFFlagLuaTableExts: "True", + DFFlagLuaMathLog2: "True", + FFlagStudioCheckCanPublishBeforePublishing: "False", + DFFlagCacheExistingPackageVersionData: "True", + FFlagStudioPackageLinkAutoUpdateIndicatorFixes: "True", + FFlagStudioAddUpdatePublishedPackageReturnResult: "True", + FFlagReportGameJoinLoadTime: "True", + FFlagNoJoinForMoveTo: "True", + FFlagUserSiblingTouchGui: "True", + FFlagStudioUseNewDefaultNameEndpoint: "True", + DFFlagPlayerConfigurerDoCDNProbe2: "True", + FIntAppBridgeNewGameJoinAPIPercent: "0", + EnableLuaAppOnChrome: "True", + FFlagLuaChatAddButtonThemeFixEnabled: "True", + FStringGraphicsVulkanBlacklist: "", + EnableAndroidSetTagOnContactAcceptFriendRequest: "True", + FFlagUseNewFriendsDomainCoreScripts: "True", + FFlagStudioLoadPluginsAtRightTime: "False", + FFlagStudioRestoreWindowsASAP: "False", + FFlagLuaAppFixPrimaryStatIconColor: "True", + FFlagAvatarEditorRTranslations: "False", + DFFlagPolicyServicePlayerCallbackQueuesEnabled: "True", + FFlagNoDisconnectEventBeforeUnmountWorkaround: "True", + FFlagNewABTestFramework2: "True", + FFlagLuaChatShareGameThumbnailMigrationV2: "False", + FFlagShareGameEventConsolidationEnabled: "True", + DFFlagLoadLibraryWarn: "True", + FFlagLuauLimitRecursiveBlocks: "True", + FIntCLI30390: "2", + DFFlagNetworkUseSharedStreamingObserver4: "False", + FFlagNetworkStreamingPhysicsObserverInit4: "False", + DFFlagReportPhysicsReplicationRatio: "True", + FFlagStreamingParallel3: "True", + DFFlagFixPhysSenderParallelSimDistanceUpdateValue: "True", + DFFlagGCJobInitNegativeLastSentServerRadius: "True", + DFFlagServerPlaceIdKnownAssetEndpoints: "False", + FIntStudioBFRolesetAsyncPublish: "4", + FFlagAvatarEditorSimultaneousFullViewAvatarTypeFix: "True", + FFlagLuaAppFixCancelButton: "True", + FFlagLuaChatAliasesV3: "False", + DFStringLoadLibraryWarnLink: + "https://web.archive.org/web/20200624170102/https://devforum.roblox.com/t/loadlibrary-is-going-to-be-removed-on-january-6th/382516", + FFlagLuauBetterTypeLint: "True", + DFFlagFixGetPropertyChangedSignalMemoryLeak: "True", + FFlagStudioAsyncSingletonManagement: "False", + FFlagStudioAsyncSaveAs: "False", + FFlagStudioCloudEditUserDataloadDataAsyncCrashFix: "True", + DFFlagPackageFixJsonParserCrash: "True", + FFlagEditAssetForManagedAssets: "True", + FFlagShowReportOptionInToolbox: "True", + DFIntReportReplicatorStatsToInfluxHundredthsPercent_PlaceFilter: + "10000;3027055174;3917136599;2291717546", + FFlagStudioAutoSaveReportNullCheck: "True", + FFlagStudioCloseDocumentsOnce: "true", + FFlagStudioCheckForBadTeamTestResponse: "true", + FFlagStudioWhatsNewWindow: "True", + FFlagStudioAddWhatsNewWindowToStartPage: "True", + EnableTencentLinkingFeature: "False", + LuaAppHideGameDetailsDeveloperRow: "True", + FFlagGridUseConstRows: "True", + DFFlagInvokePreloadCallbackFromDMJob: "True", + FFlagFixColorPickerAppearingInWrongLocation: "True", + FFlagAdditionalFallbackFonts: "True", + FFlagDefaultThumbnailForRBXThumb: "True", + FFlagEnableCredentialsValidationMigration: "True", + FFlagEnableAccountSettingsMigration: "True", + FFlagManualFocusReleaseDisablesSinking: "True", + FFlagEnablePackageMassUpdateNestedPackage: "True", + FFlagNewAwardBadgeEndpoint_PlaceFilter: "True;2534981557", + DFStringAltTelegrafAddress: "100.20.191.133", + DFIntAltTelegrafHundredthsPercent: "10000", + DFIntClientJoinProcessPositiveSamplesThousandths_PlaceFilter: + "1000;3027055174;3917136599;2291717546", + FFlagMacStudioReportBFsAndPlugins: "True", + FFlagPCStudioReportBFsAndPlugins: "True", + DFFlagStudioShowToastNotificationInMainThreadAsync: "True", + FFlagEnableGameSignalRWithWindows1: "False", + FFlagUserFixZoomClampingIssues: "True", + FFlagRbxThumbAllowAnyParamsOrder: "True", + FFlagBetterRbxThumbRetryLogic: "True", + DFIntBatchThumbnailMaxRetries: "5", + FFlagUserChatNewMessageLengthCheck: "False", + DFFlagTrackStencilBufferSupport: "False", + DFFlagEnableSSEClamp: "True", + FFlagCMSEnableCatalogTags: "False", + FFlagAvatarEditorEnableLuaAuthenticationCheck: "True", + FFlagParentWeldToOtherPart: "True", + FFlagEnableLargeRobuxAndroidUpsellV3: "True", + FStringStudioBuiltinPluginDefaultFont: "SourceSans", + FFlagStudioLogTestUsage: "True", + FFlagEnableRobuxHexIconV2: "True", + FFlagStudioGameSettingsUseNewSettingsImpl2: "False", + FFlagStudioStopHardcodingDecadeOfDifferentDevhubDomains: "True", + FFlagResetKeyStatesOnWindowGainFocus: "True", + FFlagApplyModifiersToInputObjects2: "True", + DFFlagCurlReportResolvedIp: "True", + DFFlagInfluxReportLastVisitedUrl: "False", + FFlagUsingBrowserServiceCaptcha: "True", + FFlagBrowserServiceForAllPlatforms: "True", + DFFlagFixGuardTiming: "True", + FFlagUseNewDocumentationUrls: "True", + FFlagStopCaringAboutIsTouchDevice: "False", + FFlagScrollingFrameSinkMouseDownOnScrollbar: "True", + FFlagRoundInUDimLerp: "True", + DFFlagUseAPIAssetsVersionsV2: "True", + DFFlagVersionControlServiceBroadcastOnEditorsChangeExplicit: "true", + FFlagStudioSandboxUtf8Fix: "true", + DFFlagHttpClientCacheStatsLock: "True", + FFlagAnimEditorUseCustomFPS: "True", + FFlagDevConsoleLogMemoryButton: "True", + DFFlagEnableHttpProxy: "False", + FFlagPlayerListDontSinkTouchUnnecessarily: "True", + FFlagPlayerListBetterGroupCheck: "True", + FFlagPlayerListDontSortTeamsByScore: "True", + DFFlagBetterAddInstance: "True", + DFFlagEasingRefactor: "True", + FFlagStudioFixConstantReconnectPopups: "True", + FFlagStudioUpdateWhatsNewDevForumUrl: "True", + DFFlagFixSoundReplicationForTeamCreate: "True", + FFlagEnableSetStageNoneInDestroy: "True", + DFFlagTaskSchedulerEraseDone: "True", + DFFlagTaskQueueLinger: "True", + FFlagLuaAppNewThumbnailFinalState: "True", + FFlagGraphicsMetalMacIncMinSpec: "True", + FFlagQueueUIEventsDuringLayout2: "True", + FFlagLuaAppUseGameMediaV2: "True", + LuaAppHideGamesDropDownList: "True", + FFlagNotEraseCallbackQueueOnPlayerRemoving: "True", + DFFlagModifySoundAssetsAssetListStringSeparator: "True", + DFIntReportFMODInitThreadingRate: "0", + DFFlagCheckFMODInitThreading: "False", + DFFlagHttpRequestClearRes: "True", + DFFlagSignalRControlExcStringFix: "True", + DFFlagFileSystemCheckReadSize: "True", + FFlagInfiniteTriangleMeshRecalcFixEnabled: "True", + FFlagStudioReportOSVersionDiag: "True", + FFlagSolverRemoveBadDebugCode: "True", + DFFlagLDLEliminationPerformanceFixEnabled: "True", + DFFlagOptimizeTerrainStreamOut: "False", + DFFlagTerrainPhysicsDataDeferredSquared: "True", + FFlagTerrainUseClumpedPhysicsData: "True", + FFlagStudioFixSelectAll: "True", + FFlagStudioEnsureEditDataModel: "True", + FFlagGetVersionHistoryAssetFailure: "True", + DFFlagReportReplicatorJoinDataItemStatsToInflux: "True", + DFIntReplicatorJoinDataItemStatsInfluxHundrethsPercentage: "1000", + FFlagStudioUseStandaloneTransformTool2: "True", + FFlagGraphicsClampDepthBias: "True", + EnableManualFocusReleaseSupport: "True", + FFlagAnimEditorRenameKeyOptionFix: "True", + FFlagStudioToolboxEnablePlaceIDInAnalytics: "True", + FFlagStudioToolboxInsertAssetCategoryAnalytics: "True", + FFlagStudioEnableSaveToCloudV2BetaFeature: "False", + FFlagStudioSaveToCloudV2: "False", + FFlagStudioSaveToCloudV3: "False", + FFlagStudioSaveToCloudV3SpotFixes: "False", + FFlagAvatarEditorUseUserIdFromStore: "True", + FFlagUseLocalStorage3: "True", + DFFlagPlayerPolicyNotSwallowingError: "True", + DFFlagDontWalkOnReparent: "False", + FFlagStudioWhatsNewWindowBeta: "False", + FFlagCreateAndUpdateDataReplicationCache: "False", + DFFlagSupportJoinDataItemV2i: "False", + DFIntReplicatorJoinDataItemV2StatsInfluxHundrethsPercentage: "1000", + FFlagFutureIsBrightPhase2_5_v3: "True", + FFlagFlipTerrainNormalMap: "True", + FFlagUIViewportFrameDeviceRestore: "True", + FFlagStudioTextEntryRoactBugPatch: "True", + FFlagStudioGameSettingsUseNewSettingsImpl3: "True", + DFFlagLoadLibraryTrack: "True", + DFFlagRCCTeamCreateSaveOnZeroPlayers: "True", + FFlagCLI30496: "True", + FFlagStudioEnableAsyncPublishBeta: "False", + FFlagStudioMassUpdateWaitForAsync: "False", + FFlagStudioCheckFailedPublishOnClose: "False", + FFlagStudioMakePublishingAsync: "True", + FFlagStudioPruneModeratedInstalledPlugins: "False", + FFlagStudioWaitForContentLoadedToLoadPlugins: "False", + FFlagSetContentLoadedBitBeforeEmittingSignal: "True", + FFlagStudioLoadPluginsAtRightTime2: "False", + FFlagStudioUseStandaloneCollisionEditor2: "True", + FFlagStudioFixCancelTeamCreate: "True", + FFlagGraphicsVulkanAndroidExtendedFormats3: "True", + FFlagGraphicsGLAndroidExtendedFormats3: "True", + FFlagGraphicsAdrenoDisableExtFmt2: "True", + DFFlagEvenMorePhysicsSenderStats: "True", + DFFlagAddStreamingAdornDebugger: "True", + FFlagVersionControlServiceScriptCollabEnabled: "True", + FFlagCMSEnableCatalogTags2: "True", + FFlagStudioRemoveCouldNotFetchAssetVersionData: "True", + FFlagStudioPackagePermissionRGEFix: "True", + FFlagStudioEnablePackagePermissionsBetaFeature: "False", + FFlagHideNoAccessGroupPackages: "true", + FFlagPackagePermissionsAddDefaultNone: "true", + FFlagStudioEnableAnimationEditorBeta: "False", + FFlagEnableRoactAnimationEditor2: "True", + FFlagFixGameSettingsThumbnailDrag: "True", + DFFlagFixParallelCoarseMovementCallbacks: "True", + FFlagUseStudioLocaleForForceLocale: "True", + FFlagFixUnicodeTextSelection2: "True", + FFlagStudioEnableNewScriptFoldStateBeta: "False", + FFlagDarwinUseNewMemoryMetrics: "True", + FFlagStudioCheckIfDefaultFontLoaded: "True", + DFIntPackagePermissionPullingIntervalInSeconds: "10", + FFlagPlayerPolicyHttpRequestHealthReportEnabled: "True", + DFFlagPlayerPolicyHttpRequestRetryEnabled: "True", + DFFlagDressInLayers2: "true", + DFFlagRCC29411p3: "true", + FFlagReduceRelentlessRemoteReminders: "true", + FFlagAlwaysGenerateGuid: "true", + DFFlagRebuildR6AccoutrementsWhenEnteringWorkspace: "True", + FIntPlayerPolicyHttpRequestRetryTimes: "3", + FFlagTerrainToolsFixScrollBarResize: "True", + DFFlagFixPerSecDivideStats: "True", + DFIntRccLinuxMemoryMegaByteLimit: "7000", + FFlagStudioValidateToSAcceptance: "True", + FFlagLuaAppSingleTriggerForLocalPlayerManager: "True", + FIntStudioBFRolesetPackagePermissions: "4", + FFlagGlslesMediump1: "False", + FFlagGlsles3Mediump1: "False", + FFlagStudioCheckLocaleNameBeforUse: "True", + FFlagBypassDoubleInitialization: "True", + FFlagFixGameViewControllerViewRecreation: "True", + FFlagFetchLocalUserHeadshotInFetchHomePageData2: "True", + FFlagStudioMoveAboutWindowCode: "True", + FIntLuaChatUseNewFriendsEndpointsV2: "100", + FFlagLuaCatalogFixLongPriceText: "True", + FFlagLuaCatalogUseOriginalInsufficentRobuxIcon: "False", + FFlagCatalogResellerUseNewGridView: "True", + FFlagPasswordFieldIntegrationEnabled: "True", + FFlagLuaAppCanDisableBackNavigation2: "True", + DFFlagStopRestreamInstancesWithoutParent: "True", + FIntRenderGrassHeightScaler: "50", + FFlagRenderDecorationGrass: "True", + DFFlagLDLPGSCollisionStatsEnabled: "True", + DFFlagPlayerPolicyUseClientIpAddressFromSessionId: "True", + FFlagAppBridgeRewritePatch1: "True", + FFlagPlayerListDesignUpdate: "True", + FFlagUseRoactPlayerList2: "False", + FFlagUpdateLeaderboardIconPriority: "True", + FFlagNewPlayerListFixBackpackMemoryLeak: "True", + FFlagStudioFixPackageKeepsPullingAssetVersionId: "True", + FFlagStudioFixBindToClose2: "True", + FFlagStudioFixUILibDropdownStyle: "True", + FFlagStudioUseDevelopAPIForPackages: "True", + FFlagStudioGetSharedPackagesInToolbox: "True", + FFlagExtTrackpadsMasterSwitch: "True", + FFlagExtTrackpadsUseHeuristics: "True", + FFlagLuaAppEnableBacktraceErrorReport: "True", + FFlagStudioCorrectlyDeprecateProp_UITheme: "True", + FFlagStudioCheckDataModelAfterSave: "True", + FFlagStudioTranslateThemePropertyItem: "True", + FFlagTerrainToolsImproveColorImport: "True", + DFFlagStudioThrowExceptionForCyclicTables: "True", + FFlagStudioIntInBoolContextWarningFixEnabled: "True", + FFlagStudioCorrectPublishAnalytics: "False", + FFlagStudioDisableAutoSaveToCloud: "True", + FFlagStudioConnectPublishAsClose: "False", + FFlagStudioFixDMThreadingIssueForPublishAs: "False", + FFlagStudioCloseScriptsOnUiThread: "True", + FFlagStudioAnalyticsIdeDocCheck: "True", + FFlagFixOverZealousTextWrapping: "True", + FFlagStudioReplaceDMLockWithTask: "True", + FFlagDisableDecorationForLeafyGrass: "True", + FFlagTerrainToolsClearConfirmationDialog: "True", + FFlagTerrainToolsFixSmoothDesiredMaterial: "True", + UseSetForegroundWindowForPlayer2: "True", + FFlagTerrainToolsUIUpdate: "True", + FFlagEnableiOSFriendFinderAndContactFriendingAnalytics: "True", + DFFlagFixCharPosNaNCompare: "true", + FFlagBulletInitialContactDivideByAxisLength: "True", + FFlagStudioAddLoadUserPluginsArgument: "True", + FFlagStudioCheckForBadTeamTestResponse2: "True", + FFlagAvatarExperienceConsistentRolloutValue: "True", + FFlagDebugDeleteDiscrimination: "True", + FFlagStopCaringAboutIsTouchDevice2: "True", + FFlagSkipLowResFix: "False", + DFFlagTaskSchedulerEnsureCOMIsInitialized: "True", + FFlagFutureIsBrightPhase2GL3: "False", + FFlagFutureIsBrightPhase2GLES3: "False", + DFFlagFixNullTask: "True", + FIntLuaAppBacktraceErrorReportPercentage: "20", + FFlagLuaAppInputValidationActionUsesCurrentText: "True", + DFFlagPGSConstraintThreadSafeUpdatePVEnabled: "True", + FFlagArrayDynamicPopBackBugFix: "True", + FFlagStudioDeprecateRecentSave: "True", + FFlagStudioConvertToPackageUploadErrorDisplay: "True", + FFlagStudioRemoveDuplicatePackageStatusChangedSignal: "True", + DFFlagHideProxySettings: "True", + FFlagFixBuiltinPluginSecurityLevels: "True", + FFlagStudioGameSettingsUseRoact1_2: "True", + FFlagLuaCatalogLimitSellPriceDigitsTo10: "True", + FFlagEnableLumberyak: "True", + DFFlagHumanoidOnlyStepInWorkspace: "False", + DFFlagRemoveUsesOfIsAutoJoint: "True", + DFFlagAnimatorNewModelSearchAnalytics: "False", + FFlagFixTableLayoutMinorAxisSortOrder: "True", + DFFlagBetterStreamingHumanoidSimulationFiltering: "True", + FFlagUIGradientEnabled: "True", + FFlagLuaAppGameGridNewMetrics: "True", + FFlagShowModeratedPluginInfo: "True", + FFlagGameDetailsPeekViewAnalyticsEvents: "True", + FFlagLuaAppABTestGameDetailsPeekView: "True", + FFlagLuaAppInitializeABTests: "False", + FFlagRemoveItemASHX: "True", + DFLogTrackTeamCreateSaveMD5HashOutput: "6", + FLogStudioLocalSaveMD5HashOutput: "6", + DFFlagAnimatorAnimationPlayed: "True", + FFlagUserMakeThumbstickDynamic: "False", + FFlagCLI30497: "True", + FFlagCLI30497R: "True", + FFlagCLI30497B: "false", + FFlagCLI30497W: "True", + FFlagCLI30497H: "True", + FFlagCLI30497S: "True", + FFlagLuaAppFriendsAnalyticsOnStartup: "True", + DFFlagNoExceptionForSimulatingOwnCharacterOutsideStreamingRegion2: + "True", + FFlagNetworkStreamingPhysicsObserverInit6: "True", + DFFlagNetworkUseSharedStreamingObserver6: "True", + DFFlagOptimizeTerrainStreamOut2: "True", + DFFlagPartInstanceCofMPropertyExposed: "True", + DFFlagLDLPGSAdditionalStatsEnabled: "True", + DFFlagHttpServiceUseIpBlacklist: "True", + DFFlagNotifyModelCompleteness3: "True", + DFFlagCompletenessClientCreatesInstanceFix: "True", + FIntCLI30497I: "2048", + DFFlagJumpScaresP2: "True", + FFlagAvatarExperienceUnselectTryOnFix: "True", + FFlagAvatarEditorUpdateRecommendations: "True", + FFlagAvatarEditorTweenMinimizeButton: "True", + DFIntDesiredStreamJobTimeMSPerThread: "6", + FFlagWindowsTouchEnabled: "False", + FFlagTouchscreenSupport: "False", + FFlagUserChatHistorySinksInput: "True", + FFlagLinearFXBlurFix: "true", + FFlagRenderEnableDepthClamp: "True", + DFFlagFixExtraMemoryComputation: "true", + FFlagXboxFixEngagementLayout: "True", + FFlagLDLAkisMethodEnabled: "True", + FFlagCheckGameStateOnResume: "True", + FFlagLuaCatalogInfoRowEclispe: "True", + FFlagLuaCatalogKeepSellAlertPositionWithKeyboard: "True", + FFlagGlsles3MediumpNoHQ1: "True", + FFlagCheckDataModelStateInTeleport: "True", + FFlagFixACMOverlappingIssues: "True", + FFlagVideoSupport: "True", + DFFlagHttpsTextFilter: "True", + DFIntHttpsTextFilterPercentRollout: "100", + DFFlagNoSharedPinocchio: "True", + DFFlagSupportMeshV4Read: "True", + FFlagIssueTrackerRefactor: "True", + FFlagApplyPlaceFilterEarly: "True", + DFFlagAniCombinedServerPassthrough: "True", + FFlagOverrideMouseBehaviourFireChanged: "True", + FFlagUpdateSettingsHubGameText: "False", + DFFlagNewMemoryLevelCheck: "True", + DFFlagFixPreloadAsyncCallbackCrash: "True", + FFlagSmallerToolboxMinWidth: "True", + DFFlagRakNetUseSelect: "True", + FFlagDeliverLowMemoryWarningsViaPolling: "False", + FFlagStudioDraftsServiceRemovedScriptsFix: "True", + FFlagEnableScaleIndependentBulletCollision2: "False", + FFlagStudioLogPlaceIdOnPlaceOpen: "True", + FFlagStudioDraftsDeletePreferSafeOption: "False", + FFlagStudioLoadPluginsAtRightTime3: "True", + FFlagStudioFixOgreWidgetCheckInPlaceSessionMainView: "True", + FFlagStudioReplaceDMLockWithTaskIfNotOnMainThread: "True", + FFlagStudioTranslationsTail001: "True", + FFlagStudioTranslationsTail002: "True", + FFlagFixMouseInStandaloneWidgets: "True", + FFlagStudioPruneModeratedInstalledPlugins2: "True", + FFlagStudioDoNotStoreSelectionListInPropertyWidget: "True", + FFlagStudioCleanupPluginWidgetRelayViewBase: "True", + FFlagGraphicsD3D9GracefullyHandleBadWindowHandle: "True", + FFlagStudioCleanupPluginRefresh: "True", + FFlagStudioDisconnectIDEDoc: "True", + FFlagAllowLuauTypes: "True", + FFlagUserChatValidateFirst: "True", + FFlagDontCountHorizontalScrollsForExtTrackpad: "True", + FFlagLuauOptimizeTableVarargs: "True", + DFFlagLuauFasterTableLibrary: "True", + FFlagLuauImproveLineInfo: "True", + DFFlagNetworkUseSharedStreamingObserver6_PlaceFilter: + "True;2096931771;900578327;2096931771;2293712847;4498778926", + DFFlagStrictParsingFix: "True", + FFlagTerrainToolsFixNilBrushProperties: "True", + FFlagTerrainToolsUseFragmentsForToolPanel: "True", + FFlagTerrainToolsFixPlanePositionErrorMessage: "True", + FFlagTerrainToolsFixGettingTerrain: "True", + FFlagTerrainToolsOffsetGenerationNoise: "True", + FFlagPlayerPolicyHttpRequestHealthReportToInfluxEnabled: "True", + FFlagLDLUseStasisCache: "True", + FFlagIgnoreModalGuiWhenScreenGuiIsDisabled: "True", + FFlagMarkAppearanceDirtyWhenUIPaddingChanges: "True", + FFlagFixHorizontalScrollBarGaps: "True", + DFFlagFixScalingValueReplicationWarn: "True", + DFFlagStudioFixJoinSurfacesDisabled: "True", + FFlagStudioEnableLuauTypeCheckingBetaFeature: "True", + FFlagLuaAppBacktraceReportBaseUrl: "True", + FFlagLuaChatAliasConfig_GlobalErrorWillDisable: "True", + FFlagLuaChatAliasConfig_UserIdErrorWillDisable: "True", + FFlagLuaChatPlayTogetherGameIconFix: "True", + FFlagFetchAliasesOnStartup: "True", + FIntLuaChatAliasesRolloutV5: "100", + DFFlagUsePugiForAbuseReport: "True", + FFlagXboxUpdateSessionChecker: "True", + FFlagAvatarExperienceEnableAvatarModelLoadTime: "True", + FFlagUseGenericRBXThumbUrl: "True", + FFlagImplementIMEInStudio: "True", + FFlagLuaCatalogPremiumUpsellModal: "True", + DFFlagHttpAddSetMethodPatch: "True", + DFFlagPubKeyExchange: "True", + FIntNumSmoothingPasses: "3", + FFlagPerPeerSnfWhitelist: "True", + FFlagStopRelatives: "True", + FFlagUseRoactPlayerList3: "True", + FFlagFindNestedParts: "True", + FFlagRTMemoryless: "True", + FFlagPartMaterialTableReload: "True", + FFlagBeamTextureDesyncFix: "True", + FFlagFixAdornRenderNullCrash: "True", + FFlagRemoveReflectionScaleValue: "True", + FFlagFutureIsBrightPhase2_5EnableControls: "True", + FFlagPresetLightRefactor: "True", + FFlagLuaAppDisplayFriendInGame: "True", + FFlagUserChatAddServerSideChecks: "True", + FFlagStudioDraftsServiceHostCrashFix: "True", + FFlagTerrainToolsAutoFormatNum: "True", + FFlagTerrainToolMetrics: "True", + FFlagTextScaledRespectUIPadding: "True", + FFlagOnlyFireFocusedOnce: "True", + DFIntPercentageThresholdUsingFriendsV2A3: "100", + FFlagStudioGameSettingsDisablePlayabilityForDrafts: "false", + FFlagCLI31175: "True", + FFlagStudioDraftsDeletePreferSafeOption2: "True", + DFFlagTryGCifNeedGC: "True", + FFlagStudioFixInitialEnabledPluginGui2: "True", + FFlagBuildGuiOnServerInStudio: "True", + FFlagStudioHandlePreloadAsyncInPluginDataModels: "True", + DFFlagLDLBuildProgramTimeReportEnabled: "True", + DFFlagLDLProgramOpsReportingEnabled: "True", + FFlagABTestLoadingDeadlockFix: "True", + FFlagStopTheDefaultTeleporter: "True", + DFFlagCompletenessParentMFDFix: "True", + FFlagStudioGameSettingsPermissionUpdateWarning: "True", + FFlagLuaLogInDisableAutoFocus: "True", + DFFlagRccPassThroughMatchmakingMetadata: "True", + DFFlagRccRemoveMaxGameInstances: "True", + DFIntHttpInfluxHundredthsPercentage: "2", + FFlagEnableAppInstallationId: "True", + FFlagInitializeVideoManager: "True", + DFIntLDLBuildProgramTimeReportRate: "100000", + FFlagPlayerListAdjustHeightToMatchLegacy: "True", + FFlagStudioEnableSafeUpdatesBetaFeature: "True", + FFlagCatalogUpdateRecommendations: "True", + FFlagAvatarExperienceNavigationFix: "True", + FFlagLDLUnrollMatrixOperations: "True", + FFlagLuaPickyScrollingPicker: "True", + FFlagLuaCatalogRefactorSpawns: "True", + FFlagLuaCatalogShowFloodcheckErrorToast: "True", + FFlagLuaCatalogEnableFullViewToggleAnalytics: "True", + FFlagLuaAppABTestFeaturedGameTileInSearch: "False", + FFlagLuaAppGamesAPISetFeaturedGame: "True", + FFlagLuaAppGameSortGridABTestEnabled: "True", + DFFlagReportLuaKicks: "True", + FFlagEnableScaleIndependentBulletCollision4: "False", + FFlagGraphicsVulkanEnableDepthBiasClamp: "True", + DFFlagLDLUseMinimalLocalFillElimination: "True", + DFFlagFixTerrainStreamOutOptOrder: "True", + FStringLuaAppGameSortGridABTestJSON: + '{"ABTestData" : { "Control" : { "UseGrid" : false, "GridRows" : 0, "UseGridMediumTile" : false }, "Variation1" : { "UseGrid" : false, "GridRows" : 0, "UseGridMediumTile" : false }, "Variation2" : { "UseGrid" : true, "GridRows" : 3, "UseGridMediumTile" : true }, "Variation3" : { "UseGrid" : true, "GridRows" : 2, "UseGridMediumTile" : true }, "Variation4" : { "UseGrid" : true, "GridRows" : 3, "UseGridMediumTile" : false }, "Variation5" : { "UseGrid" : true, "GridRows" : 2, "UseGridMediumTile" : false } }}', + FFlagMeasureSleepAssemblies: "False", + FFlagFixReplaceTerrainAir: "True", + FFlagStudioProperCheckForServerContentLoaded: "True", + FFlagFixScrollActionOffset: "True", + FFlagFixEmotesMenuInputPassthrough: "True", + FFlagStudioPlaceSessionMainViewCleanupEventFilter: "True", + FFlagEnablePurchasePromptV2: "True", + FFlagIfYouDidntKnowNowYouKnow: "True", + DFFlagUseCorrectIncompatibleVersionMessage: "True", + FFlagIsPasswordValidationV2Enabled: "True", + FFlagIsTwoStepValidationV2Enabled: "True", + FFlagIsTwoStepResendV2Enabled: "True", + DFFlagStreamingCheckParentBeforeAddingNewInstanceItem: "True", + DFFlagDeprecateConnectionRejected: "True", + DFFlagStreamingScaleBufByQuota: "True", + DFFlagCheckFMODInitThreading2: "True", + FFlagStudioGameSettingsFixDescriptionFetch: "True", + FFlagStudioDeferCGESelectionListener: "True", + DFFlagLuauFailFaster: "True", + DFFlagGetRidOfPointlessSytemCheck: "True", + DFFlagVideoFixPossibleBufferingHang: "True", + DFFlagParameterValidationForLoadSoundForChannel: "True", + DFFlagVideoBetterHandlingOfUnsupportedCodecs: "True", + DFFlagDoNotCreatePlaybackChannelForNullSoundChannel: "True", + DFFlagValidateSoundChannelInTryToLoadSound: "True", + DFFlagVideoAllowNonNativeResolutions: "True", + DFFlagVideoBetterCleanupOnOpenFailure: "True", + DFFlagVideoStreamAlternateStopAudio: "True", + DFFlagUpdateQuotaAfterMemoryUpdate: "true", + DFFlagUpdateStreamingInfoWhenGC: "true", + FFlagFixDuplicateChildNames: "true", + FFlagLuaAppNilUserPresenceFix: "True", + DFFlagLDLPGSReportCachedMemory: "True", + FFlagImagePickerNow: "True", + FFlagTerrainToolsFixMaterialTooltipClipping: "True", + FFlagLuaSignUpBDayRefactor2: "True", + FFlagStudioMitigateTemplateModerationHash: "True", + FFlagGraphicsD3D11PerFrameQuery: "true", + FFlagGraphicsVulkanPerFrameQuery: "true", + FFlagPlayerListDontCreateUIWhenDisabled_PlaceFilter: + "True;3411100258", + DFFlagLoadLibraryError: "True", + FFlagLuaCatalogRedirectOwnedBundleToCorrectCategory2: "True", + FFlagStudioFixAutoCompleteClosingParensAnonyFuncDef: "True", + DFIntNetworkStreamingGCUrgentMaxMicroSecondLimit: "8000", + FFlagStudioAlwaysSendActiveSessionAnalytics: "True", + FFlagEnableJavascriptHybrid2: "True", + FFlagPlayerListMorePermissiveLeaderstatsCheck: "True", + FFlagFixGetStringForKeycodeCrash: "False", + DFFlagLaterPlayerTeamRemovingSignal: "True", + FFlagEnableGameI18nForClients: "True", + FFlagEnableLocaleHostForClients: "True", + FFlagStudioQuickOpenPatch: "True", + FFlagStudioQuickOpenFilterHiddenInstances: "True", + FFlagStudioQuickOpenFixPosition: "True", + FFlagStudioScriptEditorTelemetry: "True", + FFlagStudioCatchUploadExceptionForAsync: "True", + FFlagTerrainToolsRefactor: "True", + FFlagTerrainToolsFlattenUseBaseBrush: "True", + FFlagEnableScaleIndependentBulletCollision5: "True", + DFFlagHideStreamingPropsWhenNotStreaming: "true", + FFlagUseStudioServiceInPluginGetUserId: "True", + FFlagPrefetchCharacterInfoForSignUp: "True", + FFlagHttpServiceLogPluginDomains: "True", + FFlagCtrlPinchRejection: "True", + FFlagExtraDatamodelServicesForPluginDms: "False", + DFFlagContentProviderLocalAssetPath: "True", + FFlagLuaCatalogFixSearchParameterAnalytics: "True", + FFlagLuauContinue: "True", + FFlagLuaChatDateContentOverlapFix: "True", + FFlagDataStoreCacheLimitEnabled: "True", + FFlagBytecodeSerialization: "True", + FFlagSignatureSerialization: "True", + DFFlagReplicatorStreamingReportGCStepPercentage: "True", + DFIntStreamedRegionGCUrgentFactor: "20", + FFlagAvatarExperienceSaveManagerInitialization: "True", + FFlagAvatarExperienceEmptyHistoryFix: "True", + FFlagStudioEnableLuaPublishWorkflowBetaFeature: "False", + FIntStudioBFRolesetLuaPublishWorkflow: "4", + FFlagChangeHistoryIgnoreArchivable: "True", + DFFlagEnableFillWedge: "True", + FFlagEnableNonWhitelistedToggle: "True", + FFlagEnablePurchaseV2: "True", + FFlagGraphicsVulkanBetterTransferBarriers: "True", + FFlagStopRenderTransparentGlyph: "True", + FFlagStudioFixModuleScriptLuaStateInBacktrace_2: "True", + FIntStudioDeprecateQuickFindScriptStep: "2", + DFFlagStudioShowMixedTablesInWatchedVariables: "True", + DFFlagReplicatePlaceVersion: "True", + FFlagStudioFixIntellisenseTooltipCutoff: "True", + FFlagPlayerListPerformanceImprovements: "True", + FFlagStudioDontShowNilTooltip: "True", + FFlagFixGetStringForKeycodeCrash2: "True", + FFlagPlayerListFixUnexpectedLeaderstatsTypes: "True", + FFlagPlayerListFixBlockedInitalization: "True", + FFlagPlayerListFixTouchInputState: "True", + FFlagPlayerListInitalizePerformanceStatsVisible: "True", + FFlagMeasureSleepAssemblies2: "True", + FFlagEnableToolboxInsertWithJoin: "True", + DFFlagBodySafeUpdatePVEnabled: "True", + FFlagStudioDraftsUseMultiselect2: "True", + FFlagStudioDraftsServiceFullNameInDiff: "True", + FFlagRemoveCommittedDraftsFromSelection: "True", + FFlagDisableContextMenuDuringCommit: "True", + DFFlagVersionControlServiceBatchCommit: "True", + FFlagStudioQuickOpenSelectFirstByDefault: "True", + FFlagTerrainToolsGeneratorSkipAir: "True", + FFlagTerrainToolsMaterialGenerateFragments: "True", + FFlagTerrainToolsFixOffsetGenerationNoise: "True", + FFlagAllowDuplicateNamesOnNonAnimatedParts: "True", + FFlagStudioGameSettingsFixUserSearch: "True", + DFFlagDisableAncientNetworkSettings: "True", + DFFlagDisableReplicatorLuaCloseConnection: "True", + DFFlagDisableReplicatorLuaGetRakStatsString: "True", + DFIntClientReportLuaTicketInfluxHundrethsPercentage: "10000", + DFIntClientReportLuaConnectionSignalsInfluxHundrethsPercentage: + "10000", + DFIntServerReportLuaGetPortInfluxHundrethsPercentage: "1000", + FFlagTerrainTightBoxes: "False", + DFFlagTopGamesPhysicsReportingEnabled2: "True", + DFIntTopGamesPhysicsReportingRatePercent: "1", + DFIntTopGamesPhysicsAveExpFactorPercent: "10", + DFIntTopGamesPhysicsReportingDelay: "300", + FFlagStudioMeshCopyIdUseMeshId: "True", + FFlagStudioSettingsDialogOnlyShowCancelWithContent: "True", + FFlagStudioWatchListCheckForEditable: "True", + FFlagEnableDefaultSortFix: "False", + FLogPluginOnInvoke: "0", + FFlagPhysicsSleepImprovementsBeta: "False", + DFFlagNoExceptionsToPartsInStreaming: "true", + FStringStudioUrlPhysicsSleepImprovements: + '"https://devforum.roblox.com/t/beta-test-me-sleeping-part-behavior-improvements/456931"', + FFlagLuauWarnOnUtf8: "True", + FFlagUsePolicyServiceForCoreScripts2: "False", + FFlagFFlagUsePolicyServiceForCoreScripts: "False", + FFlagStudioFixStripedTableSelectionHover: "True", + FFlagHandleMouseDownWhenFocused: "True", + FFlagUseSaneScrollWheelDelta: "True", + FFlagLuaChatAliasesSizingFix: "False", + FFlagABTestMultipleWaitsFix: "True", + FFlagSwipeNeverResetsTouchFocusEventFix: "True", + FFlagAppBridgeDestroyAppOnTermination: "True", + FFlagRenderForceContext: "True", + DFFlagRejectEarlyHumanoidChanges: "False", + FFlagSteerFloatAndThrottleFloatReplicationFix: "True", + FFlagSkipLowResFix2: "True", + FFlagStudioFixStringHighlightingWithBackslashZ: "False", + FFlagStudioAllowDuplicateWatchVariables: "True", + DFFlagStudioStopDeepLuaTableStackOverflow: "True", + FFlagUsingNewCaptchaApi: "True", + FFlagLuaAppInitializeABTests2: "True", + DFFlagServerDisableLuaGetPort: "True", + FFlagQuickOpenFixSpinner: "True", + DFIntRccLinuxMemoryMegaByteLimit_PlaceFilter: + "16000;4599786547;4677926228", + DFFlagPremiumUpsellEnabledV2: "True", + FFlagPremiumLuaUpsellEnabled: "True", + FFlagPremiumLuaUpsellEnabledV2: "True", + FFlagReQueryPremiumOnError: "True", + FFlagAllowTGAImageAssetExtension: "True", + DFFlagGCReducesQuota2: "True", + FFlagAvatarSizeFixForReorganizeHeaders: "True", + FFlagTerrainToolsRefactorSculptOperations: "True", + FFlagUseAnalyticalElasticSpring: "True", + DFFlagClientNetworkReportIpVersion: "True", + FFlagFixStudioEmulatorDeviceOrientation: "True", + FFlagBroadPhaseIslandAcceleratedFilterStep: "True", + FFlagStudioFixShortcutSorting: "True", + DFFlagDontClearForwardRefMapOnGC: "True", + FFlagFIB25Update2: "True", + DFFlagContentProviderLocalAssetPath3: "True", + DFFlagContentProviderLocalAssetPathRCCFix: "True", + FFlagExtraDatamodelServicesForPluginDms2: "True", + DFFlagDontImmediatelyDeparentReplicator: "true", + DFFlagStopPlayersTraverseForPhysics: "true", + DFFlagAllowAnimateScripts: "true", + FFlagStudioRefactorAssetPreview: "true", + FFlagLuaPackagePermissions: "True", + FFlagUserCameraToggle: "true", + DFFlagFriendsV2BadAccessFix: "True", + FFlagNewAwardBadgeEndpoint2: "True", + FFlagLocalizeVideoRecordAndScreenshotText: "true", + FFlagFixGamepadContextActionServiceOverride: "False", + DFFlagComputeSolverDisplacementForWake: "True", + FFlagUseSolverDisplacementForWake: "True", + DFFlagDeferTickleAssemblyWakes: "False", + FFlagUseNewSleepStage: "True", + FFlagAvatarEditorUpdateCamera2: "True", + FFlagAnalyticsCatalogSearchEventContext: "True", + DFFlagHttpAdditionalBandwidthMetrics: "True", + DFFlagHttpNetworkType: "False", + DFFlagHttpDynamicSuccessStatusCode: "True", + DFFlagClientNetworkReportGameInstanceId: "False", + DFFlagVideoCircularBufferFix: "True", + FFlagVideoUseAudioAsMasterClock: "True", + DFIntUserHttpRequestsPerMinuteLimitZ_PlaceFilter: + "500;4686746335;4702658078;1067560271;1067660288;735030788;2033617470;4709927839;2033617613;1765700510;1187101243;4728133914;4728134592;4728135073;4728136238;4728136475;4728136681;4728136927;4728137133;4728137352;4728137581", + DFFlagAvoidVelBufWhenGC2: "True", + DFFlagClientStreamingRadiusRoundConsistency: "True", + FFlagCMSUseSharedUGCValidation: "True", + FFlagStudioFixAutoCompleteInAnonymousFunctionDef: "True", + FIntNotMovingSleepThresholdMult: "1", + DFIntFriendshipEndpointMigrationRolloutPercentage: "0", + FFlagGraphicsGLPerFrameQuery: "False", + FFlagStudioCheckPlaceVersionMatchInTeamCreate: "True", + FFlagStudioOpenModuleScriptIfNotFoundWhileDebugging: "True", + FFlagFixModuleScriptBreakpointNotHitWhenParentScriptNotOpened: + "False", + FFlagStudioQuickOpenReopenShowHistory: "True", + FFlagTrailClearCrashFix: "True", + DFFlagComputeSolverDisplacementForWake_PlaceFilter: + "True;679715583", + FFlagUseSolverDisplacementForWake_PlaceFilter: "True;679715583", + FFlagUseNewSleepStage_PlaceFilter: "True;679715583", + DFFlagDeferTickleAssemblyWakes_PlaceFilter: "False;679715583", + DFFlagRaknetBandwidthMetrics: "False", + DFIntRaknetBandwidthInfluxHundredthsPercentage: "0", + DFFlagEnableCallingWakeUpMechanicalJointsForAssembly: "True", + FIntESGamePerfMonitorReportDetails: "1", + FFlagLegacyShadowMapFormatRG8: "True", + DFFlagUseRaisePropertyChangeForSoundPlaying: "True", + FFlagRefactorPluginLoading: "False", + FFlagFixWeakFunctionRefInPlugin: "True", + FStringStudioUrlInsertObjectStreamlining: + "https://web.archive.org/web/20200624170102/https://devforum.roblox.com/t/object-insertion-workflow-improvements-beta-2/468307", + DFFlagPremiumGameIdFix: "True", + FFlagUpsellDirectToPackage: "True", + DFFlagStreamingFasterTargetRadiusIncreaseAfterGC: "True", + FFlagFixNotificationScriptError: "True", + FFlagUserRemoveTheCameraApi: "True", + DFIntVideoStreamMaxBufferMs: "200", + DFIntVideoStreamMinBufferMs: "100", + DFFlagUseThresholdForMotor6DWakes: "False", + DFFlagWakePartsOnGravityChange: "True", + FFlagStudioFixPublishSuccessNameIcon: "True", + FFlagPublishPlaceToRobloxLuaPlugin: "True", + FFlagStudioRefactorStudioVerbsSavePublishDuplicateCode: "False", + FFlagStudioFixPhantomBreakpointOnLineDelete: "True", + DFStringGlobalUniverse17sIds: "14743789;1482020489", + DFFlagGlobalToggle17sApis: "True", + DFFlagHttpRbxApiEnable17sApis: "True", + DFFlagEnableMacWindowCloseButton: "True", + DFFlagJointInstanceEnabled: "True", + DFFlagEconomyCreatorStatsApiWhitelist: "True", + DFFlagPostPremiumUpsells: "True", + FFlagLogPremiumImpressions: "True", + FFlagEnableRobuxIconXbox: "True", + FFlagXboxReportPlayerLocFix: "True", + FFlagStudioScriptEditorContentsChangingRefine: "False", + DFFlagUseRaisePropertyChangeForSoundTimePosition: "True", + FFlagStudioScriptFindElideCopies: "True", + LuaAppPercentRolloutGameDetailMoreAnalytics: "100", + FFlagXboxLessInfiniteFunctionMarshaller: "True", + FFlagFixRobloxInputBadArrayLengthChecks: "True", + FFlagUserChatNewMessageLengthCheck2: "True", + FFlagAvatarEditorFixCutOffItemName: "True", + FFlagLuaChatAliasesSizingFixV2: "True", + FIntLuaAppLogoutUserOnUnauthorizedPercentRollout: "100", + FFlagStudioPressEndToEndOfLine: "True", + FFlagStudioFoldSafeLexer: "True", + FFlagStudioFixGetClassIcon: "True", + FFlagDoTeleportCloseCurrentDMBlocking: "False", + FFlagRemoveDmCheckInSetLocalPlayerInfo: "True", + DFFlagSimLDLProgramNewStatsEnabled: "False", + DFFlagRejectEarlyHumanoidChanges2: "True", + FFlagAssetManagerLuaCleanup1: "True", + FFlagTrailLockFailCrashFix: "True", + DFFlagDebugRealityCheck3: "True", + DFFlagRemoveOldNFWL: "True", + FFlagAlwaysGenerateGuid2: "True", + DFIntStreamingPauseVelBufMaxDurationMS: "4000", + FFlagStudioReportOpenPlace: "True", + FFlagStudioReportLoginAnalytics: "True", + FFlagStudioReportBaseUrl: "True", + FFlagStudioGameSettingsGroupGamePermissionChanges: "True", + DFFlagVideoModifyMutexes: "True", + DFFlagVideoEnableDeviceTuning: "True", + DFFlagVideoFixAbsurdlySlowDataCopy: "True", + DFFlagVideoEnableGetInfo_PlaceFilter: + "True;4587054145;4521759066;4589144917;1921623329;4710199611;4786133739", + DFFlagAlwaysLongStep: "True", + FFlagStudioConfirmPublishWithDirtyDrafts: "True", + FFlagStudioQuickImproveResponsiveness: "True", + FFlagJIRA_RIDE_184_V2: "True", + FFlagVersionControlServiceScriptCollabEnabledByDefault: "True", + FFlagStudioFixAssetPreviewTreeView: "True", + DFFlagSimDontResetContactsOnNotifyAssemblyPrimitiveMoved: "True", + DFFlagTweenServiceOnStepped: "False", + FFlagLocalizationToolsLocalizationEnabled: "True", + DFFlagFixRijndaelCBC: "True", + FFlagLoadTheLoadingScreenEvenFaster: "true", + DFFlagClientNetworkSendGameInstanceId: "True", + FFlagOutputWidgetFindEnabled: "False", + FFlagCoreScriptOverrideRefactor: "true", + FFlagXboxUseNewBundleEndpoints2: "True", + DFFlagVectorMinMax: "True", + FFlagXboxHardwareBundleEnabled: "True", + FFlagStudioEnhanceEmulationDeviceManager: "True", + FFlagBindToAllInterfaces: "True", + DFFlagConnectIPv6ServerInLAN: "True", + FFlagRakNetSupportIpV6: "True", + FFlagImproveCatalogPerformance: "True", + DFFlagPremiumUpsellUserId: "True", + FFlagLuauImmutableUpvalues: "True", + FFlagLuauCaptureOp: "True", + FFlagPremiumUpsellPrecheck: "True", + FFlagRefactorPluginLoadingForDeadlock: "True", + FFlagScaleToolUseBinarySearch: "True", + DFFlagUseRefactoredHitTest: "False", + DFFlagUseRefactoredRaycast: "False", + DFFlagRefactoredIkSolve: "True", + FFlagDisableAutoTranslateForKeyTranslatedContent: "True", + FFlagDisableReconnectAfterPotentialTimeout: "True", + DFFlagFixCoreScriptModuleDebuggerDataNotMappingOnBaseLevelScript: + "True", + FFlagStudioFixOpenCoreScriptDocDatamodelMapping: "True", + DFLogPartStreamingRequests_PlaceFilter: + "6;2291717546;2623652930;2753554889;3027055174;4599786547", + FFlagStudioEnableProjectConfig: "True", + FFlagScriptContextEnableDetailedErrorSignal: "True", + FFlagLuaAppUseDetailedErrorSignal2: "True", + FIntInstrumentGuacRollout: "100", + FFlagLuaAppPolicyMockRefactor: "True", + FFlagLuaAppPolicyUseGuac: "True", + FFlagEnableAppPolicyDefaultsFile: "True", + FFlagLuaAppMorePagePolicyFix: "True", + FFlagLuaAppTopBarCustomBackButton: "True", + DFFlagSimLDLProgramNewStatsEnabled2: "True", + FFlagCJVNotFallbackToEnglishForUGCEnabled: "True", + FFlagStudioDisplayNameCrashFixEnabled: "True", + FFlagSimLDLProgramMemoryOptimization: "True", + FFlagStudioDeprecateQuickFindScriptTotally: "True", + FFlagStudioFixNullptrTeamCreateDCCrash: "True", + FFlagStudioEnableCoreScriptOpeningForInternalDevs: "True", + FFlagStudioDisablePluginButtonsInProgress: "False", + FFlagStudioCreateGroupOwner: "False", + FFlagStudioGameSettingsUserGameEditPermissionsRestriction: "True", + FIntStudioBFRolesetAccessPermissions: "4", + FFlagEnableStartupControllerOnWindows: "True", + FFlagCFrameVectors: "True", + FFlagNoMoreDraggerFloatingPointError: "True", + FFlagRemoveImplicitIkDraggerUndoWaypoint: "True", + FFlagStudioServiceShowConstraintDetails: "True", + FFlagStudioAllowBuiltinActionOverride: "True", + FFlagStudioDisablePublishButtonsInProgress: "True", + FFlagStudioCreateGameGroupOwner: "True", + FFlagUWPLocaleManagerEnabled: "True", + DFFlagSimEnableTouchEventManager: "True", + FFlagStudioReportPlaceSize: "True", + DFFlagFasterHasNanInf: "True", + DFFlagBodyAtomicUpdate: "True", + DFFlagParallelCollisionsFaster: "True", + FFlagStudioLanguageService: "False", + DFFlagMegaRepOnlyClearWhenNewlyAlive: "true", + DFFlagInstanceOrderCheck: "False", + FFlagStudioAutoFocusNewScripts: "True", + FFlagStudioDefaultPopulateFindWidget: "True", + FFlagStudioFixLocalShutdownRequest: "False", + DFFlagLogIsAPVAdornment: "False", + FFlagLuauHighlightContinue: "true", + FFlagStudioLuauWarningTelemetry: "False", + FFlagRankMatchByMatchedLength: "True", + FFlagTryTranslateParameterOnSourceMatch: "True", + DFFlagReportParameterContent: "True", + FFlagAllowPasteKeysBetweenAnimations: "True", + FFlagFixMockStudioTheme: "True", + FFlagUseGetKeyframeSequenceIgnoreCache: "True", + FFlagAddStatCounters: "True", + FFlagStudioEnableResume: "False", + FFlagRefactorPluginLoading2: "False", + DFFlagFastVisuallyMovingCounters: "False", + FFlagAndroidSetSafeZoneOffsets: "True", + FFlagStudioDeviceEmulatorSetSafeZone: "True", + FFlagFixRunServiceStopFromPlugin: "True", + FFlagStudioGameSettingsAccessPermissions: "True", + FFlagStudioCloseOnMiddleButtonRelease: "True", + FFlagStudioFixMacFileOpen: "True", + FFlagStudioUseAnimationEditorAnalytics2: "True", + FFlagLuauNewResume: "False", + FFlagEnableDoubleClickSupport: "True", + FFlagInGameMenuSinglePaneDesign: "True", + FFlagInvalidateNanTimeStamp: "True", + DFIntTrackCountryRegionAPIHundredthsPercent: "100", + FFlagMacStudioInitCrashHandlingFirstAfterFlagLoaded: "True", + FFlagGraphicsGLProperCheckForFramebuffer: "True", + FFlagAccountReplicatorQueueItemTypes: "True", + FFlagStudioQuickOpenSearchActions: "True", + FFlagStudioTightenSaveMutexLocks: "True", + DFFlagRCCMonitoringInitializeCpuVariables: "True", + DFFlagRaknetBandwidthMetricsAddServerIp: "False", + FFlagCollectAnalyticsForSystemMenu: "True", + DFFlagRCCMonitoringCustomTimeouts: "True", + DFIntHttpRbxApiMaxRetryBudgetPerMinute: "10", + DFIntHttpRbxApiMaxRetryCount: "3", + FFlagPlayerListFixStatFlickering: "True", + FFlagCorescriptThumbnailsRespectBaseUrl: "True", + FFlagPlayerListBetterDropDownPositioning2: "True", + FFlagPlayerListUseUIBloxIcons: "True", + FFlagPlayerListFixTouchInputState2: "True", + FFlagNewIrradianceCalculation: "True", + DFFlagRccUseCmdLineLimits: "True", + DFFlagRaknetBandwidthAddDataCenterId: "False", + DFFlagRequireModulesTypeCheckAnalyticsEnabled: "True", + DFIntRequireModulesTypeMismatchWarningCount: "8", + DFIntAssetTypeCheckPermyriad: "1000", + FFlagDoesNotLoadCachedFileSyncItemsForLuaApp: "True", + FFlagStudioFixCDNUrlForProjectConfig: "True", + FFlagStudioSandboxCrashFix: "True", + DFFlagTouchQueueMetrics: "True", + DFIntTouchQueueMetricsSendEveryXSeconds: "300", + DFIntTouchQueueMetricsInfluxHundredthsPercentage: "10000", + FFlagStudioFixTemplateModerationHashRemovalOnTCEnable: "True", + DFFlagSimLDLComponentMemoryUseComputationFix: "True", + FFlagStudioEnableAssetManagerService: "True", + FFlagStudioAddBulkImportView: "True", + FFlagStudioEnableBulkImportFromLua: "True", + FFlagDoNotGetAntiAddictionPolicyInRenderStep: "False", + FFlagStudioMakeActivityCounterListCrashDueToLocale: "True", + FFlagStudioPlaceSessionModelIncorrectLocaleCountryCrash: "True", + FFlagStudioIncorrectLocaleInLogFile: "True", + FFlagGraphicsGLDisableTimerQueryAdreno: "False", + FFlagGraphicsGLPerFrameQuery2: "False", + FFlagStudioEnableEmulationDeviceEditor: "True", + FFlagStudioAssetManagerBetaFeature: "true", + FIntStudioBFRolesetAssetManager: "2", + DFIntReportParameterContentHundredthsPercent: "8000", + DFFlagLocalizationServiceGetCountryCodeAPINullptrCheckFix: "True", + DFFlagPlayerPolicyGetApiUrlForRequestPolicyInfoFix: "True", + DFFlagPlayFabPlayerLoginLogoutAsServerEvents: "False", + DFFlagPlayFabEmitMarketplaceEvents: "False", + FFlagPackageDiffBugFix: "True", + FFlagStudioChatSessionHandlerCrashFix: "True", + FFlagLuaAppSiteBannerLinks: "True", + FFlagTopBarHideSiteBanner: "True", + FFlagWebViewsUseLuaGameDetails: "False", + FFlagEnableAppsFlyerLinks: "True", + EnableAppsFlyerDeferredLinks: "True", + FFlagEnableGameStartUniversalLink: "True", + FFlagLuaAppRefactorInAppLinks2: "True", + FFlagAppBridgeExplicitDefaultPlayerParams: "False", + DFFlagClientDisableLuaTicket: "True", + FFlagStudioUpdateRuiDialog: "True", + FIntDataModelPatcherEventPercentage: "1", + FFlagEnablePluginPermissionsPage2: "True", + FFlagPluginIdentityFix: "True", + FFlagPluginManagementPrettifyDesign2: "True", + FFlagStudioFetchPluginName: "True", + FFlagStudioHttpServiceUsePluginPermissions: "True", + FFlagStudioPermissionsServiceEnabled: "True", + FixChromebookEnterKeyIssue: "True", + FFlagStudioDontHideWatchItems: "True", + FFlagAlwaysWriteLegacyLock: "True", + FFlagAppShellReporterMonitorFrameTime2: "True", + FFlagMemoryFromAppShellReporter2: "True", + FFlagGameDetailsPeekViewAnalyticsEvents2: "True", + FIntTaskSchedulerThreadMin: "0", + FFlagStudioTimerRefactor: "False", + FFlagDumbSpatialHash: "False", + DFFlagTweecall: "True", + FFlagStudioInsertObjectStreamliningv0_Consolidated: "True", + FFlagStudioInsertObjectStreamliningv2_TranslatedToolTips: "True", + FFlagStudioInsertObjectStreamliningv2_SharedModelBugFix: "True", + FFlagStudioInsertObjectStreamliningv2_MultiWindowContextPlacementBugFix: + "True", + FFlagStudioInsertObjectStreamliningv2_DataModelLifetimeBugFix: + "True", + FFlagStudioInsertObjectStreamliningv2_ShowRecommendedObjectsOnly: + "True", + FFlagStudioInsertObjectStreamliningv2_ExpandedView: "True", + FFlagStudioInsertObjectStreamliningv2_InsertMenuShortcut: "True", + DFFlagBallSocketMaxFrictionTorqueEnabled: "False", + DFFlagAngularVelocityReactionTorqueEnabled: "True", + FFlagStudioDefaultGroupInDropdownPublish: "True", + DFFlagStopSoundTaskOnChannelTreeNullified: "True", + FFlagRemoveLinkFromKinematicJoints: "False", + FFlagSpanningEdgeCacheIsInTree: "True", + FFlagConsistentCofmForAnimatedAssemblies: "True", + DFFlagParallelSendTouches: "False", + DFFlagDoNotRepeatRedundantPlayingEvents: "True", + DFFlagDoNotRepeatRedundantVideoPlayingEvents: "True", + DFFlagReportReplicationVariantLimitHit: "True", + DFIntClientSendEventStringDataLimitBytes: "75000000", + DFIntClientSendEventVariantCountLimit: "1500000", + DFIntRCCReceiveEventStringDataLimitBytes: "75000000", + DFIntRCCReceiveEventVariantCountLimit: "1500000", + DFFlagSimLDLProgramForceUnroll: "True", + DFFlagLuaNoResetStack: "True", + FFlagLuauTypeAnnotationsEverywhere: "True", + FFlagAvatarExperienceImproveBackgroundTransition: "True", + FFlagAvatarExperienceUseInternalBackgroundAsset: "True", + FFlagStudioEnablePhoneAndTableDefault: "True", + DFFlagBallSocketMaxFrictionTorqueEnabled_PlaceFilter: + "True;4588303397", + DFFlagDisableDebuggerDisconnect: "True", + FFlagStudioInsertObjectStreamliningv2_Consolidated: "True", + DFFlagAllowLuauUpdates: "True", + DFFlagWarnTypeCheckOnRequire: "False", + DFFlagForceTypeCheckOnRequire: "True", + FFlagAddSidToGameJoinLoadTime: "True", + FFlagEnableConvertToTerrainBeta: "True", + FFlagSerializerIgnoresMD5: "True", + FFlagStudioDeviceManagerAddPreview: "true", + DFFlagPlayFabEmitTeleportEvents: "True", + FFlagPeekPreviewMenuClose: "True", + FFlagCatalogAnimationIdlePreview: "True", + DFFlagSimLDLPGSStatsBufferBreakdownReporting: "True", + FFlagAvatarExperienceOutfitRecommendations: "False", + FFlagRenderImproveStreaming: "False", + FFlagTerrainToolsImportImproveColorMapToggle: "True", + FFlagTerrainToolsRefactorAssetIdSelector2: "True", + FFlagTerrainToolsSmoothToolIgnoreWater: "True", + DFFlagEnable17sNotifications: "True", + FFlagPlayerListFixLeaderboardDisabledError: "True", + FIntNumberParalleNarrowPhaseThreads: "16", + FIntParalleNarrowPhaseThreads: "16", + FIntLDLPGSMaxParallelTasks: "16", + FFlagUnlockOnlyCountTheRecentGamesOnce: "True", + FFlagCheckInstanceIsInScope: "True", + FFlagFixModuleScriptBreakpointNotHitWhenParentScriptNotOpened2: + "True", + FFlagStudioFixStringHighlightingWithBackslashZ2: "True", + FFlagStudioRefactorStudioVerbsSavePublishDuplicateCode2: "True", + FFlagImmHandlerFixJapaneseAndKorean: "False", + FFlagReportInputMethodAnalytics: "False", + FFlagFixTextSelectionForHighDpi: "True", + FFlagStopCheckingFrontendProcessingInTextLayout: "True", + FFlagStudioUILibFixAssetTypeMap: "True", + FFlagEnableUIGradientEnabledProperty: "False", + FFlagStudioEnableVirtualKeyboardAnimation: "True", + DFFlagConsumePlatformNameOverAlternateName: "False", + FFlagSuperSmoothMouseWheelScrolling: "True", + DFIntReplicationVariantLimitHundredthPercent: "10000", + FStringEnableiCloudWebCredentialsBtIdsList: + "49593556386,49593556386,44219219422,49373021284,49849080647", + FIntSmoothMouseSpringFrequencyTenths: "45", + FFlagDefaultLocDelimFix: "True", + DFFlagPremiumUpsellRecheckPremium: "True", + FFlagPluginManagementFixRemovePlugins: "True", + FFlagLuaAppMorePageFixEventLoading: "True", + FFlagLuaAppMorePageMoveEventsToPosition6: "True", + FFlagLuaAppUseNewMorePage: "False", + DFFlagRenameDisplayNameToPlatformName: "True", + DFFlagVisualEngineTrackHeadless: "True", + DFFlagPartMassEnabled: "True", + DFFlagAnimatorApplyJointVelocities: "True", + FFlagLuauPreciseLocals: "True", + FFlagCoreScriptTopBarStartup: "False", + FFlagStudioInfoBar2: "True", + FFlagStudioInfoBarOnDraftCreation: "True", + FFlagLuauNewResume2: "True", + FFlagLuauNewDebugger: "True", + FFlagEnableLuaDraggersBetaFeature: "True", + FFlagXboxAppShellSiblingZIndex2: "True", + DFFlagFixPlayerGetTeamNeutral: "True", + FFlagPlayerListFixTeamUpdates: "True", + FStringNewTopBarForcedUserIds: + "959520514,656046844,146914182,975669155,344925094,247305679,956690111,1026207482,485327537,166540505,1300488959,1220631541,169775909,1498251806,401950003,751568948,2231221,7210880,931389991,1478764079,597663806,1298953044,1542933305,1182179679,1516442,1155027644,648897862", + FFlagEnableOverrideAssetCursorFix: "True", + FFlagStudioNewDirtyPublishWarningDialog: "True", + FFlagDataModelPatcherAlwaysRecordErrors: "True", + FFlagReplicatorInitializeSharedSchema: "True", + DFFlagReplicatorUseSharedSchema: "True", + FFlagStudioSandboxVerifyIntegrityOnInitialize: "True", + FFlagStudioScriptEditorEventsCrashFix: "True", + FFlagStudioReportSavePlaceTime: "True", + FFlagStudioFixSessionLengthCap: "True", + FFlagReportMechanismChangeDuringGameplayCount: "True", + DFFlagUseRefactoredRaycast3: "True", + DFFlagUseRefactoredHitTest2: "True", + DFFlagDebugForcePubKeyExchange: "True", + DFFlagNetworkAuditEn2: "True", + DFFlagPreventDeepTuples: "True", + DFFlagMoreNfPlayer: "True", + DFFlagReplicateAllowLuauOnly: "True", + DFFlagUseThresholdForMotor6DWakes2: "False", + FFlagStudioFixMeshPartPreview: "True", + FFlagStudioAssetPreviewTreeFix2: "True", + FFlagTruncateDevFrameworkHyperlinkText: "True", + FFlagWorldModelV4: "False", + FFlagAllowWorldModelCreationV2: "True", + FFlagWorldModelRefactorV3: "False", + DFFlagInstanceOrderCheck2: "True", + FFlagRenderEmitterRecomputeOnChange2: "False", + FFlagEnableReadingNewConvexDecompositionPath: "True", + FFlagStudioChangeMinimumSizeOfPublishWindow: "True", + FFlagStudioCreateNewGameRewritesName: "True", + FFlagLuaAppMediumTileInGameSearchPage: "True", + FIntLuaAppPercentRolloutFeaturedGameTileInSearch: "100", + FFlagLuaAppPreloadDataInProgressWait: "True", + FFlagLeaveStartingCoreScriptsToPlaceLauncher: "True", + FFlagFixNavigationToChatFromPN: "True", + FFlagDataModelPatcherBootstrapEnabled: "True", + FFlagRenderShadowDisableBottomClip: "True", + FFlagRenderMetalFixMaxFP16Samples: "True", + FFlagRenderHalfresShadowsVulkan: "True", + FFlagRenderGrassUpdateBudgetFix: "True", + FFlagRenderShadowmapNoMSAADepth: "True", + DFFlagBallSocketMaxFrictionTorqueEnabled2: "True", + FFlagJointInstanceRenderAdornCheck: "True", + FFlagLuaAppUseSessionization: "True", + FFlagLaunchAppWaitForABTestsInitialized: "True", + FFlagEnableAvatarExperienceLandingPageABTest3: "True", + FFlagAELandingPageAnalytics: "True", + FFlagPerformPurchaseNewBundleInfoTypeEnabled: "True", + FFlagEmotesMenuNewKeybinds: "True", + FFlagStudioPreventAccidentalTyposWhenHittingBreakpoint: "True", + FFlagLuaAppSendLogsToBacktrace: "True", + FFlagLuauFixSetMetatableType: "True", + FFlagUseNewSleepStage2: "True", + FStringFeature_NewGameJoinTeleport: "426;100", + DFFlagOnlyOneRightGrip_PlaceFilter: + "True;189707;4837595186;4586741827;3487742603;2747834912;4388574342", + FFlagStudioLuauWarningTelemetry2: "True", + DFIntParallelNarrowPhaseSerialCutoff: "50", + DFFlagPlayerPolicyGetDMFromService: "True", + DFFlagPlayerPolicyReportHttpFailureOnEveryAttempt: "True", + FFlagMobileUseApplicationDirectories: "True", + FFlagQtReadSystemProxy: "True", + FFlagLuaAppUseNewEventsPage: "True", + FFlagAvatarExperienceBackgroundThemeFix: "True", + DFFlagDeferTickleAssemblyWakes2: "True", + FFlagStudioFixDisappearingVirtualKeyboard: "True", + FFlagGfxPartInvalidationLimitToTime: "False", + FFlagGraphicsVulkanPreRotate: "False", + FFlagStudioSavePlaceAs: "False", + FFlagFixStartupGameLaunchFromLink: "True", + FFlagGameSettingsUseUILibraryCheckBox: "True", + FFlagGameSettingsUsesNewIconEndpoint: "True", + FFlagWebViewsUseLuaGameDetails2: "True", + FFlagLuauLookupImportedTypeCorrectly: "True", + FFlagStudioFixMultipleAssetsImportLogic: "True", + FFlagAvatarEditorAttachmentCameraFocus: "False", + FFlagRenderMsaaShadowsVulkan: "True", + FFlagLuauNewDebuggerGracefulYields: "True", + DFFlagUseThresholdForMotor6DWakes2_PlaceFilter: "False;679715583", + DFFlagAlwaysLogTcDisco: "True", + FFlagAvatarCatalogCloseSearchWhenAvatarIsTapped: "True", + DFFlagDeferTickleAssemblyWakes2_PlaceFilter: "False;441585237", + DFFlagVideoCleanUpTimeHandling: "True", + FFlagPassPointerActionsToGuiObjects: "True", + FFlagIgnoreActiveWhenProcessingPointerActions: "True", + FFlagScrollingFrameTrackpadSupport: "True", + FFlagPublicIKSolve: "True", + FFlagColor3ToHSVMethod: "True", + FFlagStudioServiceDrawConstraintsOnTop: "True", + FFlagEnableRaycastParams: "True", + FFlagEnableGizmoRaycast: "True", + FFlagFixAdvancedObjectsDragDropAssert: "True", + FFlagExtendSelectionBoxAdornee: "True", + FFlagStudioReportTCStatusWhenOpenPlace: "True", + FFlagStudioAddTCConnectTimeout: "True", + FFlagStudioFixTextBoxFocusAndToolTipCloseClashHang: "False", + DFFlagPhysicsServiceCorrectPlayerCountForTouch_PlaceFilter: + "True;4599786547;467050215", + DFFlagParallelSendTouches2_PlaceFilter: "True;4599786547", + FFlagAvatarEditorRecommendedUIBloxButton: "True", + FFlagStudioInsertObjectStreamliningv2_FeedbackImprovements: "True", + FStringStudioUrlAssetManager: + "https://web.archive.org/web/20200624170102/https://devforum.roblox.com/t/asset-manager-is-here-beta/517475", + FFlagStudioAddBulkImportView2: "True", + DFFlagAssetManagerPackageSymbolicLinkFix: "True", + DFFlagSimLDLProgramWorkspaceAndRSIStats: "True", + FFlagFixTreeViewFlatListDefault: "True", + FFlagStudioFixTreeViewForSquish: "True", + FFlagStudioFixUILibraryRequireForPreviewInToolbox: "True", + FFlagStudioFixAssetPreviewCloseButton: "True", + FFlagStudioFixTreeViewForFlatList: "True", + DFFlagCacheSoundStats: "True", + DFFlagReplicatorProcessPacketMicroprofilerCleanup: "True", + DFFlagUseUniqueProfilePorts: "True", + FFlagAvatarExperienceAnimationLookAroundFix: "True", + FFlagAvatarExperienceCatalogAnimationIdleFix: "True", + FFlagStudioAlwaysCompleteFunctionEnd: "True", + DFFlagOnlyOneRightGrip: "True", + FFlagGetTranslatorApiOnlyForPublishedGame: "True", + FFlagEnableAuthV2Login: "True", + DFFlagStudioRefactorSaveToRoblox: "True", + FFlagSkipFirstMechanismChangeReport: "True", + FFlagTerrainToolsTerrainBrushNotSingleton: "True", + FFlagTextViewStdReplace: "True", + FFlagAvatarExperienceUseUIBloxAlerts: "True", + FFlagPlayerListMorePerfImprovements: "False", + FFlagHumanoidCacheNameplate: "True", + FFlagStudioAllowCorePackagesAndStarterScriptDebugOnStart: "True", + FFlagLuauParseArgTypesRefactor: "True", + FFlagLuauSkinnyArrows: "True", + FFlagAppBridgeNewGameJoinTeleport: "False", + DFIntFriendshipEndpointMigrationRolloutPercentageV2: "100", + FFlagUGCValidateTags: "True", + FFlagUGCValidateMeshBounds: "False", + FFlagUGCValidateTextureSize: "True", + FFlagUGCValidateHandleSize: "False", + FFlagUGCValidateProperties: "True", + FFlagUGCAllowThumbnailCameraValue: "False", + FFlagUGCUseNewAssetTypeInfoSchema: "True", + FFlagEnableThumbnailCameraValue: "False", + FFlagRemoveLinkFromKinematicJoints2: "True", + FFlagStudioFixPluginWidgetEnabledSignal: "True", + FFlagStudioDebuggerLazyLoadVariables: "True", + FFlagStudioRewriteEmulatorWithMask2: "False", + DFIntGetFriendsOnlineEndpointMigrationRolloutPercentage: "100", + DFFlagVideoFixDeviceTuningForAudioOnlyFiles_PlaceFilter: + "True;4898980405", + FFlagCMSTabErrorIcon: "True", + FFlagStudioHashtagIsNotAComment: "True", + FFlagImmediatelyApplyFlagsButton: "True", + FFlagEnableFRMInSoloMode: "True", + FFlagUseInitialTerrainCacheForNonStreaming_PlaceFilter: + "True;2317712696", + DFFlagDisableLegacyPlayerJoin: "True", + FFlagMouseWheelEventSinkingPropagatesToGUI: "True", + FFlagMultiBinaryAssets: "True", + FFlagUserFixZoomInZoomOutDiscrepancy: "True", + FFlagClickDetectorUsesHRPForDistanceCalculation: "True", + FFlagDumbSpatialHash2: "True", + FFlagModifiedMinimumDistance: "True", + FFlagCullByDistanceToPOI: "True", + FFlagTopBarUseNewIcons: "True", + FFlagInGameMenuSmallerSideBar: "True", + FFlagTopBarBetterStateInit: "True", + DFFlagSimSolverBufferPurgeEnabled: "True", + DFFlagSimLDLProgramFlopCountStats: "True", + DFFlagRejectInvalidToolParentChanges2: "True", + FFlagUseBlake2BHashInSharedString: "False", + DFFlagCompletenessDeadParentRemovingChildFix: "True", + FFlagLuauFixConditionRepeatUntil: "True", + FFlagAvatarEditorShowEquippedItem: "True", + FFlagItemDetailsClosePeekViewFixes: "True", + FFlagPeekViewSinkInputTo3dView: "True", + FFlagRefactorPluginLoading3: "False", + FFlagParallelFetchInternalPermission: "True", + FFlagStudioEnableFileWatcherDelay: "True", + FFlagDataModelPatcherFixMajorVersionReporting: "True", + FFlagDragWeirdConstraints: "True", + FFlagDraggerUseModelCFrame: "True", + FFlagDontReselectSelectTool: "True", + FFlagLazyBoxSelect: "True", + FFlagTrackMouseDownState: "True", + FFlagTrackAttachmentBounds: "True", + FFlagDragOutsideWorkspace: "True", + FFlagMinScaleSizeFix: "True", + FFlagClearHoverBoxOnDelete: "True", + FFlagSinglePartAlwaysLocalSpace: "True", + FFlagContextMenuSupportLuaDraggers: "True", + FFlagEnableMotor6DTransformFixBetaFeature: "False", + FFlagXboxCheck2sv: "True", + FStringMotor6DTransformFixBetaUrl: + "https://web.archive.org/web/20200624170102/https://devforum.roblox.com/t/changes-to-motor6d-transform-coming-monday/526807", + DFFlagReplicatorKickReadEventStringDataAndVariantLimit: "False", + DFFlagReplicatorKickWriteEventStringDataAndVariantLimit: "False", + FFlagFixPlaybackWithEndFrameAtZero: "True", + FFlagUseInitialTerrainCacheForNonStreaming: "True", + DFFlagPubKeyExchange22: "False", + FFlagStudioFixVirtualKeyboardRect: "True", + FFlagAccelerateDuplicateCollisionFidelityReprocess: "True", + FFlagFixHACDHullPointLoss: "True", + FFlagPhysicsNewConvexDecompositionEnabled: "False", + FFlagStudioDraftsWidgetCommitButton: "True", + FFlagStudioMigrateGlobalToCJVInChina: "False", + FFlagStudioEnableEmergencyMessageDisplayV2: "True", + FFlagStudioEnableUrlLinkForEmergencyMessage: "True", + FFlagStudioCheckEmergencyMessageOnUserLogIn: "True", + FFlagStudioMoveMorpherEditorInsideGameSettings: "True", + FFlagStudioPopulateIntlInfo: "False", + FFlagStudioRestrictUiLibraryUsage: "True", + FFlagStudioUiLibraryErrorOnNilIncludes: "True", + FFlagStudioFixNullUniverseInGetResourceByCategory: "True", + FFlagTerrainToolsOnlyImportInEditMode: "True", + FFlagTerrainToolsFixMergeEmpty: "True", + FFlagTerrainToolsFixRegionEditorCleanup: "True", + FFlagPromptRobloxPurchaseEnabled: "True", + FFlagCanvasPosChangedOnStepElasticBounds: "True", + FFlagLuaUIBloxModalWindowAnchorPoint: "True", + FFlagCatalogSortAndFilters2: "True", + FFlagStudioQuitMessingWithHotKeys: "True", + FFlagFixTestServiceWithDebugging: "True", + FFlagStudioWrapScriptTextEditorInQPointer: "True", + FFlagStudioFixTCTimeoutReport: "True", + FFlagStudioAlignBlockEnderOuter: "True", + FFlagAvatarEditorClearTryOnFix: "True", + DFFlagUseTaskSchedulerThreadLimit: "True", + FFlagLuauCompileError: "True", + DFFlagDontClearTouchEventsDuringInterpolation: "True", + FFlagStudioEncodeEmergencyMessage: "True", + FFlagEnableiOSGameTimerFix2: "True", + FFlagMaterialGeneratorRefactorV1: "True", + FFlagEnableParamsBasedRaycast: "True", + DFFlagMotor6DTransformFix: "True", + DFFlagMotor6DParentNameEnabled: "True", + FFlagSystemAddressIsPeerId: "False", + FIntABTestRequestTimeoutMilliseconds: "5000", + DFFlagHumanoidInstanceGuard: "True", + DFIntRCCLoadPackageRetryTimeDelay: "0", + DFIntRCCLoadPackageRetryTimes: "4", + FFlagAppBridgeNewGameEvents: "True", + FFlagPremiumSettingsLabel: "True", + DFFlagDeprecateRakNetRand: "True", + FFlagDataStoreAdditionalMetricsEnabled: "True", + FFlagTerrainToolsUseDevFramework: "False", + DFFlagContactStepAsyncFaster: "True", + FFlagLuaAppReportConnectFailSeparately: "True", + FFlagLuaAppAEUseAppPolicyForCustomCostumeNames: "True", + FFlagLocalStorageQueuePendingFlush: "True", + FFlagEnableUIGradientEnabledProperty2: "True", + FFlagFixMakeFriendsNavCrash: "True", + FFlagStudioPublishMediatorFailedConnection: "True", + FFlagStudioCreateNewGameRewritesName2: "True", + FFlagStudioAssetManagerDisableTileOverlay: "True", + FFlagStudioAssetManagerBulkImportUniverseLoadError: "True", + DFFlagHandleFMODConstructorReturningNonNullInvalidPtr: "True", + FFlagFixDisplayScriptsFolderInAssetManager: "True", + FFlagVersionControlServiceScriptCollabEnabledByDefaultFalse: "True", + DFFlagFastVisuallyMovingCounters2: "False", + FFlagAdditionalExtJoinData: "True", + DFFlagEnableExtendedAnalytics: "True", + FFlagFixZeroNormalInDecompositeGeometry: "True", + FFlagScrollingFrameLayoutV3: "False", + FFlagDevConsoleUseZeroCanvasWidthLogOutput: "True", + FFlagScrollingFrameFixElasticBoundingDecrease: "True", + FFlagInGameMenuUseUIBloxButtons: "True", + FFlagFixLocalShutdownRequest: "False", + FFlagDedupePackagesInAssetManager: "True", + FFlagDetailedRequireErrorMsg: "True", + DFFlagPlayFabEventsV2: "True", + DFFlagPlayFabEmitMarketplaceEvents2: "True", + FFlagStudioLocalizationInGameSettingsEnabled: "False", + FFlagCatalogFullAvatarWifiIcon: "True", + FFlagDropToolCaptureMouse: "True", + FFlagMoverSwapWeld: "True", + FFlagScaleAlwaysAnchors: "True", + FFlagTreatToolAsModel: "True", + FFlagFixHoverBoxThickness: "True", + FFlagLuaDraggerIconBandaid: "True", + FFlagTakeAScreenshotOfThis: "True", + FFlagStudioCommandBarAlwaysEnabled: "True", + FFlagTerrainToolsTweakBrushPower: "True", + FFlagFixDevFrameworkDockWidgetRestore: "True", + FFlagStudioApplyFiltersToReplaceAll: "True", + FFlagScriptEditorEnableShowWhitespace: "True", + FFlagResellersListClickThrough: "True", + FFlagUseBlake2BHashInSharedString_PlaceFilter: "True;4939501074", + DFFlagHACDUseDistancePlaneChecks: "True", + DFFlagUseLockFreeVoronoiSimplexContainer: "True", + DFFlagVideoFixTextureInitialization: "True", + DFFlagVideoFixFrameSizing: "True", + FFlagEnableThumbnailConfiguration: "True", + FFlagUGCAllowThumbnailConfiguration: "True", + DFFlagVideoShowInitialFrameAsTexture2: "True", + DFFlagVideoFixDeviceTuningForAudioOnlyFiles: "True", + DFFlagVideoCleanUpAudioDeviceStartStop: "True", + FFlagPlayerListMorePerfImprovements2: "True", + FFlagMinimizePlayerListWhenTopBarOpen: "True", + FFlagXboxAppShellSiblingZIndex3: "True", + FFlagRobloxGuiSiblingZindexs2: "True", + FFlagFixRobloxInputBadArrayLengthChecksTheSagaContinues: "True", + FFlagStudioAddDebuggingFlowLocation: "True", + FFlagStudioStopRBXASSERTOnDeleteStandalonePlugin: "True", + FFlagStudioFixMultilineCommentEditingBehavior: "True", + DFFlagCreateServerPlayerSetsIdAndName: "True", + FIntAppConfigurationExpiry: "86400", + FFlagFixKeepingFolderAcquiredInStudioThroughTheFileSystem: "True", + FFlagStudioMigrateGlobalToCJVInChina2: "True", + FStringStudioEmergencyMessageV3: + "eyAicmVnaXN0cnlLZXkiOiAiRW1lcmdlbmN5TWVzc2FnZUZvckNoaW5lc2VTdHVkaW8iLCAicGxhdGZvcm1zIjogWyAiV2luZG93cyIgXSwgIm1lc3NhZ2UiOiB7ImVuIjogIlRvIGdldCB0aGUgYmVzdCBTdHVkaW8gZXhwZXJpZW5jZSBhbmQgcGVyZm9ybWFuY2UgaW4gQ2hpbmEgdXNlIHRoZSBDaGluZXNlIHZlcnNpb24gb2YgU3R1ZGlvIGF2YWlsYWJsZSBvbiA8YSBocmVmPWh0dHA6Ly93d3cucm9ibG94ZGV2LmNuPmh0dHA6Ly93d3cucm9ibG94ZGV2LmNuPC9hPiIsICJ6aF9DTiI6ICJcdTU5ODJcdTY3OWNcdTRmNjBcdTYwZjNcdTRmNTNcdTlhOGNcdTU3MjhcdTRlMmRcdTU2ZmRcdTY3MDBcdTdhMzNcdTViOWFcdTc2ODRcdTAwNTNcdTAwNzRcdTAwNzVcdTAwNjRcdTAwNjlcdTAwNmZcdTcyNDhcdTY3MmNcdWZmMGNcdThiZjdcdTRmNjBcdTUyNGRcdTVmODAgXHUwMDNjXHUwMDYxIFx1MDA2OFx1MDA3Mlx1MDA2NVx1MDA2Nlx1MDAzZFx1MDA2OFx1MDA3NFx1MDA3NFx1MDA3MFx1MDAzYVx1MDAyZlx1MDAyZlx1MDA3N1x1MDA3N1x1MDA3N1x1MDAyZVx1MDA3Mlx1MDA2Zlx1MDA2Mlx1MDA2Y1x1MDA2Zlx1MDA3OFx1MDA2NFx1MDA2NVx1MDA3Nlx1MDAyZVx1MDA2M1x1MDA2ZVx1MDAzZVx1MDA2OFx1MDA3NFx1MDA3NFx1MDA3MFx1MDAzYVx1MDAyZlx1MDAyZlx1MDA3N1x1MDA3N1x1MDA3N1x1MDAyZVx1MDA3Mlx1MDA2Zlx1MDA2Mlx1MDA2Y1x1MDA2Zlx1MDA3OFx1MDA2NFx1MDA2NVx1MDA3Nlx1MDAyZVx1MDA2M1x1MDA2ZVx1MDAzY1x1MDAyZlx1MDA2MVx1MDAzZSBcdTRlMGJcdThmN2RcdTdmNTdcdTVlMDNcdTRlNTBcdTYwMWRcdTcyNDggXHUwMDUzXHUwMDc0XHUwMDc1XHUwMDY0XHUwMDY5XHUwMDZmXHUzMDAyIn0sICJzaHV0ZG93biI6IGZhbHNlIH0=", + FFlagStudioCheckEmergencyMessageAtStart: "True", + FFlagRenderFixSun3TimesRender: "True", + FFlagRenderImproveStreaming2: "False", + FFlagCatalogSnFResetButtonFix: "True", + FFlagUGCFixModerationCheck: "True", + FFlagCatalogFilteredSearch: "True", + FFlagLuaAppFillScrollingFrameWithLoadMore2: "False", + FFlagAvatarExperienceOutfitRecommendations2: "False", + FFlagUserChatAddServerSideChecks2: "True", + FFlagToolboxTruncateOverrideAssetNames: "True", + DFFlagParallelSendTouches2: "True", + FFlagNoRedrawWindow: "True", + DFFlagHttpRbxApiServiceDontRetryOn429: "True", + FFlagCancelButtonTouchEventOnMouseDragOff: "True", + FFlagFixFirstPersonMouseCursorSnapping_CenterPos: "True", + FFlagFixFirstPersonMouseCursorSnapping_ForceCursor: "True", + FFlagFixFirstPersonMouseCursorSnapping_UWP: "True", + FFlagStudioStartServerIfNotStartedWhenStartingClient: "False", + DFFlagDontHandlePlayerReplicationDataAsSpecialCase: "False", + FFlagAvatarExperienceCharacterManagerOnSlowNetwork: "True", + FFlagAvatarImporterRoact: "True", + FFlagUseRebroadcastEventSharedQueue: "False", + FFlagMegaReplicatorInitializeTaskQueue: "True", + DFFlagMegaReplicatorParallelDisconnect: "True", + FFlagDisableFollowInGameMenu: "True", + FFlagEnableCorePackagesOverride: "True", + FFlagJIRA_RIDE_192: "True", + FFlagStudioPopulateInsertObjectMenuAfterLogin: "True", + FFlagJIRA_RIDE_630: "True", + FFlagShowWarningsForUnregisteredOptions: "True", + FFlagStudioAllowCoreScriptReloads2: "True", + DFFlagStudioReportPackageRequestWebCopyError: "True", + FFlagReportStudioPublishSaveFailure: "True", + FFlagWorldModelV5: "True", + FFlagWorldModelCatchInsertRawErrors: "True", + FFlagWorldModelRefactorV4: "True", + FFlagGetScreenPositionOffsetCamPtrGuard: "True", + FFlagEnableAvatarExperienceLandingPageForAll: "True", + FFlagIgnoreLocaleInJoinScriptData: "True", + FFlagRemoveInGameFollowingEvents: "True", + FFlagRemoveInGameFollowingServer: "True", + FFlagFixPluginInvoke: "True", + DFFlagMegaReplicatorDisconnectSwapAndPop: "False", + FFlagCreateAndUpdateDataReplicationCache2: "False", + DFFlagSupportJoinDataItemV2ii: "False", + FFlagNoCostumeSaveButtonFix: "True", + FFlagLuaAppUseUIBloxToasts2: "True", + FFlagStandardizeVector3Case: "True", + DFIntRCCFailedToEvictPlayerInfluxHundrethsPercentage: "100", + FFlagGameSettingsPreventClosingDialogWhileSaveInProgress: "True", + FFlagEnableBackgroundModeWhenInactive: "False", + DFFlagUseNewTelegrafPriorityTag: "True", + DFIntTelegrafPriorityThrottleHundredthsPercent: "500", + DFFlagUseNewTelegrafMethod: "True", + DFFlagEnablePerfDataMemoryCollection: "True", + DFIntPerfDataGlobalThrottleHundredthsPercent: "10000", + DFStringPerfFilterPlaceId: "4599786547", + DFStringPerfTelegrafAddress: "100.20.191.133", + FFlagLuaAppChatPageWaitUntilUserABTestsInitialized: "True", + FFlagLuaChatShareGameToChatFromChatABTestEnabled: "True", + FFlagLuaChatPlayTogetherABTestEnabled: "True", + FFlagResetPluginMouseIcon: "False", + FFlagSetInsertPoint: "True", + FFlagStudioTrimBeforeToggleComment: "True", + FFlagStudioDontMoveCursorToEofWhenOpening: "True", + FFlagStudioFixProjectConfigForStartInPlayMode: "True", + FFlagAllowReturnToConfirmRespawnCharacter: "True", + DFFlagPhysicsPacketCountUnderLimit: "False", + FFlagAvatarShopFixBlankResellersPage2: "True", + FFlagAvatarEditorAttachmentCameraFocus2: "True", + FFlagUserDontAdjustSensitvityForPortrait: "True", + FFlagLuaAppAddGameSearchSessions: "True", + FFlagSystemAddressIsPeerId2: "True", + FFlagPlaceLauncherCollectOnMainThread: "True", + FFlagRenderDXT_KTX: "True", + FFlagStudioEnableCSGv2SmoothingBeta: "False", + FFlagLuaAppABTestSearchResultsQ2DGameEmphasis: "True", + FFlagLuaAppABTestUseSearchResultsQ2DHideBadGames: "True", + FFlagAppConfigurationEnableMultiBehaviorSupport2: "False", + FFlagLuaChatAliasesSizingFixAgainV1: "False", + DFFlagPhysicsSenderNoEmptyPackets: "True", + DFFlagLuaFastToFloat: "True", + FFlagLuaTaggedUdataGc: "True", + FFlagViewSelectorLightUpdate: "True", + DFIntDetailedBandwidthStatsInfluxHundrethsPercentage: "10000", + DFFlagDetailedBandwidthStatsInflux_PlaceFilter: "true;4599786547", + DFIntDetailedBandwidthStatsPlayerLotteryHundrethsPercentage_PlaceFilter: + "10000;4599786547", + FFlagFixGettingAssetOwnerNameInAssetPreview: "True", + FFlagAppUsesAutomaticQualityLevel: "True", + FFlagDepthOfField: "True", + FFlagDontLoadCoreScriptsForEditDM: "True", + FFlagStudioMuteOnlyOnUnfocus: "True", + FFlagStudioRewriteEmulatorWithMask3: "True", + FFlagUseCanManageForDeveloperIconServer: "False", + FFlagGraphicsMetalCompactGeometry2: "True", + FFlagTopBarHightightIconsOnHover: "True", + FFlagTopBarCloseContextMenuWhenHotkeysUsed: "True", + FFlagStudioUseNewAnimationImportExportFlow: "True", + FFlagTapAwayToCloseBackpack: "True", + FFlagTopBarEscapeCloseMenu: "True", + FFlagAddCopyIDToResultPage: "True", + FFlagStudioEnableResume3: "True", + FFlagStudioMacOverrideStepIntoShortcut: "True", + FFlagScrollingFrameLayoutV3_2: "True", + FFlagEnableFavoritesForAssetPreviewInAssetManager: "True", + FFlagLuaCatalogFixRemoveSellToastIcon: "True", + FFlagLuaAppFixToastNotchOverlap: "True", + FFlagStudioToolboxShowNoPluginResultsDetail: "False", + FFlagStudioAssetCopySaleStatusFix: "True", + FFlagFixAssetUploadFailedColor: "True", + FStringRENAME_ABTEST_AllUsers_GameSearch_Q2DRankingEmphasisHideBad: + "AllUsers.GameSearch.Q2DRankingEmphasisHideBadV2", + FFlagLuaAppGameSearchQ2DEvents: "True", + FFlagSimEnablePreciseConvexDecomposition: "True", + FStringLuaDraggersBetaUrl: + "https://web.archive.org/web/20200624170102/https://devforum.roblox.com/t/say-hello-to-the-new-lua-dragger-beta/504815", + FFlagPlayTogetherFromGameCard: "True", + FFlagSupportDeathTypeClient: "True", + FFlagSupportDeathTypeServer: "True", + DFFlagWaitForChildThrowNan: "True", + DFFlagWaitForChildNoInfiniteTimerTask: "True", + FFlagLuaAppGameImpressionsAnalyticsV2: "True", + DFFlagEveryJointIsManualJoint: "True", + FFlagLuaAppGameSearchImpressionsEvent: "True", + FFlagInternalGameLocaleEnabled: "True", + FFlagUseCanManageForDeveloperIconClient: "False", + FFlagRemoveAssetUploadUrlSuffix: "True", + FFlagEnableOverrideAssetGroupCreationApi: "True", + FFlagLuaPublishFlowFixCreateButtonInChinese: "True", + FFlagUserHandleChatHotKeyWithContextActionService_PlaceFilter: + "True;4738806136", + FFlagRenderSurfaceAppearance_v2_PlaceFilter: "True;5004798193", + FFlagTerrainOpenCloseMetrics: "True", + FFlagTerrainToolTabMetrics: "True", + FFlagStudioServiceHoverInstance: "True", + FFlagOnlyReadyHover: "True", + FFlagFFlagFixMenuIcons: "True", + DFFlagUseNewPostAuthenticationRequest: "True", + DFFlagMicroprofileGroupAtLastStack: "True", + FFlagRenderSurfaceAppearance_v1_ColorMapOnly_PlaceFilter: + "True;5004798193", + FFlagRenderAtmosphere: "True", + FFlagCMSConsolidateAssetTypeInfo: "True", + FFlagAssetConfigDarkerScrollBar: "True", + FFlagUGCRemoveLearnMoreText: "True", + FFlagToolboxUseNewAssetType: "True", + FFlagStudioResizeEmulationDeviceWriteLock: "True", + FFlagLuaAppRefreshScrollingFrameRefactor3: "False", + FFlagStopDriveBySwipesOnScrollingFrames: "True", + DFFlagAdminServerLogs: "True", + FFlagPlayerDisplayName: "True", + FFlagUserServiceWhiteListV2: "True", + FFlagUserServiceEnabledV2: "True", + FFlagTopBarFixCloseButtonMobile: "True", + FFlagHideTopBarWhenInspectOpen: "True", + FFlagNewInGameTopBarForEveryone: "True", + FFlagABTestLoadingTimeStats: "True", + FStringStudioUrlCSGv2SmoothingBeta: + "https://web.archive.org/web/20200624170102/https://devforum.roblox.com/t/introducing-smoothingangle-property-for-partoperation/552810", + FFlagUseRebroadcastEventSharedQueue2: "True", + DFFlagGCNotAlwaysMemory: "True", + DFIntStreamingMaxTargetPercentage_PlaceFilter: "200;4599786547", + FFlagHandleCanceledToolboxDrag: "True", + DFFlagTranslatorApiCloudAssetLoadingFix: "True", + FFlagFixPackageDragSlow: "True", + FFlagStudioCollectLocationType: "True", + DFFlagReportBaseUrlForHttpAnalytics: "True", + DFFlagDisablePackageRequestCache: "True", + DFFlagStudioDelayModificationCheck: "True", + DFFlagInitiateMultipleParallelConnection: "True", + FFlagStudioSupportNilContextServices: "True", + FFlagStudioGameSettingsResetStoreAction: "False", + FFlagMoveViaSelectionCenter: "True", + FFlagStudioMinorFixesForAssetPreview: "True", + FFlagFixGetAssetTypeErrorHandling: "True", + DFFlagEnableGetPlayFabTitleFromService: "True", + DFFlagEnableAnalyticsServiceSetApiKeyEventSteam: "True", + DFIntGetPlayFabTitleFromServiceRolloutPercentage: "100", + FFlagCMSPremiumBenefitsLink: "False", + FFlagStudioBetaFeaturesHideInfoButtonForMissingUrls: "True", + FFlagStudioFixCrashInSendMockKeyboardNotificationsToLua: "true", + FFlagRefactorPluginLoading4: "False", + FFlagFuzzyTerrainNormal: "True", + FFlagHandleFlakeyMouseEvents: "True", + FFlagImprovedHandleParams: "False", + DFIntLoadPackageFirstTimeDelayMs: "0", + FFlagScriptEditorEnableRulers: "True", + FFlagRenderImproveStreaming3: "True", + FFlagNavHighlightUseUIBloxAnimatedItem: "True", + FFlagAvatarExpereienceUseShimmerPanel: "True", + FFlagAvatarExpereienceReplaceFitScrollingFrame: "True", + FFlagSellPageUseVerticalScrollView: "True", + DFFlagHumanoidDisplayNameEnabled: "True", + FFlagAvatarExperienceBodySizeIndicator: "True", + FFlagStudioAssetManagerDisableMagicCharacters: "True", + FFlagAssetManagerContextMenuActionFixes: "True", + DFFlagUseTimeoutMessage: "True", + DFFlagEnsureNullCheckOnDisconnect: "True", + DIntPackagePermissionPullingIntervalInSeconds: "10", + FFlagFixAssetUploadName: "True", + FFlagAssetConfigUseItemConfig: "True", + DFFlagRemovePackageSymbolicLinkKId: "True", + FFlagUserHandleChatHotKeyWithContextActionService: "False", + FFlagDataModelPatcherReportToInflux: "True", + FFlagLocalStorageDisablePathChangeChecks: "True", + FFlagLuaAppUseLoadableEventTile: "True", + FFlagPlayerListUseDisplayNameChina: "True", + FFlagStudioSavePlaceAs2: "True", + FFlagStudioPublishMediatorFailedConnection2: "True", + DFFlagVideoLoadAssetsInStudioEdit: "True", + FFlagLuauStringFastcall: "True", + DFFlagLuauFasterUnpack: "True", + FFlagScriptContextLastResume: "True", + FFlagLuauNoGcDebt: "True", + FFlagRenderTerrainGrassNoSpecular2: "False", + DFFlagSupportIPv6MappedIPv4ForFloodCheck: "True", + DFFlagVideoDoNotResetTimePositionOnStop: "True", + FFlagNavigationTabBarVisibilityWithBack: "False", + FFlagLuaAppSearchBarNoWrap: "True", + FFlagStudioCloudEditShowErrorCode: "True", + FFlagLuaAppDisplayNamesEnabled: "True", + FIntMaxClients: "1023", + FFlagUseInitialTerrainCache: "False", + FFlagStudioThunkWithArgsMiddleware: "True", + FFlagLuaCalculateJumpHeight: "True", + DFFlagIPV6RobloxStudioCleanUp1: "True", + FFlagAllowTextEntryToTakeSizeAndPositionProp: "True", + FFlagStudioRestoreWatchTab: "True", + FFlagRenderCorrectLinearUnderWaterFog: "True", + FFlagRenderAtmosphereRefreshSky: "True", + FFlagRenderAtmosphereRefreshSky2: "True", + FFlagGameSettingsFixNameWhitespace: "True", + DFFlagEnableDateTimeInReplicator: "True", + FFlagEnableDateTimeInNetworkValueFormat: "True", + FFlagUseDateTimeType3: "True", + FFlagUseCorrectEndpointForPlaceVersion: "True", + FFlagStudioCloudEditLogErrorCode: "True", + FFlagAddHWModelForMac: "True", + FFlagFixAssetManagerInsertWithLocation: "True", + FFlagLuauCoroutineC: "True", + FFlagHandleNoRotateTarget: "True", + FFlagStudioHideStartPageUrlLinksCJV: "True", + FFlagStudioShowUserFacingWebsiteCJV: "True", + DFIntVideoImageReductionFactor: "1", + DFFlagHttpServiceBetterUserAgent: "False", + FFlagStudioCloudEditFixErrorCode: "True", + FFlagHttpServiceNeverCache: "True", + FFlagPolicyServiceStoreHttpResponseToLocalStorage: "True", + FFlagEventIngestServiceRefactor: "True", + FFlagLuaAppSidePaddingInChildren: "False", + FFlagAvatarExperienceRemoveTempRouterFix: "True", + FFlagPlayerListFixTitleBarTransparency: "True", + FFlagStudioTransferBreakpointsFromBothPlayDMsToEditMode: "True", + FFlagStudioUseInternalScriptDescendantForAllCases: "True", + DFFlagFixAnalyticsServiceSetApiKey: "True", + DFFlagPolicyServiceLuaApiAdaptiveToHttpResponse: "True", + DFFlagPlayerPolicyReportHttpFailureToInfluxOnEveryAttempt: "True", + DFFlagMeshLODVertexNormalFix: "True", + FFlagSimBulletContactInitilizesConnector: "False", + FFlagSimSolverOptimizedIslandizer2: "False", + FFlagPackageFixDiffRootNameChange: "True", + DFFlagFixPackageModificationCheckForPendingState: "True", + DFFlagStudioDelayPackageAutoUpdate: "True", + DFIntPackageAutoUpdateDelayMs: "0", + DFFlagEphemeralCounterInfluxReportingEnabled: "True", + DFIntEphemeralCounterInfluxReportingThrottleHundredthsPercent: + "10000", + DFIntEphemeralCounterInfluxReportingPriorityHundredthsPercent: + "10000", + DFFlagEphemeralStatsInfluxReportingEnabled: "True", + DFIntEphemeralStatsInfluxReportingThrottleHundredthsPercent: "50", + DFIntEphemeralStatsInfluxReportingPriorityHundredthsPercent: + "10000", + DFFlagInfluxEnableTypeEventTag: "True", + DFFlagFixClientNetworkMetricsForParallelConnection: "True", + FFlagVerifySliceCenterOnRenderNotSet: "True", + FFlagFixInGameMenuMissingAssets: "True", + FFlagPlayerListFixContextMenuFlashing: "True", + FFlagFixActivatedEventDoubleFire: "True", + DFFlagStreamingPrefetch: "True", + FFlagRenderFixGrassUpdates: "True", + FStringFeature_NewGameJoinInstance: "431;100", + DFFlagFreeFmodGroupIfUnusuable: "True", + DFFlagGetContextFreeDSPs: "True", + DFFlagGetContextFreeSoundGroup: "True", + DFFlagFreeDSPsIfUnusable: "True", + FFlagLuauRequireTracer: "True", + FFlagStudioLuauWarningTelemetry4: "True", + FFlagStudioLSP_V1_1: "False", + FFlagAppConfigurationEnableMultiBehaviorSupport3: "True", + FFlagStudioLuauWarningTelemetry3: "True", + FFlagDataModelPatcherReportToInflux2: "True", + DFIntDataModelPatcherFunnelInfluxHundredthsPercentage: "1000", + DFIntDataModelPatcherErrorInfluxHundredthsPercentage: "10000", + DFIntDataModelPatcherFunnelInfluxPriorityHundredthsPercentage: + "10000", + DFIntDataModelPatcherErrorInfluxPriorityHundredthsPercentage: + "10000", + FFlagUseBlake2BHashInSharedString2: "True", + DFFlagVideoFixSeekingBeyondTheEnd: "True", + DFFlagVideoFixTextureLeak: "True", + FFlagFixDraggerCursors: "True", + FFlagLuaDraggerTerrainFixes: "True", + FFlagDisallowFloatingPointErrorMove: "True", + FFlagHandleOddNesting: "True", + DFFlagVideoFixWebmParsing: "True", + DFFlagVideoCacheTimePosition: "True", + DFFlagVideoFixServerTimekeeping: "True", + FFlagImprovedHandleParams2: "True", + FFlagMinCursorChange: "True", + FFlagRetainHoverPart: "True", + FFlagStudioDeviceManagerDesignTweak: "True", + DFFlagInstanceGuard: "True", + FFlagShowAssetConfigReasons2: "False", + DFIntStudioLuauIceInfluxHundredthsPercentage: "10000", + DFIntStudioLuauWarningInfluxHundredthsPercentage: "10000", + FFlagFixInspectAndBuyGamepad: "True", + FFlagStudioTestServiceRunStateRecovery: "True", + FFlagLuaAppGridViewRemoveStateDelay: "True", + FFlagStudioRemoveExtraFindAction: "True", + FFlagABTestResponseCounter: "True", + FFlagProtectedStringUsesSharedString2: "True", + FFlagStudioFixHashFromFileContentsLeak: "True", + FFlagStudioShowCursorWhenSwitchingScripts: "True", + FFlagUseCentralTime: "True", + FFlagABTestControllerListener: "False", + DFFlagFixUncaughtModuleContentSetParentException: "True", + DFFlagStudioAddIsPackageAtTheEndOfRequestURL: "True", + FFlagStudioSupportLinkForChina: "True", + DFFlagUseSharedStringForScriptReplication2: "False", + FFlagWaterReflectionWaveFix: "True", + FFlagSortsAndFiltersFitComponentFix: "True", + FFlagFastClusterCachePrimitive: "True", + FFlagStudioGameSettingsNewUseRoactRodux: "True", + FFlagStudioGameSettingsResetStoreAction2: "True", + FFlagStudioConvertGameSettingsToDevFramework: "True", + FFlagStudioStandaloneGameMetadata: "True", + FFlagStudioUnrestrictPluginGuiService: "True", + FFlagPublishPlaceSupportUnicodeTextLength: "True", + DFFlagHttpTlsVerificationErrorCode: "True", + DFFlagHttpServiceTlsProbeRetry: "True", + DFIntHttpServiceTransportFailureInfluxHundrethsPercentage: "10000", + FFlagStudioFixQPointerForTooltipView: "True", + DFFlagStreamingAddAncestors2: "False", + DFFlagReplicatorStreamingReportAncestorsSentWithoutAllDescendants: + "False", + FFlagStudioNewTableOutputWidgetSourceStr2: "True", + DFFlagStreamingAddAncestors2_PlaceFilter: + "True;4923553838;4923599624", + FFlagLuaAppQ2DUXAdjustmentsBugfixes: "True", + FFlagLuaAppUseNewGameTileGridStyle: "False", + FFlagAEFitComponentMigration: "False", + FFlagStudioEnablePVHBetaFeature: "True", + FStringStudioUrlPlaceVersionHistory: + "https://web.archive.org/web/20200624170102/https://devforum.roblox.com/t/beta-place-version-history-in-studio/607597", + FStringStudioPlaceVersionHistoryHelpLink: + "https://web.archive.org/web/20200624170102/https://devforum.roblox.com/t/beta-place-version-history-in-studio/607597", + FFlagLuauCompoundAssignment: "True", + FFlagLuauCompactLineInfo: "True", + FFlagAvatarExperienceUseContextualMenu: "True", + FFlagStudioFixFlatTerrainDefaultSaveLocation: "True", + FFlagEnableUIBloxIcons: "True", + FFlagRenderSuperLQTerrainGLES2: "True", + DFFlagHttpServiceTlsProbe: "True", + DFIntHttpServiceTlsProbePercent: "10", + DFFlagDataStoreMoreInfoForVagueError: "True", + FFlagFixShadowBiasYetAgain: "True", + FFlagRenderShadowmapBatchUpdates: "True", + FFlagLuaAppSidePaddingInChildren2: "True", + FFlagLocalizationToolsPluginV3Enabled: "True", + FFlagLuaAppsLocalizationToolsDeprecated: "True", + FFlagEnableLuaStartupManager: "False", + DFIntHttpServiceTlsProbeInfluxHundrethsPercentage: "10000", + FFlagHideOneChildTreeviewButton: "False", + FFlagCLIAPPBRIDGE414: "True", + FFlagAvatarExperienceUseNewCharacterManager: "False", + FFlagJIRA_RIDE_697: "False", + FFlagJIRA_RIDE_711: "False", + FFlagJIRA_RIDE_785: "True", + FFlagXboxAppBridgeRewrite5: "False", + DFIntJoinInfluxHundredthsPercentage_PlaceFilter: "10000;5064251723", + FFlagCoreScriptsUseRoactRoduxNewConnectionOrder: "True", + FFlagLuaAppUseRoactRoduxNewConnectionOrder: "True", + FFlagXboxUseRoactRoduxNewConnectionOrder: "True", + FFlagFixBlockedListInitLogic: "True", + FFlagFixGamepadOldMenuOpening: "True", + FFlagCoreScriptsNoHotKeysWhenMenuOpen: "True", + FFlagLuauNativeTypeof: "True", + FFlagLuauTypeofFastcall: "True", + DFFlagCantSendTheseAnymore: "True", + FFlagStudioLSP_V1_2: "True", + FFlagGraphicsDisableMetalIntel: "True", + FFlagStudioReportOpenPlaceTime: "True", + FStringStudioReportOpenPlaceTimeFilter: "95206881", + FFlagStudioCloudEditAddReadyAnalytics: "True", + FFlagMegaReplicatorSharedClassInfo: "True", + FFlagConnectErrorHandlerInLoadingScript: "True", + DFFlagFixPrintJoinSizeBreakdown: "True", + DFFlagOnlyReadPlayerOsOnServer: "True", + DFLogClientRecvFromRaknet: "10", + DFFlagDebugRakPeerReceive: "True", + DFIntDebugRakPeerReceiveAfterSeconds: "10", + DFFlagDebugRakPeerReceiveCountDistributedPackets: "True", + DFIntHttpClientExternalTlsPeerVerificationFailHundrethsPercentage: + "10000", + FFlagQueryFrustumAndUpdateRange: "False", + FFlagInterpolateCullDistance: "False", + DFFlagCSGOperationStatisticsGA: "False", + DFFlagCSGOperationsRespectsCollisionFidelityAtCreation: "True", + FFlagImmHandlerFixJapaneseAndKorean_PlaceFilter: "False; 252877716", + FFlagLuauEndMismatch: "True", + FFlagRewriteScriptDocumentChangeEvent: "True", + FFlagScriptEditorEnableMoveLinesCmd: "True", + FFlagBatchBoundsChanged: "True", + FFlagScaleUnionsUniformly: "True", + FFlagDraggerBasisRotate: "True", + FFlagLuaDraggerHandleScale: "True", + FFlagAllowDragContinuation: "True", + FFlagInventoryApiInHttpWhitelist: "True", + DFStringHttpRbxApi17sAllowedHosts: + "chat.roblox.com;presence.roblox.com;avatar.roblox.com;catalog.roblox.com;inventory.roblox.com", + FFlagLuaDraggerPerf: "True", + FFlagUseBulkMove: "True", + DFFlagStreamingDontGCLocal: "True", + DFFlagGetFriendsOnlineCachingEnabled: "True", + DFFlagSimSolverLargeWorkloadReporting: "True", + FFlagAddCountryCodeToUserModel: "True", + FFlagToolboxUseNewPluginEndpoint: "False", + DFFlagDataStoreNoSerializedDataInCache_PlaceFilter: + "True;1052132952", + FFlagRenderTerrainGrassNoSpecular3: "False", + FFlagLuaAppGameSortGridABTestEnabledV2: "True", + FStringLuaAppGameSortGridABTestJSONV2: + '{"ABTestData" : { "Control" : {"GridEnabled" : false, "GridRows" : 0, "UseGridMediumTile" : false }, "Variation1" : { "GridEnabled" : false, "GridRows" : 0, "UseGridMediumTile" : false }, "Variation2" : { "GridEnabled" : true, "GridRows" : 2, "UseGridMediumTile" : false, "ExcludedSorts" : ["MyRecent"], "SeeAllButtonType" : 1 }, "Variation3" : { "GridEnabled" : true, "GridRows" : 2, "UseGridMediumTile" : false, "ExcludedSorts" : ["MyRecent"], "SeeAllButtonType" : 2 }, "Variation4" : { "GridEnabled" : true, "GridRows" : 2, "UseGridMediumTile" : false, "ExcludedSorts" : ["MyRecent"], "SeeAllButtonType" : 3 } }}', + FFlagLoadCoreScriptsBeforeLock: "True", + FFlagSimSolverOptimizedIslandizer3: "False", + FFlagSupportContentIdDictionaryRemoval: "True", + FFlagStudioEnablePVHBetaFeature2: "True", + FFlagFixKeyframeDetectionV2: "True", + FFlagStudioHideStandalonePluginScripts: "True", + FFlagStudioFixTimingOnTeamCreateRestart: "True", + FFlagEnableStudioProfiler: "True", + FFlagAssetManagerFixAssetRemoval: "True", + DFFlagPlayHereFix: "True", + FFlagSingleSurfaceAppMarshallerDoTeleport: "True", + FFlagRenderMarkDirtyOnlyRenderableChunks: "True", + FFlagStudioFetchABTestForLuaApp: "True", + FFlagFixTopBarOverLoadingScreen: "True", + FFlagUseCanManageForDeveloperIconServer2: "True", + DFFlagStudioHttpServiceProtectLegacyPathsForPlugins: "False", + FFlagStudioServiceDraggerSolveConstraints: "True", + FFlagFixOverriddenDragAssert: "True", + FFlagAdultConfirmationEnabled: "False", + FFlagAvatarExperienceRunSceneFix: "True", + DFFlagDontHandlePlayerReplicationDataAsSpecialCase2: "True", + FFlagJoinDataCacheOptimizeBlobCount: "True", + FFlagJoinDataCacheCompressionImprovement: "True", + FFlagArePartsTouchingOthers: "True", + DFFlagDataStoreNoSerializedDataInCache: "False", + FFlagCreateAndUpdateDataReplicationCache3: "True", + DFFlagAnalyticsServiceMonitoring2: "True", + FFlagScriptEditorRCityTelemetry: "True", + FFlagRenderGlassTintLOD2FogFix: "True", + FFlagRenderFixIncompleteMipChain: "True", + FFlagAssetManagerLocalizationUpdate: "True", + FFlagGameSettingsOnlyInPublishedGames: "True", + DFFlagStreamingGCJobFixCharacterCheck: "True", + FFlagAEReplaceFitImageTextFrame: "True", + FFlagTopBarNewGamepadMenu_PlaceFilter: "True;2567750478", + FFlagAddMissingConsoleAgreementTextInGameSettings: "True", + FFlagFixFitToContentOnCloseError: "True", + FFlagFixTextChangedFromEmptyForTextEntry: "True", + DFFlagTeamCreatePublishToEventIngest: "True", + FFlagStudioLoadCoreScriptsFromModel: "True", + DFFlagEnableHumanoidControllerSubstepping_PlaceFilter: + "True;4306999063", + DFFlagEnableLowerFrequencyWorldSteps_PlaceFilter: "True;4306999063", + FFlagUseSteppingParamsInsteadOfConstants_PlaceFilter: + "True;4306999063", + FFlagDebugDontForceCollisionsOnHumanoidParts_PlaceFilter: + "True;4306999063", + DFIntDebugDefaultTargetWorldStepsPerFrame_PlaceFilter: + "1;4306999063", + FFlagToolboxHideSearchForRecent: "True", + FFlagStudioEnableBFSupportPluginDebugging: "True", + FFlagLanguageServiceDoesntDirtyDataModel: "True", + FFlagRefactorPluginLoading5: "True", + FFlagSimDeprecateConstraintLegacyAngularVelocity: "True", + FFlagResetPluginMouseIcon2: "True", + FFlagStudioServiceHoverInstanceFix: "True", + FFlagSelectWeldConstraints: "True", + FFlagEnableUICornerBetaFeature: "True", + FFlagFixInGameMenuSliderClamping: "True", + FFlagCameraSensitivityAllowGranularKeyboardInput: "True", + FFlagStudioPluginManagerInterface: "True", + FFlagStudioTeleportServiceSanitize: "True", + FFlagWrappedDevFrameworkLinkText: "True", + FFlagUseCanManageForDeveloperIconClient2: "True", + FFlagFixBadNormal: "True", + FFlagFrameStepJointsParallel: "False", + FFlagStudioSupportUploadGroupAnimations: "True", + SFFlagTerrainRaycastsRespectCollisionGroups: "True", + FFlagStudioTimeStampFix: "True", + DFFlagRaknetBandwidthMetricsReportValidPing: "False", + DFFlagRaknetBandwidthMetricsV2: "True", + DFIntRaknetBandwidthInfluxHundredthsPercentageV2: "1000", + DFFlagRaknetBandwidthAddPhyPacketsLossPercent: "True", + DFIntRaknetBandwidthPingSendEveryXSeconds: "300", + FFlagDeveloperEventIngestVerifyFeature_PlaceFilter: + "True;3182856628", + DFIntAnalyticsServiceEventIngestSwitchPercentage_PlaceFilter: + "100;3182856628", + DFFlagEnableAnalyticsSeriveEventIngest_PlaceFilter: + "True;3182856628", + FFlagABTestSystemShutoff: "False", + FFlagStudioFixUndoAfterInsertByDrag: "True", + FFlagFixOverrideAssetGroupPlugins: "True", + FFlagStudioFixGroupCreatorInfo: "False", + FFlagFixHorizontalScrollBarInControlsPage: "True", + FFlagScrollInOnlyDirectionAvailable: "True", + FFlagLuaAppEventsWithSession: "True", + FFlagLuauBuiltinOs: "True", + FFlagAllowGamepadConnectionEventsWhenNotFocused: "True", + FFlagResetMobileGamepadsOnDataModelLoad: "True", + FFlagAllowMobileGamepadCursor: "True", + FFlagFixGamepadR3LastInputType: "True", + FFlagEnableR3ButtonIOS: "True", + FFlagFixGamepadMenuButtonIOS: "True", + FFlagFixCaseSensitiveAssetNames: "True", + FFlagFixGamepadCursorIdlePosition: "True", + TreatAndroidInputSourceAsBitmask: "True", + DFFlagCSGv2NormalSmoothing: "True", + FFlagABTestControllerListener2: "True", + FFlagFixOutBoundAccessInBoxMappedMesh: "False", + FFlagLuaAppGameDetailsMorePWF: "True", + FFlagLuaAppGameDetailsPlayWithFriendsABTest: "True", + DFFlagEnableTelegrafPriorityTag: "True", + FFlagStudioRemoveStudioInfluxHundredthsPercentage: "True", + FFlagStudioAddDistTypeToUserAgent: "True", + FFlagStudioExternalLoginEnabled: "False", + FFlagStudioUserAgreementCheckEnabled: "False", + FFlagStudioAddReloadOptionInLoginDialog: "False", + FFlagMakePluginsActivatableInScripts: "True", + FFlagLuaPremiumCatalogIGIAB: "True", + FFlagLuaPremiumCatalogTileFix: "True", + FFlagIAPProductReducerV2: "True", + FFlagLuaAppNativePurchase: "True", + FFlagLuaAppBulletSizeFix: "True", + FFlagLuaFixEconomyCreatorStatsUrl: "True", + FFlagLuaAppPremiumUpsellCancelFix: "True", + FFlagLuaAppPeekViewHeightChangeFix: "True", + FFlagIGPPPremiumPrice: "False", + FFlagPremiumCatalogAESort: "True", + FFlagLuaPremiumCatalogAEV2: "True", + FFlagLuaPremiumCatalogIGPP: "True", + DFFlagEnableSoapMicroprofiles: "True", + FFlagLuaAppUseNewAccordion: "True", + FFlagLuaAppUseNewLoadableImage: "True", + DFFlagSupportEncryptedAssets: "False", + DFFlagPerformAssetDecryptionOnAnAsyncTask: "True", + FFlagDisableSpecialShapeInMeshPart: "True", + FFlagGfxPartInvalidationLimitToTime2: "True", + FFlagLuauStricterLib: "True", + FFlagLuauInternalAlloc: "True", + FFlagLuauVersion: "True", + FFlagLuauFasterHash: "True", + FFlagRemoveUILibraryTimeline: "True", + FFlagDataModelPatcherConfigurerEnabled3: "True", + FFlagRemoveEndOfScrollMessage: "True", + FIntHttpCacheRedirectsTimeoutMs: "14400000", + FFlagPlayerListFixXboxLayout: "True", + AllowVideoPreRoll: "True", + AxisAdornmentGrabSize: "12", + CaptureCountersIntervalInMinutes: "5", + CaptureQTStudioCountersEnabled: "True", + DFFlagBoxMappedMeshLODFix_v2: "True", + DFFlagCLI120342: "False", + DFFlagCLI120342p7: "True", + DFFlagCLI120342p72: "True", + DFFlagCSGMeshLevelOfDetailV2: "True", + DFFlagCyclicExecutiveThrottlingCancelWorldStepAccum: "False", + DFFlagDebugVisualizerTrackRotationPredictions: "True", + DFFlagDoNotRenderMeshLODByDefault: "True", + DFFlagEnableRemoteProfiling: "True", + DFFlagEnableRemoteProfilingForDevConsole: "True", + DFFlagFavorIPV4Connections: "False", + DFFlagFindClosestHandleHitTestFixEnabled: "True", + DFFlagFixCutAndUndoAfterSavingCSGUnionToNewFile: "True", + DFFlagForceNoBloomInThumbnail: "True", + DFFlagGenerateMeshLOD_Fix1: "True", + DFFlagGetPolicyInfoForPlayerAsyncEnabledClient: "True", + DFFlagGoodbyeChoiceActiveProperty: "True", + DFFlagHttpCleanupRbxCurl: "True", + DFFlagLockViolationInstanceCrash: "False", + DFFlagLockViolationScriptCrash: "False", + DFFlagOrder66: "False", + DFFlagPreventReturnOfElevatedPhysicsFPS: "True", + DFFlagPugiCrashOnUnhandledXml: "True", + DFFlagRakNetDetectNetUnreachable: "True", + DFFlagReflectionLoggingEnabledClientWin32_3: "True", + DFFlagReflectionLoggingEnabledGlobal: "True", + DFFlagReflectionLoggingpPlacelauncherInitialization: "True", + DFFlagRenderGatherMsFrame2: "True", + DFFlagReportClientMemoryCat: "True", + DFFlagReportInfluxRenderMsFrameMetrics2: "False", + DFFlagReportOutlines: "True", + DFFlagScrollWhenInsideFocusedTextBox: "True", + DFFlagServerCopiesPlayerGui3_PlaceFilter: "false;142823291", + DFFlagSkipLQNeonWhenOff: "True", + DFFlagStudioSendOnlyOneShutdownEvent: "True", + DFFlagSupportMeshLOD: "True", + DFFlagSupportMeshLOD_PlaceFilter: "True; 2900823006", + DFFlagTextBoxesNeverSinkMouseEvents: "True", + DFFlagThrottleDebuggerMetrics: "True", + DFFlagThumbnailFixSrgb: "True", + DFFlagUsePugiXmlForPlaces: "True", + DFFlagUserInputServiceProcessOnRender: "True", + DFFlagYouAreNotSupposedToBeHere: "True", + DFIntAnalyticsCDNProbeInfluxPermyriad: "100", + DFIntAnalyticsNS1CDNProbeChancePercent: "5", + DFIntAndroidInfluxHundredthsPercentage: "0", + DFIntApiRateLimit: "200", + DFIntBgUpdateRedirectsHttpErrInfluxHundredthsPercentage: "100", + DFIntBroadPhaseIslandBufferZoneMinPartLimit: "0", + DFIntBroadPhaseIslandBufferZoneMinPartLimit_PlaceFilter: + "5;1105449649", + DFIntCSGLevelOfDetailSwitchingDistance: "250", + DFIntCSGLevelOfDetailSwitchingDistanceL12: "500", + DFIntDraggerMaxMovePercent: "60", + DFIntElevatedPhysicsFPSReportThresholdTenths: "585", + DFIntGroupServiceRolesApiV2: "0", + DFIntHttpCacheCleanMaxFilesToKeep: "7500", + DFIntHttpCacheCleanMinFilesRequired: "10000", + DFIntHttpParallelLimit_RequestContentProvider: "0", + DFIntHttpSendStatsEveryXSeconds: "300", + DFIntICMPPingHundrethsPercentage: "0", + DFIntLocServicePerformanceAnalyticsHundredthsPercentage: "1000", + DFIntMacInfluxHundredthsPercentage: "0", + DFIntMaxMissedWorldStepsRemembered: "16", + DFIntReflectionLoggingRolloutPerMil: "2000", + DFIntRenderMsFrameInfluxHundredthsPercentage: "1000", + DFIntReportReplicatorStatsToInfluxHundredthsPercent: "5000", + DFIntS2PhysicsSenderRate: "15", + DFIntSendJoinTimeDeltasToDiag_HundredthsPercentage: "100", + DFIntSendRakNetStatsThrottle: "2", + DFIntStreamJobMaxBufferHealthThresholdHundredths: "75", + DFIntStreamJobMaxBufferHealthThresholdHundredths_PlaceFilter: + "50;1526666203", + DFIntStreamJobMinBufferHealthThresholdHundredths: "40", + DFIntStreamJobMinBufferHealthThresholdHundredths_PlaceFilter: + "30;1526666203", + DFIntTargetTimeDelayFacctorTenths: "20", + DFIntTeleportExceptionInfluxHundredthsPercentage: "9000", + DFLogPlaceLauncherTeleportLog: "6", + DFLogSoundTrace: "4", + DFStringCrashUploadToBacktraceBlackholeToken: + "7705528468a303e4e34a13fbcf9e42e219633ed6868e143e5ab16cd33bd2a069", + DFStringCrashUploadToBacktraceMacPlayerToken: + "24cb37449e120c3a0618b1bf0585e339571828cae4dc73c7b8c99f67fcd751e9", + DFStringCrashUploadToBacktraceWindowsPlayerToken: + "417ecb0fbc032ce087e6af3b780c298e3356089f050c8130d2318109e80417a4", + DFStringGamePerfMonitorPercentageCountryOverride: + "CN,50,AU,50,NZ,50", + DFStringHttpInfluxDatabase: "prod", + DFStringOverrideSendRakNetStatsThrottleCountries: + "CN,50,JP,20,NO,20,FI,20,SE,20,NZ,20", + DFStringSendJoinTimeDeltasHundPrecCountryOverride: + "CN,5000,US,100,AU,3000,KR,2000,NZ,3000,JP,4000,NO,2000,FI,2000,SE,1000,FR,1000,DK,1000", + DFStringSendJoinTimeStatsHundPrecCountryOverride: + "CN,5000,US,100,AU,3000,KR,2000,NZ,3000", + DFStringSendJoinTimeStatsHundPrecCountryOverride_PlaceFilter: + "CN,10000,US,10000,AU,10000,KR,10000,NZ,10000;189707", + DFStringWorkspaceMessageLink: + "https://web.archive.org/web/20200624170102/https://devforum.roblox.com/t/physics-deprecating-the-legacy-spring-physics-solver/163521", + DFStringWorkspaceMessageText: + "We are in the process of disabling and removing the legacy solver. Click here for more info...", + EnableRemoteThemeCheckOnAndroidV3: "True", + FFlagAdditionalTextBoxShortcuts: "True", + FFlagAdvancedMouseSensitivityEnabled: "True", + FFlagAllowBackpackBinding: "True", + FFlagAppBackgroundMode2: "True", + FFlagApplyPlaceFilterEarly2: "True", + FFlagAvatarEditorEmotesSupport: "True", + FFlagAvatarEditorEnableThemes2: "True", + FFlagAvatarEditorHideSliderHighlightOnInit: "True", + FFlagAvatarEditorLightThemeFix2: "True", + FFlagBrilliantBorders: "True", + FFlagCLI18241: "True", + FFlagCLI18241A: "True", + FFlagCLI18241B: "True", + FFlagCLI21289: "True", + FFlagCLI23302: "True", + FFlagCLI26327: "True", + FFlagCLI26526: "True", + FFlagCLI26775: "True", + FFlagCLI26856: "True", + FFlagCLI26858: "False", + FFlagCLI27641A: "True", + FFlagCLI27760: "True", + FFlagCLI28630: "True", + FFlagCLI28759: "True", + FFlagCSGv2BalanceExponents: "False", + FFlagCSGv2FixOrientationWhenSeparatingNegates: "True", + FFlagCSGv2UnionOrientationFromFirstPart: "True", + FFlagCSGv2UnparentPartsBeforeModifyingCFrames: "True", + FFlagCSGv2UseImprovedSphereAndCylinder: "True", + FFlagCSGv2UseIterativeSimplification: "True", + FFlagClientFireEventPlaceLauncherFail3: "True", + FFlagCompatibilityUseSpecularMult: "True", + FFlagConnectionScriptEnabled_PlaceFilter: "False;1608755154", + FFlagCoreScriptBetterEmotesErrorMessaging: "True", + FFlagCoreScriptEmotesMenuAnalytics: "True", + FFlagCoreScriptEmotesMenuBetterMouseBehavior: "True", + FFlagCoreScriptEmotesMenuEnabled2: "True", + FFlagCoreScriptPlayerListPremiumIcon2: "True", + FFlagCoreScriptSettingsHelpRightKeys: "True", + FFlagDebugCSGExportFailure: "False", + FFlagDebugCrashEnabled: "False", + FFlagDebugGraphicsIntelCrash: "False", + FFlagDebugUseDefaultGlobalSettings: "True", + FFlagDevConsoleBetterResize: "True", + FFlagDevConsoleFixCommandBarForNonOwners: "True", + FFlagDevConsoleFixMicroprofilerSyncIssues: "True", + FFlagDevConsoleFixTopBarDragging: "True", + FFlagDevConsoleFixTopBarIcons: "True", + FFlagDevConsoleIsVeryStickyWhyWillItNotLetGo: "False", + FFlagDevConsoleLogNewLineFix: "False", + FFlagDevConsoleNoDisableAllFilters: "True", + FFlagDevConsoleTabMetrics: "True", + FFlagDevConsoleUpdateLayering: "True", + FFlagDisabledLayerCollectorsShouldNotSinkInput: "True", + FFlagDontDisconnectJointUpdateUnlessNecessary: "False", + FFlagDontSubmitBlankGameReports: "True", + FFlagDontUseUploadUrlForPublish: "True", + FFlagEmotesMenuRemoveOpenKeybinds: "True", + FFlagEmotesMenuShowUiOnlyWhenAvailable: "True", + FFlagEnableAndroidVsync: "True", + FFlagEnableContactsApiService: "False", + FFlagEnableDisablingNetworkPause: "True", + FFlagEnableGameSignalRWithAllPlatforms1: "False", + FFlagEnableGranularMemoryTabStats: "True", + FFlagEnableIsPremiumSettings: "True", + FFlagEnableLuaEventStreamRelease: "True", + FFlagEnableNetworkPauseGui: "True", + FFlagEnableRbxThumbAPI: "True", + FFlagEnableRemoteThemeCheckOniOSV2: "True", + FFlagErrorPromptTakeExtraConfigurations: "True", + FFlagFFlagAvatarEditorFixToolStuckOnRightArmEquip: "True", + FFlagFetchPremiumMigrationNoticeOnlyForBcUsers: "True", + FFlagFixAndroidKeyboardInput: "True", + FFlagFixFolderDescendantSelection: "True", + FFlagFixGamepadReportPlayer: "True", + FFlagFixGamepadVibrationNotEnding: "True", + FFlagFixIECompatiblityBug: "True", + FFlagFixMacFullscreenTrackingInMenu: "True", + FFlagFixOutOfBoundsMouseLocation: "True", + FFlagFixQuickCancelPurchase: "False", + FFlagFixScrollingFrameClipRect: "True", + FFlagFixSmallSurfaceGuiMouseInput: "True", + FFlagFixTerrainAnisoVoxelisation: "True", + FFlagFixTextureCubeFramebuffers: "True", + FFlagForceCursorVisibleOnPurchasePrompt: "True", + FFlagFutureIsBrightCompatibilityMode: "True", + FFlagFutureIsBrightForceCompatibilityOverLegacy: "True", + FFlagFutureIsBrightPhase2Android: "True", + FFlagFutureIsBrightPhase2FPCheck: "True", + FFlagFutureIsBrightPhase2iOS: "True", + FFlagGameExplorerCopyPath: "True", + FFlagGraphicsGL3InstancingEnabled5: "True", + FFlagGraphicsGL3UseUBO3: "True", + FFlagGraphicsGLDisableVAO: "True", + FFlagGraphicsGLDoubleBufferDynamic: "True", + FFlagGraphicsMetalPrivateMemory: "True", + FFlagGroupEditDevConsoleButton: "True", + FFlagHelpMenuShowPlaceVersion: "True", + FFlagHowToSendAMessage: "True", + FFlagHttpServiceWorldsMostOverkillFlagForMovingCodeFourLines: + "True", + FFlagInterpolationAwareTargetTime: "True", + FFlagJoinTimeCounters: "True", + FFlagLocServiceNullPtrCheckGetTranslator: "True", + FFlagLocServicePerformanceAnalyticsEnabled: "True", + FFlagLuaAppConvertUniverseIdToStringV364: "False", + FFlagLuaAppEnableErrorReporterRateLimit: "True", + FFlagLuaAppEnableStyleProvider: "True", + FFlagLuaAppGameSearchPlayerSuggestion376: "True", + FFlagLuaAppPremiumUpdatePrompt3: "True", + FFlagLuaAppSiteMessageBannerEnabled: "True", + FFlagLuaAppSizesWithValidDefaults: "True", + FFlagLuaAppUseGraphicWithBorderForPresenceV373: "True", + FFlagLuaAppUseNewPremiumIcon2: "True", + FFlagLuaChatAnalyticsEnabled: "True", + FFlagLuaChatBoldUnreadMessageText: "True", + FFlagLuaChatCenterAndroidHeader: "True", + FFlagLuaChatEnableFrequentUsersDiag: "True", + FFlagLuaChatFixConversationHubHeaders369: "True", + FFlagLuaChatHeaderEnableHomeButton: "True", + FFlagLuaChatOnlyMarkUnreadWhenChatIsFocused: "True", + FFlagLuaChatPressEnterToSend: "True", + FFlagLuaChatRecoverSignalRConnection: "True", + FFlagLuaChatResizeUserChatBubbleModerationError: "True", + FFlagLuaChatRoactAssetCard: "True", + FFlagLuaChatScreenManagerAlwaysUpdatesWithDefaultsV390: "True", + FFlagLuaChatScreenManagerResumeAndPauseAfterNavigation: "True", + FFlagLuaChatShareGameBottomBarOverride: "True", + FFlagLuaChatSwipeToGoBackFromConversation369: "True", + FFlagLuaChatToastRefactor369: "True", + FFlagLuaDebuggerBreakOnError: "True", + FFlagLuaEnableRemoteThemeCheckV4: "True", + FFlagLuaHomePageShowAddFriendsButtonV361: "True", + FFlagLuaInviteFailOnZeroPlaceIdV384: "True", + FFlagLuaInviteGameHandleUnknownResponse: "True", + FFlagLuaInviteGameMockTextLocalization: "True", + FFlagLuaInviteModalEnabledV384: "True", + FFlagLuaInviteNewAnalytics: "True", + FFlagMainBufferGuiLayoutTextAt1x: "False", + FFlagMainBufferGuiLayoutTextAt1x2: "True", + FFlagMemoryFromAppShellReporterIOS: "True", + FFlagMeshLODFixOutOfBoundAccess: "True", + FFlagMeshLODUseAsyncHttpPost: "True", + FFlagMetricCorrection: "True", + FFlagMicroProfilerSessionAnalytics: "True", + FFlagMonitorBatteryLevel: "True", + FFlagNewDefaultScriptSource: "True", + FFlagPGSAlwaysActiveMasterSwitch: "True", + FFlagPerformPurchaseAcceptsGamePassInfoType: "True", + FFlagPerformanceProfilerAnalytics: "True", + FFlagPhoneHomeSooner: "True", + FFlagPlaceLauncherScriptShutdownTimeout: "True", + FFlagPlayerListNewIcons: "False", + FFlagPlayerListPremiumPadding: "True", + FFlagPointerActions2: "True", + FFlagPreCoreBlurChunksMdrSpace: "True", + FFlagReconnectToStarterPlace: "True", + FFlagRemoveWakeForRenderJob: "True", + FFlagRenderEmitterRecomputeOnChange: "False", + FFlagRenderEnableMSAAShadows: "True", + FFlagRenderForcefieldCacheFix: "True", + FFlagRenderForcefieldFix: "True", + FFlagRenderForcefieldMaterial2: "True", + FFlagRenderInstancingEnabled8: "True", + FFlagRenderMetalMemorylessTargets: "True", + FFlagRenderNewMinShadingLevel: "True", + FFlagRenderPartInstancingEnabled6: "True", + FFlagRenderShadowClearFix: "True", + FFlagRenderShadowDynamicInstancing: "True", + FFlagRenderShadowLODFix: "True", + FFlagRenderShadowSingleCascade: "True", + FFlagRenderUseShadowGeometryForLegacyShadows: "True", + FFlagReportDevConsoleOpenClose: "True", + FFlagReportInGameAssetSales: "True", + FFlagReportLocalizationDataLoadingException: "True", + FFlagReportWndGestures: "False", + FFlagResetMouseDeltaFix: "True", + FFlagRobloxGuiSiblingZindexs: "True", + FFlagScrollingFrameSinkMoreInput: "False", + FFlagSetClientJobId: "True", + FFlagSetPlaceIdInAdvance3: "True", + FFlagSettingsHubInviteReleaseStreamTimeAs10: "True", + FFlagSettingsHubInviteToGameDefaultThumbnailSize150x150: "True", + FFlagSkyNoTranslationAndSaturate: "True", + FFlagStudioABTestFramework: "True", + FFlagStudioCollectGPUInfo: "True", + FFlagStudioEnableWebKitPlugins: "True", + FFlagStudioFixSciptOpenBehavior: "False", + FFlagStudioImagePickerFix: "True", + FFlagStudioOutputSaveFileAsLink: "True", + FFlagStudioShowTutorialsByDefault: "True", + FFlagStudioTrustsPlayersImmediately: "True", + FFlagStudioTutorialSeeAll: "True", + FFlagTextBoxOverrideManualFocusRelease: "False", + FFlagTextMeasureTemporaryPatch: "True", + FFlagTrackWindowsVideoRecording: "True", + FFlagTranslateAvatarContextMenu: "True", + FFlagUSC180727A: "True", + FFlagUSC180727C: "True", + FFlagUSC180727D: "True", + FFlagUSC24644: "True", + FFlagUSC26572: "True", + FFlagUnlockMouseIfKicked: "True", + FFlagUnlockedTopbarTransparency: "True", + FFlagUseNewErrorStrings: "True", + FFlagUseRBXThumbInToolbox: "True", + FFlagUseSetForegroundWindowForPlayer: "False", + FFlagUserAnimateScriptEmoteHook: "True", + FFlagUserBetterDynamicTouchstickCamera: "True", + FFlagUserBetterHandlingVehicleInputStates: "True", + FFlagUserBetterInertialScrolling: "False", + FFlagUserClickToMoveBetterCleanup: "True", + FFlagUserClickToMoveCancelOnMenuOpened: "True", + FFlagUserDTDoesNotForceAutoJump: "True", + FFlagUserDTDoesNotTrackTools: "True", + FFlagUserDTFastInit: "True", + FFlagUserDynamicThumbstickUseContextActionSevice: "True", + FFlagUserEnableDynamicThumbstickIntro_PlaceFilter: + "True;1817743405", + FFlagUserFixCharacterRemovingControlModule: "True", + FFlagUserFixChatMessageLogPerformance3: "False", + FFlagUserFixChatMessageLogPerformance4: "True", + FFlagUserFixChatMessageLogPerformance_PlaceFilter: "True;370731277", + FFlagUserFixClickToMoveWithACM: "True", + FFlagUserFixMovementCameraStraightDown: "True", + FFlagUserFixTouchGuiWhenNoCharacter: "True", + FFlagUserHttpAPIVisible: "True", + FFlagUserInputServicePipelineMacClient: "True", + FFlagUserInputServicePipelineStudio: "True", + FFlagUserInputServicePipelineWindowsClient: "True", + FFlagUserNavigationFixClickToMoveInterruption: "True", + FFlagUserNewClickToMoveDisplay: "True", + FFlagUserNewDefaultCameraAngle: "True", + FFlagUserNewPoppercam: "False", + FFlagUserNewPoppercam3: "True", + FFlagUserNewPoppercam3_PlaceFilter: "False;1997193809;734159876", + FFlagUserNewPoppercam4: "True", + FFlagUserNewPoppercam_PlaceFilter: + "False;855499080;606849621;537413528;402122991", + FFlagUserNoCameraClickToMove: "True", + FFlagUserNoDynamicThumbstickRecenter: "True", + FFlagUserPlayEmoteBySlotEnabled: "True", + FFlagUserPlayEmoteChatCommand: "True", + FFlagUserPlayerScriptsBindAtPriority: "False", + FFlagUserPlayerScriptsBindAtPriority2: "True", + FFlagUserPointerActionsInPlayerScripts: "True", + FFlagUserPoppercamLooseOpacityThreshold: "True", + FFlagUserThumbstickFrameIsActuallyFrame: "True", + FFlagUserUpdateCameraConstants: "True", + FFlagUserUseNewControlScript: "True", + FFlagVideoDocumentationPluginEnabled: "True", + FFlagVideoRecordDeadlockFix: "True", + FFlagVideoRecordFix: "True", + FFlagVideoRecordFix2: "True", + FFlagWorldAvatarLocalization: "True", + FIntCLI20390_2: "16", + FIntCompatibilityModeSpecularMultiplierDiv100: "30", + FIntGamePerfMonitorPercentage: "10", + FIntGraphicsVulkanARMVaryingBufferMb: "160", + FIntGraphicsVulkanMinAndroidVersion: "25", + FIntGraphicsVulkanMinDriverVersionPVR: "4981305", + FIntHttpCurlMaxCachedHandlesPerHost: "8", + FIntLocalizationAnalyticsSamplesPerMillion: "1000000", + FIntLuaAppMorePagePremiumIcon: "2", + FIntNewDevConsoleMaxHttpCount: "300", + FIntNewDevConsoleMaxLogCount: "500", + FIntNumberParallelNarrowPhaseTasks_PlaceFilter: + "10;189707;3229213183;654732683", + FIntPercentReportingNetworkProfileAfterStartup: "20", + FIntRegLambda: "1400", + FIntSendScreenOrientationToEventIngestHundredthsPercentage: "100", + FIntStartupInfluxHundredthsPercentage: "100", + FIntStudioInsertDeletionCheckTimeMS: "30000", + FIntUSC180727B: "32", + FIntValidateLauncherPercent: "100", + FIntWeldConstraintAdornSize: "10", + FIntZoomOutDistance: "500", + FLogBrowserActivity: "3", + FLogCloseDataModel: "3", + FLogDXVideoMemory: "4", + FLogFullRenderObjects: "0", + FLogGraphics: "6", + FLogHangDetection: "3", + FLogLuaBridge: "2", + FLogNetworkItemQueueDtor: "1", + FLogPlayerShutdownLuaTimeoutSeconds: "1", + FLogVR: "6", + FStringCLI27760S: "nn62qq5r3q8n9sn537r1r00o43nq1p458391556o", + FStringGamesUrlPath: "/games/?referrer=roblox-player", + FStringSettingsHubInviteToGameThumbnailSize: "Size150x150", + FStringStudioTutorialsTOCUrl: + "https://web.archive.org/web/20200624170102/http://wiki.roblox.com/index.php?title=Studio_Tutorials_Landing&studiomode=true", + FStringStudioTutorialsUrl: + "https://web.archive.org/web/20200624170102/http://wiki.roblox.com/index.php?title=Studio_Tutorials_Test&studiomode=true", + GoogleAnalyticsAccountPropertyID: "UA-43420590-3", + GoogleAnalyticsAccountPropertyIDPlayer: "UA-43420590-14", + GoogleAnalyticsLoadStudio: "1", + PublishedProjectsPageHeight: "535", + PublishedProjectsPageUrl: "/ide/publish", + PublishedProjectsPageWidth: "950", + StartPageUrl: "/ide/welcome", + VideoPreRollWaitTimeSeconds: "45", + FFlagFutureIsBrightPhase2_5_v1: "True", + FFlagEnableRobuxABTest: "True", + FFlagFutureIsBrightPhase2_5_v2: "False", + DFFlagTattletaleUseStrstr: "True", + DFFlagDebugCurlOption12: "True", + DFFlagDebugCurlOption22: "True", + FFlagRecordRecording: "True", + FFlagTheseAreSomeOfMyBestAttributes: "True", + DFFlagTheseAreSomeOfMyBestAttributes: "True", + FIntDebugForceMSAASamples: "1000", + DFIntDebugForceMSAASamples: "1000", + }, + }) }) -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/develop.js b/Back/routes/develop.js index 5254dcb..7065ac3 100644 --- a/Back/routes/develop.js +++ b/Back/routes/develop.js @@ -1,854 +1,1132 @@ const express = require("express") const router = express.Router() -const { requireAuth } = require('./../middleware/authmiddleware') -const User = require('./../model/user.js') -const games = require('./../model/games.js') -const catalog = require('./../model/item.js') -const { requirediscord } = require('./../middleware/requirediscord.js') -var multer = require('multer'); -const fs = require('fs'); -const path = require('path') -var numbtest = /^\d+\.?\d*$/; -const bodyParser = require('body-parser') -const {pngValidator} = require('png-validator') +const { requireAuth } = require("./../middleware/authmiddleware") +const User = require("./../model/user.js") +const games = require("./../model/games.js") +const catalog = require("./../model/item.js") +const { requirediscord } = require("./../middleware/requirediscord.js") +var multer = require("multer") +const fs = require("fs") +const path = require("path") +var numbtest = /^\d+\.?\d*$/ +const bodyParser = require("body-parser") +const { pngValidator } = require("png-validator") const fileTypeChecker = require("file-type-checker") -const rateLimit = require('express-rate-limit') +const rateLimit = require("express-rate-limit") const limiter = rateLimit({ windowMs: 3 * 1000, // 3 seconds max: 1, // Limit each IP to 1 requests per `window` standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers legacyHeaders: false, // Disable the `X-RateLimit-*` headers - handler: (request, response, next, options) =>{ - response.json({status: 'error', error: 'Too many requests try again later.'}) - } + handler: (request, response, next, options) => { + response.json({ + status: "error", + error: "Too many requests try again later.", + }) + }, }) -async function validateImage(itemid,res){ - return new Promise(async (resolve) => { +async function validateImage(itemid, res) { + return new Promise(async resolve => { + try { + const myArrayBuffer = await fs.promises.readFile( + path.resolve(`assets/ugc/itemfile-${itemid}.rbxm`), + null, + ) + pngValidator(myArrayBuffer) + // success + } catch { + // file is invalid or corrupt + fs.unlink( + path.resolve(`assets/ugc/itemfile-${itemid}.rbxm`), + err => { + if (err) console.log(err) + }, + ) - try { - const myArrayBuffer = await fs.promises.readFile(path.resolve(`assets/ugc/itemfile-${itemid}.rbxm`), null) - pngValidator(myArrayBuffer); - // success - } catch { - // file is invalid or corrupt - fs.unlink(path.resolve(`assets/ugc/itemfile-${itemid}.rbxm`), (err => { - if (err) console.log(err) - })); - - return res.json({status: 'error', error: 'Image is invalid.'}) - } + return res.json({ status: "error", error: "Image is invalid." }) + } - resolve() - - }) + resolve() + }) } - -const pages = [ - 'shirts', - 'pants', - 'audios', - 'games', - 'badges', - 'meshes' -] +const pages = ["shirts", "pants", "audios", "games", "badges", "meshes"] router.use(bodyParser.json()) -router.post("/creations", requireAuth,async (req, res) => { - const { type } = req.body - let items = await catalog.find({Creator: req.userdocument.userid, Type: type}).lean().select(['Name',"Description",'ItemId']) - if (type === "games"){ - items = await games.find({useridofowner: req.userdocument.userid}).lean().select(['nameofgame','idofgame','Description','avatartype','gearallowed']) - } - - if (type === "audios"){ - items = await catalog.find({Creator: req.userdocument.userid, Type: "Audio"}).lean().select(['Name',"Description",'ItemId']) - }else if (type === "badges"){ - items = await catalog.find({Creator: req.userdocument.userid, Type: "Badge"}).lean().select(['Name',"Description",'ItemId']) - }else if (type === "meshes"){ - items = await catalog.find({Creator: req.userdocument.userid, Type: "Mesh"}).lean().select(['Name',"Description",'ItemId']) - }else if (type === "userads"){ - items = await catalog.find({Creator: req.userdocument.userid, Type: "User Ad"}).lean().select(['Name',"Description",'ItemId']) - }else if (type === "gamepasses"){ - items = await catalog.find({Creator: req.userdocument.userid, Type: "Gamepass"}).lean().select(['Name',"Description",'ItemId']) - }else if (type === "videos"){ - items = await catalog.find({Creator: req.userdocument.userid, Type: "Video"}).lean().select(['Name',"Description",'ItemId']) - } - - return res.json(items) +router.post("/creations", requireAuth, async (req, res) => { + const { type } = req.body + let items = await catalog + .find({ Creator: req.userdocument.userid, Type: type }) + .lean() + .select(["Name", "Description", "ItemId"]) + if (type === "games") { + items = await games + .find({ useridofowner: req.userdocument.userid }) + .lean() + .select([ + "nameofgame", + "idofgame", + "Description", + "avatartype", + "gearallowed", + ]) + } + if (type === "audios") { + items = await catalog + .find({ Creator: req.userdocument.userid, Type: "Audio" }) + .lean() + .select(["Name", "Description", "ItemId"]) + } else if (type === "badges") { + items = await catalog + .find({ Creator: req.userdocument.userid, Type: "Badge" }) + .lean() + .select(["Name", "Description", "ItemId"]) + } else if (type === "meshes") { + items = await catalog + .find({ Creator: req.userdocument.userid, Type: "Mesh" }) + .lean() + .select(["Name", "Description", "ItemId"]) + } else if (type === "userads") { + items = await catalog + .find({ Creator: req.userdocument.userid, Type: "User Ad" }) + .lean() + .select(["Name", "Description", "ItemId"]) + } else if (type === "gamepasses") { + items = await catalog + .find({ Creator: req.userdocument.userid, Type: "Gamepass" }) + .lean() + .select(["Name", "Description", "ItemId"]) + } else if (type === "videos") { + items = await catalog + .find({ Creator: req.userdocument.userid, Type: "Video" }) + .lean() + .select(["Name", "Description", "ItemId"]) + } + return res.json(items) }) var storage = multer.diskStorage({ - destination: function (req, file, cb) { - // Uploads is the Upload_folder_name - if(file.fieldname === "thumbnail"){ // is a game thumbnail - cb(null, "./assets/gameassets") - }else{ - cb(null, "./assets/ugc") - } - - }, - filename: async function (req, file, cb) { - //console.log(path.basename(file.originalname,'.png')) - if (path.extname(file.originalname) === ".rbxl"){ - const placeid = await games.countDocuments(); - cb(null, "gamefile" + "-" + placeid +path.extname(file.originalname)) - }else if(file.fieldname === "thumbnail"){ // is a game thumbnail - const placeid = await games.countDocuments(); - cb(null, "thumbnail" + "-" + placeid + ".png") - } - else if (file.mimetype == "image/png"){ - const itemid = await catalog.countDocuments(); - cb(null, "itemfile" + "-" + itemid + ".rbxm") - }else if (path.extname(file.originalname) === ".mp3"){ - const itemid = await catalog.countDocuments(); - cb(null, "itemfile" + "-" + itemid + ".rbxm") - }else if (path.extname(file.originalname) === ".mesh"){ - const itemid = await catalog.countDocuments(); - cb(null, "itemfile" + "-" + itemid + ".rbxm") - }else if (path.extname(file.originalname) === ".webm"){ - const itemid = await catalog.countDocuments(); - cb(null, "itemfile" + "-" + itemid + ".rbxm") - } - + destination: function (req, file, cb) { + // Uploads is the Upload_folder_name + if (file.fieldname === "thumbnail") { + // is a game thumbnail + cb(null, "./assets/gameassets") + } else { + cb(null, "./assets/ugc") + } + }, + filename: async function (req, file, cb) { + //console.log(path.basename(file.originalname,'.png')) + if (path.extname(file.originalname) === ".rbxl") { + const placeid = await games.countDocuments() + cb( + null, + "gamefile" + "-" + placeid + path.extname(file.originalname), + ) + } else if (file.fieldname === "thumbnail") { + // is a game thumbnail + const placeid = await games.countDocuments() + cb(null, "thumbnail" + "-" + placeid + ".png") + } else if (file.mimetype == "image/png") { + const itemid = await catalog.countDocuments() + cb(null, "itemfile" + "-" + itemid + ".rbxm") + } else if (path.extname(file.originalname) === ".mp3") { + const itemid = await catalog.countDocuments() + cb(null, "itemfile" + "-" + itemid + ".rbxm") + } else if (path.extname(file.originalname) === ".mesh") { + const itemid = await catalog.countDocuments() + cb(null, "itemfile" + "-" + itemid + ".rbxm") + } else if (path.extname(file.originalname) === ".webm") { + const itemid = await catalog.countDocuments() + cb(null, "itemfile" + "-" + itemid + ".rbxm") + } + }, +}) +const uploadcloth = multer({ + storage: storage, + fileFilter: function (req, file, callback) { + if ( + file.mimetype !== + "image/png" /*&& ext !== '.mp3' && ext !== '.rbxl'*/ + ) { + return callback("Invalid file type") + } + callback(null, true) + }, + limits: { fileSize: 1024 * 1024 }, // 1mb +}) - } - }) - const uploadcloth = multer({storage: storage, - fileFilter: function (req, file, callback) { - if(file.mimetype !== 'image/png' /*&& ext !== '.mp3' && ext !== '.rbxl'*/) { - return callback('Invalid file type') - } - callback(null, true) - }, - limits: { fileSize: 1024 * 1024 } // 1mb - }) +router.post( + "/uploadclothing", + requireAuth, + requirediscord, + async (req, res) => { + uploadcloth.single("clothingfile")(req, res, async function (err) { + if (err) { + if (err?.message === "File too large") { + return res + .status(400) + .send({ + status: "error", + error: "File too large! 1MB Limit", + }) + } + if (err === "Invalid file type") { + return res + .status(400) + .send({ status: "error", error: "Invalid file type" }) + } + return res + .status(400) + .send({ status: "error", error: err.message }) + } + var xss = require("xss") + const { clothingname, description, price, type } = req.body + // save shirt template + if (!clothingname) { + return res.json({ + status: "error", + error: "Clothing name needs to be sent.", + }) + } + if (!description) { + return res.json({ + status: "error", + error: "Description needs to be sent.", + }) + } + if (!price) { + return res.json({ + status: "error", + error: "Price needs to be sent.", + }) + } + if (type != "Shirts" && type != "Pants") { + return res.json({ + status: "error", + error: "Type needs to be a shirt or pant value", + }) + } -router.post("/uploadclothing", requireAuth,requirediscord,async (req, res) => { - uploadcloth.single("clothingfile")(req, res, async function (err) { - if (err) { - if (err?.message === "File too large"){ - return res.status(400).send({status: 'error', error: "File too large! 1MB Limit"}) - } - if (err === "Invalid file type"){ - return res.status(400).send({status: 'error', error: "Invalid file type"}) - } - return res.status(400).send({status: 'error', error: err.message}) - } - var xss = require("xss") - const {clothingname, description,price,type} = req.body - // save shirt template - if (!clothingname){ - return res.json({status: 'error', error: 'Clothing name needs to be sent.'}) - } - if (!description){ - return res.json({status: 'error', error: 'Description needs to be sent.'}) - } - if (!price){ - return res.json({status: 'error', error: 'Price needs to be sent.'}) - } - if (type != "Shirts" && type != "Pants"){ - return res.json({status: 'error', error: 'Type needs to be a shirt or pant value'}) - } + if (numbtest.test(price) == false) { + return res.json({ + status: "error", + error: "Price can only be a number!", + }) + } - if (numbtest.test(price) == false){ - return res.json({status: 'error', error: 'Price can only be a number!'}) - } + if (price < 5) { + return res.json({ + status: "error", + error: "Minimum price is 5 rocks.", + }) + } + if (req.userdocument.coins < 5) { + // less than + return res.json({ + status: "error", + error: "You don't have 5 rocks >:(!", + }) + } else if (req.userdocument.admin === false) { + req.userdocument.coins -= 5 + req.userdocument.markModified("coins") + await req.userdocument.save() + } - if (price < 5){ - return res.json({status: 'error', error: 'Minimum price is 5 rocks.'}) - } - if (req.userdocument.coins < 5) { // less than - return res.json({status: 'error', error: 'You don\'t have 5 rocks >:(!'}) - }else if (req.userdocument.admin === false){ - req.userdocument.coins -= 5 - req.userdocument.markModified('coins') - await req.userdocument.save() - } - - const itemid = await catalog.countDocuments(); - // check if the file they just uploaded is valid - await validateImage(itemid,res) - let approved = req.userdocument.admin === false ? false : true + const itemid = await catalog.countDocuments() + // check if the file they just uploaded is valid + await validateImage(itemid, res) + let approved = req.userdocument.admin === false ? false : true - try{ - await catalog.create({ - Name: xss(clothingname), - Description: xss(description), - Price: Math.ceil(price), - Type: "Image", - Hidden: true, - ItemId: itemid, - approved - }) + try { + await catalog.create({ + Name: xss(clothingname), + Description: xss(description), + Price: Math.ceil(price), + Type: "Image", + Hidden: true, + ItemId: itemid, + approved, + }) + } catch {} - - }catch{ - - } - -// save actual item - let xml = ` + // save actual item + let xml = + ` null nil - http://mete0r.xyz/asset/?id=`+itemid+` + http://mete0r.xyz/asset/?id=` + + itemid + + ` Shirt true ` -if (type === "Pants"){ -xml = ` + if (type === "Pants") { + xml = + ` null nil - http://mete0r.xyz/asset/?id=`+itemid+` + http://mete0r.xyz/asset/?id=` + + itemid + + ` Pants true ` -} - let shirtid = itemid + 1 // prevent any race conditions - shirtid = shirtid.toString() - fs.writeFile("./assets/ugc/itemfile-"+shirtid+".rbxm", xml,async function(err) { - if(err) { - return console.log(err); - } - let approved = req.userdocument.admin === false ? false : true - try{ - await catalog.create({ - Name: xss(clothingname), - Description: xss(description), - Price: Math.ceil(price), - Creator: req.userdocument.userid, - Type: type, - ItemId: shirtid, - approved - }) - - - }catch{ - - } -}); -// give player shirt -User.updateOne({userid: req.userdocument.userid}, { - $push: { - inventory: {Type: type,ItemId: shirtid, ItemName: xss(clothingname), Equipped: false} - } -}, -function(err, doc) { - //console.log(err) -}) -return res.json({status: 'success', message: 'Done!'}) - - - -}) -}) + } + let shirtid = itemid + 1 // prevent any race conditions + shirtid = shirtid.toString() + fs.writeFile( + "./assets/ugc/itemfile-" + shirtid + ".rbxm", + xml, + async function (err) { + if (err) { + return console.log(err) + } + let approved = + req.userdocument.admin === false ? false : true + try { + await catalog.create({ + Name: xss(clothingname), + Description: xss(description), + Price: Math.ceil(price), + Creator: req.userdocument.userid, + Type: type, + ItemId: shirtid, + approved, + }) + } catch {} + }, + ) + // give player shirt + User.updateOne( + { userid: req.userdocument.userid }, + { + $push: { + inventory: { + Type: type, + ItemId: shirtid, + ItemName: xss(clothingname), + Equipped: false, + }, + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + return res.json({ status: "success", message: "Done!" }) + }) + }, +) // upload game WOW -const uploadgame = multer({storage: storage, - fileFilter: function (req, file, callback) { - var ext = path.extname(file.originalname); - if(ext !== '.png' && ext !== '.rbxl'/* && ext !== '.mp3'*/) { - return callback('Invalid file type') - } - callback(null, true) - }, - limits: { fileSize: 5120 * 1024 * 2 } // 10mb +const uploadgame = multer({ + storage: storage, + fileFilter: function (req, file, callback) { + var ext = path.extname(file.originalname) + if (ext !== ".png" && ext !== ".rbxl" /* && ext !== '.mp3'*/) { + return callback("Invalid file type") + } + callback(null, true) + }, + limits: { fileSize: 5120 * 1024 * 2 }, // 10mb }) -const uploadaudio = multer({storage: storage, - fileFilter: function (req, file, callback) { - var ext = path.extname(file.originalname); - if(ext !== '.mp3' && ext !== '.ogg') { - return callback('Invalid file type') - } - callback(null, true) - }, - limits: { fileSize: 5120 * 1024 } // 5mb +const uploadaudio = multer({ + storage: storage, + fileFilter: function (req, file, callback) { + var ext = path.extname(file.originalname) + if (ext !== ".mp3" && ext !== ".ogg") { + return callback("Invalid file type") + } + callback(null, true) + }, + limits: { fileSize: 5120 * 1024 }, // 5mb }) var editgamestorage = multer.diskStorage({ - destination: function (req, file, cb) { - // Uploads is the Upload_folder_name - if(file.fieldname === "thumbnail"){ // is a game thumbnail - cb(null, "./assets/gameassets") - }else{ - cb(null, "./assets/ugc") - } - - }, - filename: async function (req, file, cb) { - //console.log(path.basename(file.originalname,'.png')) - if (path.extname(file.originalname) === ".rbxl"){ + destination: function (req, file, cb) { + // Uploads is the Upload_folder_name + if (file.fieldname === "thumbnail") { + // is a game thumbnail + cb(null, "./assets/gameassets") + } else { + cb(null, "./assets/ugc") + } + }, + filename: async function (req, file, cb) { + //console.log(path.basename(file.originalname,'.png')) + if (path.extname(file.originalname) === ".rbxl") { + const item = await games + .findOne({ idofgame: req.body.gameid }) + .lean() + if (!item) { + return cb("Item doesn't exist!") + } - const item = await games.findOne({idofgame: req.body.gameid}).lean() - if (!item){ - - return cb("Item doesn't exist!") - } - - //console.log(item) - - if (item.useridofowner != req.userdocument.userid){ - // player doesn't own this item - return cb("You don't own this") - } - cb(null, "gamefile" + "-" + req.body.gameid +path.extname(file.originalname)) - } + //console.log(item) - } - }) - -const editgame = multer({storage: editgamestorage, - fileFilter: function (req, file, callback) { - var ext = path.extname(file.originalname); - - if(ext !== '.rbxl'/* && ext !== '.mp3'*/) { - return callback('Invalid file type') - } - callback(null, true) - }, - limits: { fileSize: 5120 * 1024 * 2 } // 10mb + if (item.useridofowner != req.userdocument.userid) { + // player doesn't own this item + return cb("You don't own this") + } + cb( + null, + "gamefile" + + "-" + + req.body.gameid + + path.extname(file.originalname), + ) + } + }, }) -router.post("/editgame", requireAuth,requirediscord,async (req, res) => { - const {nameofgame, description, gameid} = req.body - var xss = require("xss") - if (!gameid){ - return res.json({status: 'error', error: 'GameID required'}) - } +const editgame = multer({ + storage: editgamestorage, + fileFilter: function (req, file, callback) { + var ext = path.extname(file.originalname) - const item = await games.findOne({idofgame: gameid}) - if (!item){ - - return res.json({status: 'error', error: "Game doesn't exist."}) - } - - //console.log(item) - - if (item.useridofowner != req.userdocument.userid){ - // player doesn't own this item - return res.json({status: 'error', error: "You don't have permissions for this!"}) - } - - if (nameofgame && nameofgame != ""){ - item.nameofgame = xss(nameofgame) - item.markModified('nameofgame') - await item.save() - } - - if (description && description != ""){ - item.descrption = xss(description) - item.markModified('descrption') - await item.save() - } - - return res.json({status: 'success',message:'Done!'}) - - - }) - - router.post("/editavatartype", requireAuth,requirediscord,async (req, res) => { - const {avatartype, gameid} = req.body - if (!gameid){ - return res.json({status: 'error', error: 'GameID required'}) - } - if (!avatartype){ - return res.json({status: 'error', error: 'Avatar type required'}) - } - - if (avatartype != "R6" && avatartype != "R15" && avatartype != "PC"){ - return res.json({status: 'error', error: 'Avatar type required'}) - } - const item = await games.findOne({idofgame: gameid}) - if (!item){ - - return res.json({status: 'error', error: "Game doesn't exist."}) - } - - //console.log(item) - - if (item.useridofowner != req.userdocument.userid){ - // player doesn't own this item - return res.json({status: 'error', error: "You don't have permissions for this!"}) - } - - item.avatartype = avatartype - item.markModified('avatartype') - await item.save() - - - - return res.json({status: 'success',message:'Done!'}) - - - }) - - router.post("/editgearstatus", requireAuth,requirediscord,async (req, res) => { - const {newgearstatus, gameid} = req.body - if (!gameid){ - return res.json({status: 'error', error: 'GameID required'}) - } - - if (newgearstatus != true && newgearstatus != false){ - return res.json({status: 'error', error: 'Gear status required'}) - } - const item = await games.findOne({idofgame: gameid}) - if (!item){ - - return res.json({status: 'error', error: "Game doesn't exist."}) - } - - //console.log(item) - - if (item.useridofowner != req.userdocument.userid){ - // player doesn't own this item - return res.json({status: 'error', error: "You don't have permissions for this!"}) - } - - item.gearallowed = newgearstatus - item.markModified('gearallowed') - await item.save() - - - - return res.json({status: 'success',message:'Done!'}) - - - }) - -router.post("/editgameupload", requireAuth,requirediscord,async (req, res) => { - editgame.single("gamefile")(req, res, async function (err) { - if (err) { - if (err?.message === "File too large"){ - return res.status(400).send({status: 'error', error: "File too large! 10MB Limit"}) - } - if (err === "Invalid file type"){ - return res.status(400).send({status: 'error', error: "Invalid file type"}) - } - return res.status(400).send({status: 'error', error: err.message}) - } - - return res.json({status: 'success',message:'Done!'}) -}) + if (ext !== ".rbxl" /* && ext !== '.mp3'*/) { + return callback("Invalid file type") + } + callback(null, true) + }, + limits: { fileSize: 5120 * 1024 * 2 }, // 10mb }) -router.post("/uploadgame", requireAuth,requirediscord,async (req, res) => { - uploadgame.fields([ - {name: 'gamefile', maxCount: 1}, - {name: 'thumbnail', maxCount: 1} - ])(req, res, async function (err) { - if (err) { - if (err?.message === "File too large"){ - return res.status(400).send({status: 'error', error: "File too large! 10MB Limit"}) - } - if (err === "Invalid file type"){ - return res.status(400).send({status: 'error', error: "Invalid file type"}) - } - return res.status(400).send({status: 'error', error: err.message}) - } - var xss = require("xss") - const {gamename, description, version} = req.body - // save game - if (!gamename){ - return res.json({status: 'error', error: 'Game name needs to be sent.'}) - } +router.post("/editgame", requireAuth, requirediscord, async (req, res) => { + const { nameofgame, description, gameid } = req.body + var xss = require("xss") + if (!gameid) { + return res.json({ status: "error", error: "GameID required" }) + } - if (gamename?.length > 50) { - return res.json({status: 'error', error: 'Game name can not be more than 50 characters'}) - } + const item = await games.findOne({ idofgame: gameid }) + if (!item) { + return res.json({ status: "error", error: "Game doesn't exist." }) + } - if (!description){ - return res.json({status: 'error', error: 'Description needs to be sent.'}) - } + //console.log(item) - if (description?.length > 1000) { - return res.json({status: 'error', error: 'Description can not be more than 1000 characters'}) - } + if (item.useridofowner != req.userdocument.userid) { + // player doesn't own this item + return res.json({ + status: "error", + error: "You don't have permissions for this!", + }) + } - if (!version){ - return res.json({status: 'error', error: 'Version needs to be sent.'}) - } - const versions = [ - //"2014", - "2016", - "2018", - "2020" - ] + if (nameofgame && nameofgame != "") { + item.nameofgame = xss(nameofgame) + item.markModified("nameofgame") + await item.save() + } - if (versions.includes(version) === false){ - return res.json({status: 'error', error: 'Invalid version sent.'}) - } - if (req.userdocument.coins < 5) { // less than - return res.json({status: 'error', error: 'You don\'t have 5 rocks >:(!'}) - }else if (req.userdocument.admin === false){ - req.userdocument.coins -= 5 - req.userdocument.markModified('coins') - await req.userdocument.save() - } + if (description && description != "") { + item.descrption = xss(description) + item.markModified("descrption") + await item.save() + } - const placeid = await games.countDocuments(); - try{ - await games.create({ - useridofowner: req.userdocument.userid, - idofgame: placeid, - nameofgame: xss(gamename), - numberofplayers: "0", - descrption: xss(description), - version: version - }) - - - }catch{ - throw error - } - return res.json({status: 'success', message: 'Done!'}) -}) + return res.json({ status: "success", message: "Done!" }) }) +router.post( + "/editavatartype", + requireAuth, + requirediscord, + async (req, res) => { + const { avatartype, gameid } = req.body + if (!gameid) { + return res.json({ status: "error", error: "GameID required" }) + } + if (!avatartype) { + return res.json({ status: "error", error: "Avatar type required" }) + } -const uploadasset = multer({storage: storage, - fileFilter: function (req, file, callback) { - var ext = path.extname(file.originalname); - if(ext !== '.png' && ext !== '.mesh') { - return callback('Invalid file type') - } - callback(null, true) - }, - limits: { fileSize: 5120 * 1024 } // 1mb + if (avatartype != "R6" && avatartype != "R15" && avatartype != "PC") { + return res.json({ status: "error", error: "Avatar type required" }) + } + const item = await games.findOne({ idofgame: gameid }) + if (!item) { + return res.json({ status: "error", error: "Game doesn't exist." }) + } + + //console.log(item) + + if (item.useridofowner != req.userdocument.userid) { + // player doesn't own this item + return res.json({ + status: "error", + error: "You don't have permissions for this!", + }) + } + + item.avatartype = avatartype + item.markModified("avatartype") + await item.save() + + return res.json({ status: "success", message: "Done!" }) + }, +) + +router.post( + "/editgearstatus", + requireAuth, + requirediscord, + async (req, res) => { + const { newgearstatus, gameid } = req.body + if (!gameid) { + return res.json({ status: "error", error: "GameID required" }) + } + + if (newgearstatus != true && newgearstatus != false) { + return res.json({ status: "error", error: "Gear status required" }) + } + const item = await games.findOne({ idofgame: gameid }) + if (!item) { + return res.json({ status: "error", error: "Game doesn't exist." }) + } + + //console.log(item) + + if (item.useridofowner != req.userdocument.userid) { + // player doesn't own this item + return res.json({ + status: "error", + error: "You don't have permissions for this!", + }) + } + + item.gearallowed = newgearstatus + item.markModified("gearallowed") + await item.save() + + return res.json({ status: "success", message: "Done!" }) + }, +) + +router.post( + "/editgameupload", + requireAuth, + requirediscord, + async (req, res) => { + editgame.single("gamefile")(req, res, async function (err) { + if (err) { + if (err?.message === "File too large") { + return res + .status(400) + .send({ + status: "error", + error: "File too large! 10MB Limit", + }) + } + if (err === "Invalid file type") { + return res + .status(400) + .send({ status: "error", error: "Invalid file type" }) + } + return res + .status(400) + .send({ status: "error", error: err.message }) + } + + return res.json({ status: "success", message: "Done!" }) + }) + }, +) + +router.post("/uploadgame", requireAuth, requirediscord, async (req, res) => { + uploadgame.fields([ + { name: "gamefile", maxCount: 1 }, + { name: "thumbnail", maxCount: 1 }, + ])(req, res, async function (err) { + if (err) { + if (err?.message === "File too large") { + return res + .status(400) + .send({ + status: "error", + error: "File too large! 10MB Limit", + }) + } + if (err === "Invalid file type") { + return res + .status(400) + .send({ status: "error", error: "Invalid file type" }) + } + return res.status(400).send({ status: "error", error: err.message }) + } + var xss = require("xss") + const { gamename, description, version } = req.body + // save game + if (!gamename) { + return res.json({ + status: "error", + error: "Game name needs to be sent.", + }) + } + + if (gamename?.length > 50) { + return res.json({ + status: "error", + error: "Game name can not be more than 50 characters", + }) + } + + if (!description) { + return res.json({ + status: "error", + error: "Description needs to be sent.", + }) + } + + if (description?.length > 1000) { + return res.json({ + status: "error", + error: "Description can not be more than 1000 characters", + }) + } + + if (!version) { + return res.json({ + status: "error", + error: "Version needs to be sent.", + }) + } + const versions = [ + //"2014", + "2016", + "2018", + "2020", + ] + + if (versions.includes(version) === false) { + return res.json({ status: "error", error: "Invalid version sent." }) + } + if (req.userdocument.coins < 5) { + // less than + return res.json({ + status: "error", + error: "You don't have 5 rocks >:(!", + }) + } else if (req.userdocument.admin === false) { + req.userdocument.coins -= 5 + req.userdocument.markModified("coins") + await req.userdocument.save() + } + + const placeid = await games.countDocuments() + try { + await games.create({ + useridofowner: req.userdocument.userid, + idofgame: placeid, + nameofgame: xss(gamename), + numberofplayers: "0", + descrption: xss(description), + version: version, + }) + } catch { + throw error + } + return res.json({ status: "success", message: "Done!" }) + }) }) -router.post("/uploadmeshes", requireAuth,requirediscord,limiter,async (req, res) => { - uploadasset.single("assetfile")(req, res, async function (err) { - if (err) { - if (err?.message === "File too large"){ - return res.status(400).send({status: 'error', error: "File too large! 1MB Limit"}) - } - if (err === "Invalid file type"){ - return res.status(400).send({status: 'error', error: "Invalid file type"}) - } - return res.status(400).send({status: 'error', error: err.message}) - } - var xss = require("xss") - const {itemname} = req.body - // save mesh - if (!itemname){ - return res.json({status: 'error', error: 'Mesh name needs to be sent.'}) - } - const itemid = await catalog.countDocuments(); - const myArrayBuffer = await fs.promises.readFile(path.resolve(`assets/ugc/itemfile-${itemid}.rbxm`), null) - - if (fileTypeChecker.detectFile(myArrayBuffer)){ - // not a mesh - fs.unlink(path.resolve(`assets/ugc/itemfile-${itemid}.rbxm`), (err => { - if (err) console.log(err) - })) - - return res.json({status: 'error', error: 'Mesh is invalid.'}) - } - - try{ - await catalog.create({ - Name: xss(itemname), - Price: "0", - Type: "Mesh", - Creator: req.userdocument.userid, - Hidden: true, - ItemId: itemid, - approved: true - }) - - - }catch(err){ - throw(err) - } - - return res.json({status: 'success', message: "Done! Mesh ID : "+itemid}) -}) +const uploadasset = multer({ + storage: storage, + fileFilter: function (req, file, callback) { + var ext = path.extname(file.originalname) + if (ext !== ".png" && ext !== ".mesh") { + return callback("Invalid file type") + } + callback(null, true) + }, + limits: { fileSize: 5120 * 1024 }, // 1mb }) -router.post("/uploadbadges", requireAuth,requirediscord,limiter,async (req, res) => { - uploadasset.single("assetfile")(req, res, async function (err) { - if (err) { - if (err?.message === "File too large"){ - return res.status(400).json({status: 'error', error: "File too large! 1MB Limit"}) - } - if (err === "Invalid file type"){ - return res.status(400).json({status: 'error', error: "Invalid file type"}) - } - return res.status(400).json({status: 'error', error: err.message}) - } - var xss = require("xss") - const {itemname} = req.body - // save badge - if (!itemname){ - return res.json({status: 'error', error: 'Badge name needs to be sent.'}) - } - const itemid = await catalog.countDocuments(); +router.post( + "/uploadmeshes", + requireAuth, + requirediscord, + limiter, + async (req, res) => { + uploadasset.single("assetfile")(req, res, async function (err) { + if (err) { + if (err?.message === "File too large") { + return res + .status(400) + .send({ + status: "error", + error: "File too large! 1MB Limit", + }) + } + if (err === "Invalid file type") { + return res + .status(400) + .send({ status: "error", error: "Invalid file type" }) + } + return res + .status(400) + .send({ status: "error", error: err.message }) + } + var xss = require("xss") + const { itemname } = req.body + // save mesh + if (!itemname) { + return res.json({ + status: "error", + error: "Mesh name needs to be sent.", + }) + } + const itemid = await catalog.countDocuments() + const myArrayBuffer = await fs.promises.readFile( + path.resolve(`assets/ugc/itemfile-${itemid}.rbxm`), + null, + ) - //check if the file thye just uploaded is valid - await validateImage(itemid,res) - try{ - let approved = req.userdocument.admin === false ? false : true - await catalog.create({ - Name: xss(itemname), - Price: "0", - Type: "Badge", - Creator: req.userdocument.userid, - Hidden: true, - ItemId: itemid, - approved - }) + if (fileTypeChecker.detectFile(myArrayBuffer)) { + // not a mesh + fs.unlink( + path.resolve(`assets/ugc/itemfile-${itemid}.rbxm`), + err => { + if (err) console.log(err) + }, + ) + return res.json({ status: "error", error: "Mesh is invalid." }) + } - }catch(err){ - throw(err) - } + try { + await catalog.create({ + Name: xss(itemname), + Price: "0", + Type: "Mesh", + Creator: req.userdocument.userid, + Hidden: true, + ItemId: itemid, + approved: true, + }) + } catch (err) { + throw err + } - return res.json({status: 'success', message: "Done! Badge ID : "+itemid}) -}) + return res.json({ + status: "success", + message: "Done! Mesh ID : " + itemid, + }) + }) + }, +) + +router.post( + "/uploadbadges", + requireAuth, + requirediscord, + limiter, + async (req, res) => { + uploadasset.single("assetfile")(req, res, async function (err) { + if (err) { + if (err?.message === "File too large") { + return res + .status(400) + .json({ + status: "error", + error: "File too large! 1MB Limit", + }) + } + if (err === "Invalid file type") { + return res + .status(400) + .json({ status: "error", error: "Invalid file type" }) + } + return res + .status(400) + .json({ status: "error", error: err.message }) + } + var xss = require("xss") + const { itemname } = req.body + // save badge + if (!itemname) { + return res.json({ + status: "error", + error: "Badge name needs to be sent.", + }) + } + const itemid = await catalog.countDocuments() + + //check if the file thye just uploaded is valid + await validateImage(itemid, res) + try { + let approved = req.userdocument.admin === false ? false : true + await catalog.create({ + Name: xss(itemname), + Price: "0", + Type: "Badge", + Creator: req.userdocument.userid, + Hidden: true, + ItemId: itemid, + approved, + }) + } catch (err) { + throw err + } + + return res.json({ + status: "success", + message: "Done! Badge ID : " + itemid, + }) + }) + }, +) + +router.post( + "/uploaduserads", + requireAuth, + requirediscord, + limiter, + async (req, res) => { + uploadasset.single("assetfile")(req, res, async function (err) { + if (err) { + if (err?.message === "File too large") { + return res + .status(400) + .send({ + status: "error", + error: "File too large! 1MB Limit", + }) + } + if (err === "Invalid file type") { + return res + .status(400) + .send({ status: "error", error: "Invalid file type" }) + } + return res + .status(400) + .send({ status: "error", error: err.message }) + } + var xss = require("xss") + const { itemname } = req.body + // save userad + if (!itemname) { + return res.json({ + status: "error", + error: "User Ad name needs to be sent.", + }) + } + const itemid = await catalog.countDocuments() + + // check if the file they just uploaded is valid + await validateImage(itemid, res) + + try { + let approved = req.userdocument.admin === false ? false : true + await catalog.create({ + Name: xss(itemname), + Price: "0", + Type: "User Ad", + Creator: req.userdocument.userid, + ItemId: itemid, + ActiveAd: false, + approved, + }) + } catch (err) { + throw err + } + + return res.json({ status: "success", message: "Done!" }) + }) + }, +) + +router.post( + "/uploadgamepasses", + requireAuth, + requirediscord, + limiter, + async (req, res) => { + uploadasset.single("assetfile")(req, res, async function (err) { + if (err) { + if (err?.message === "File too large") { + return res + .status(400) + .send({ + status: "error", + error: "File too large! 1MB Limit", + }) + } + if (err === "Invalid file type") { + return res + .status(400) + .send({ status: "error", error: "Invalid file type" }) + } + return res + .status(400) + .send({ status: "error", error: err.message }) + } + var xss = require("xss") + const { itemname, price, gameid } = req.body + // save game pass + if (!itemname) { + return res.json({ + status: "error", + error: "Gamepass name needs to be sent.", + }) + } + if (!price) { + return res.json({ + status: "error", + error: "Price needs to be sent.", + }) + } + if (!gameid) { + return res.json({ + status: "error", + error: "Gameid needs to be sent.", + }) + } + if (numbtest.test(price) == false) { + return res.json({ + status: "error", + error: "Price can only be a number!", + }) + } + + if (price < 1) { + return res.json({ + status: "error", + error: "Minimum price is 1 rock.", + }) + } + const gamedoc = await games.findOne({ idofgame: gameid }) + + if (!gamedoc) { + return res.json({ status: "error", error: "Game not found" }) + } + + if (gamedoc.useridofowner != req.userdocument.userid) { + return res.json({ + status: "error", + error: "You don't own this game!", + }) + } + + const currentgamepasscount = await catalog.countDocuments({ + associatedgameid: gamedoc.idofgame, + }) + + if (currentgamepasscount >= 20) { + return res.json({ + status: "error", + error: "No more than 20 game passes per game.", + }) + } + + const itemid = await catalog.countDocuments() + + // check if the file they just uploaded is valid + await validateImage(itemid, res) + + try { + let approved = req.userdocument.admin === false ? false : true + await catalog.create({ + Name: xss(itemname), + Description: "", + Price: Math.ceil(price), + Creator: req.userdocument.userid, + Type: "Gamepass", + ItemId: itemid, + approved, + associatedgameid: gamedoc.idofgame, + }) + } catch (err) { + throw err + } + + return res.json({ status: "success", message: "Done!" }) + }) + }, +) + +router.post( + "/uploadaudios", + requireAuth, + requirediscord, + limiter, + async (req, res) => { + uploadaudio.single("assetfile")(req, res, async function (err) { + if (err) { + if (err?.message === "File too large") { + return res + .status(400) + .send({ + status: "error", + error: "File too large! 5MB Limit", + }) + } + if (err === "Invalid file type") { + return res + .status(400) + .send({ status: "error", error: "Invalid file type" }) + } + return res + .status(400) + .send({ status: "error", error: err.message }) + } + var xss = require("xss") + const { itemname } = req.body + // save audio + if (!itemname) { + return res.json({ + status: "error", + error: "Audio name needs to be sent.", + }) + } + const itemid = await catalog.countDocuments() + + const myArrayBuffer = await fs.promises.readFile( + path.resolve(`assets/ugc/itemfile-${itemid}.rbxm`), + null, + ) + + if ( + fileTypeChecker.isMP3(myArrayBuffer) === false && + fileTypeChecker.isOGG(myArrayBuffer) === false + ) { + fs.unlink( + path.resolve(`assets/ugc/itemfile-${itemid}.rbxm`), + err => { + if (err) console.log(err) + }, + ) + + return res.json({ status: "error", error: "Audio is invalid." }) + } + + try { + let approved = req.userdocument.admin === false ? false : true + await catalog.create({ + Name: xss(itemname), + Price: "0", + Type: "Audio", + Creator: req.userdocument.userid, + Hidden: true, + ItemId: itemid, + approved, + }) + } catch (err) { + throw err + } + + return res.json({ + status: "success", + message: "Done! Audio ID : " + itemid, + }) + }) + }, +) + +const uploadvideo = multer({ + storage: storage, + fileFilter: function (req, file, callback) { + var ext = path.extname(file.originalname) + if (ext !== ".webm") { + return callback("Invalid file type") + } + callback(null, true) + }, + limits: { fileSize: 10240 * 1024 }, // 10mb }) -router.post("/uploaduserads", requireAuth,requirediscord,limiter,async (req, res) => { - uploadasset.single("assetfile")(req, res, async function (err) { - if (err) { - if (err?.message === "File too large"){ - return res.status(400).send({status: 'error', error: "File too large! 1MB Limit"}) - } - if (err === "Invalid file type"){ - return res.status(400).send({status: 'error', error: "Invalid file type"}) - } - return res.status(400).send({status: 'error', error: err.message}) - } - var xss = require("xss") - const {itemname} = req.body - // save userad - if (!itemname){ - return res.json({status: 'error', error: 'User Ad name needs to be sent.'}) - } - const itemid = await catalog.countDocuments(); +router.post( + "/uploadvideos", + requireAuth, + requirediscord, + limiter, + async (req, res) => { + uploadvideo.single("assetfile")(req, res, async function (err) { + if (err) { + if (err?.message === "File too large") { + return res + .status(400) + .send({ + status: "error", + error: "File too large! 10MB Limit", + }) + } + if (err === "Invalid file type") { + return res + .status(400) + .send({ status: "error", error: "Invalid file type" }) + } + return res + .status(400) + .send({ status: "error", error: err.message }) + } + var xss = require("xss") + const { itemname } = req.body + // save audio + if (!itemname) { + return res.json({ + status: "error", + error: "Video name needs to be sent.", + }) + } + const itemid = await catalog.countDocuments() - // check if the file they just uploaded is valid - await validateImage(itemid,res) + const myArrayBuffer = await fs.promises.readFile( + path.resolve(`assets/ugc/itemfile-${itemid}.rbxm`), + null, + ) - try{ - let approved = req.userdocument.admin === false ? false : true - await catalog.create({ - Name: xss(itemname), - Price: "0", - Type: "User Ad", - Creator: req.userdocument.userid, - ItemId: itemid, - ActiveAd: false, - approved - }) + if (fileTypeChecker.isWEBM(myArrayBuffer) === false) { + fs.unlink( + path.resolve(`assets/ugc/itemfile-${itemid}.rbxm`), + err => { + if (err) console.log(err) + }, + ) + return res.json({ status: "error", error: "Video is invalid." }) + } - }catch(err){ - throw(err) - } + try { + let approved = req.userdocument.admin === false ? false : true + await catalog.create({ + Name: xss(itemname), + Price: "0", + Type: "Video", + Creator: req.userdocument.userid, + ItemId: itemid, + approved, + }) + } catch (err) { + throw err + } - return res.json({status: 'success', message: "Done!"}) -}) -}) + return res.json({ + status: "success", + message: "Done! Video ID : " + itemid, + }) + }) + }, +) -router.post("/uploadgamepasses", requireAuth,requirediscord,limiter,async (req, res) => { - uploadasset.single("assetfile")(req, res, async function (err) { - if (err) { - if (err?.message === "File too large"){ - return res.status(400).send({status: 'error', error: "File too large! 1MB Limit"}) - } - if (err === "Invalid file type"){ - return res.status(400).send({status: 'error', error: "Invalid file type"}) - } - return res.status(400).send({status: 'error', error: err.message}) - } - var xss = require("xss") - const {itemname,price,gameid} = req.body - // save game pass - if (!itemname){ - return res.json({status: 'error', error: 'Gamepass name needs to be sent.'}) - } - if (!price){ - return res.json({status: 'error', error: 'Price needs to be sent.'}) - } - if (!gameid){ - return res.json({status: 'error', error: 'Gameid needs to be sent.'}) - } - if (numbtest.test(price) == false){ - return res.json({status: 'error', error: 'Price can only be a number!'}) - } - - if (price < 1){ - return res.json({status: 'error', error: 'Minimum price is 1 rock.'}) - } - const gamedoc = await games.findOne({idofgame: gameid}) - - if (!gamedoc){ - return res.json({status: 'error', error: 'Game not found'}) - } - - if (gamedoc.useridofowner != req.userdocument.userid){ - return res.json({status: 'error', error: "You don't own this game!"}) - } - - const currentgamepasscount = await catalog.countDocuments({associatedgameid: gamedoc.idofgame}) - - if (currentgamepasscount >= 20){ - return res.json({status: 'error', error: 'No more than 20 game passes per game.'}) - } - - const itemid = await catalog.countDocuments() - - // check if the file they just uploaded is valid - await validateImage(itemid,res) - - try{ - let approved = req.userdocument.admin === false ? false : true - await catalog.create({ - Name: xss(itemname), - Description: "", - Price: Math.ceil(price), - Creator: req.userdocument.userid, - Type: "Gamepass", - ItemId: itemid, - approved, - associatedgameid: gamedoc.idofgame - }) - - - }catch(err){ - throw(err) - } - - return res.json({status: 'success', message: "Done!"}) -}) -}) - -router.post("/uploadaudios", requireAuth,requirediscord,limiter,async (req, res) => { - uploadaudio.single("assetfile")(req, res, async function (err) { - if (err) { - if (err?.message === "File too large"){ - return res.status(400).send({status: 'error', error: "File too large! 5MB Limit"}) - } - if (err === "Invalid file type"){ - return res.status(400).send({status: 'error', error: "Invalid file type"}) - } - return res.status(400).send({status: 'error', error: err.message}) - } - var xss = require("xss") - const {itemname} = req.body - // save audio - if (!itemname){ - return res.json({status: 'error', error: 'Audio name needs to be sent.'}) - } - const itemid = await catalog.countDocuments(); - - const myArrayBuffer = await fs.promises.readFile(path.resolve(`assets/ugc/itemfile-${itemid}.rbxm`), null) - - if (fileTypeChecker.isMP3(myArrayBuffer) === false && fileTypeChecker.isOGG(myArrayBuffer) === false){ - fs.unlink(path.resolve(`assets/ugc/itemfile-${itemid}.rbxm`), (err => { - if (err) console.log(err) - })) - - return res.json({status: 'error', error: 'Audio is invalid.'}) - } - - try{ - let approved = req.userdocument.admin === false ? false : true - await catalog.create({ - Name: xss(itemname), - Price: "0", - Type: "Audio", - Creator: req.userdocument.userid, - Hidden: true, - ItemId: itemid, - approved - }) - - - }catch(err){ - throw(err) - } - - return res.json({status: 'success', message: "Done! Audio ID : "+itemid}) -}) -}) - -const uploadvideo = multer({storage: storage, - fileFilter: function (req, file, callback) { - var ext = path.extname(file.originalname); - if(ext !== '.webm') { - return callback('Invalid file type') - } - callback(null, true) - }, - limits: { fileSize: 10240 * 1024 } // 10mb -}) - -router.post("/uploadvideos", requireAuth,requirediscord,limiter,async (req, res) => { - uploadvideo.single("assetfile")(req, res, async function (err) { - if (err) { - if (err?.message === "File too large"){ - return res.status(400).send({status: 'error', error: "File too large! 10MB Limit"}) - } - if (err === "Invalid file type"){ - return res.status(400).send({status: 'error', error: "Invalid file type"}) - } - return res.status(400).send({status: 'error', error: err.message}) - } - var xss = require("xss") - const {itemname} = req.body - // save audio - if (!itemname){ - return res.json({status: 'error', error: 'Video name needs to be sent.'}) - } - const itemid = await catalog.countDocuments(); - - const myArrayBuffer = await fs.promises.readFile(path.resolve(`assets/ugc/itemfile-${itemid}.rbxm`), null) - - if (fileTypeChecker.isWEBM(myArrayBuffer) === false){ - fs.unlink(path.resolve(`assets/ugc/itemfile-${itemid}.rbxm`), (err => { - if (err) console.log(err) - })) - - return res.json({status: 'error', error: 'Video is invalid.'}) - } - - try{ - let approved = req.userdocument.admin === false ? false : true - await catalog.create({ - Name: xss(itemname), - Price: "0", - Type: "Video", - Creator: req.userdocument.userid, - ItemId: itemid, - approved - }) - - - }catch(err){ - throw(err) - } - - return res.json({status: 'success', message: "Done! Video ID : "+itemid}) -}) -}) - -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/game.js b/Back/routes/game.js index 341eb39..57c3ec6 100644 --- a/Back/routes/game.js +++ b/Back/routes/game.js @@ -1,37 +1,43 @@ const express = require("express") const router = express.Router() const signatures = require("./signatures.js") -const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args)); -const User = require('../model/user.js') -const { requireAuth } = require('../middleware/authmiddlewaregame') -const rcctalk = require('../rcctalk') -const games = require('../model/games.js') -const catalog = require('../model/item.js') -const rcc = require('../model/rcc.js') -var sanitize = require('mongo-sanitize'); -const { getPort, checkPort, getRandomPort, waitForPort } = require('get-port-please') -const fs = require('fs') -const gamescript = fs.readFileSync('actualgameserver.lua','utf-8') -require('dotenv').config() +const fetch = (...args) => + import("node-fetch").then(({ default: fetch }) => fetch(...args)) +const User = require("../model/user.js") +const { requireAuth } = require("../middleware/authmiddlewaregame") +const rcctalk = require("../rcctalk") +const games = require("../model/games.js") +const catalog = require("../model/item.js") +const rcc = require("../model/rcc.js") +var sanitize = require("mongo-sanitize") +const { + getPort, + checkPort, + getRandomPort, + waitForPort, +} = require("get-port-please") +const fs = require("fs") +const gamescript = fs.readFileSync("actualgameserver.lua", "utf-8") +require("dotenv").config() const RCC_HOST = process.env.RCC_HOST const logshook = process.env.logshook -const crypto = require('crypto'); -const key = fs.readFileSync('DefaultPrivateKey.pem') -const key2 = fs.readFileSync('DefaultPrivateKey.pem') -const key2020 = fs.readFileSync('PrivateKey2020.txt') -const { _2020placelauncher } = require('../routes/2020/game') -const { _2018placelauncher } = require('../routes/2018/game') +const crypto = require("crypto") +const key = fs.readFileSync("DefaultPrivateKey.pem") +const key2 = fs.readFileSync("DefaultPrivateKey.pem") +const key2020 = fs.readFileSync("PrivateKey2020.txt") +const { _2020placelauncher } = require("../routes/2020/game") +const { _2018placelauncher } = require("../routes/2018/game") //join and placelauncher function sleep(ms) { - return new Promise((resolve) => { - setTimeout(resolve, ms); - }); - } + return new Promise(resolve => { + setTimeout(resolve, ms) + }) +} - router.get("/visit",async (req, res) => { - // studio - const string = `local RS = game:GetService("RunService") +router.get("/visit", async (req, res) => { + // studio + const string = `local RS = game:GetService("RunService") local P = game:GetService("Players") local LP = P:CreateLocalPlayer(0) LP.CharacterAppearance = "" @@ -65,349 +71,501 @@ pcall(function() game:GetService("InsertService"):SetFreeDecalUrl("http://mete0r ` - const sign = crypto.createSign('SHA1'); - sign.update("\r\n" + string) - var signature = sign.sign(key, "base64") + const sign = crypto.createSign("SHA1") + sign.update("\r\n" + string) + var signature = sign.sign(key, "base64") - res.send("--rbxsig%"+signature+"%\r\n" +string) - }) + res.send("--rbxsig%" + signature + "%\r\n" + string) +}) +router.get(["/GetCurrentUser", "/GetCurrentUser.ashx"], async (req, res) => { + res.send("1") // 1 means logged in and null means logged out +}) // don't send 404 error but i don't think we will have studio publishing - router.get(["/GetCurrentUser","/GetCurrentUser.ashx"],async (req, res) => { +router.post("/validate-machine", async (req, res) => { + res.json({ success: true, message: "" }) +}) - res.send("1") // 1 means logged in and null means logged out - }) // don't send 404 error but i don't think we will have studio publishing +router.get(["/join", "/join.ashx"], requireAuth, async (req, res) => { + if (!req.userdocument.discordid) { + return res.json({ + status: "error", + error: "Link your discord account stinky", + }) + } + if (req.query.ver === "2018") { + if ( + !req.userdocument.gamejoin2018 || + req.userdocument.gamejoin2018 === "{}" + ) { + return res.json({ status: "error", error: "no placelauncher" }) + } + var joinJson = JSON.parse(req.userdocument.gamejoin2018) + req.userdocument.gamejoin2018 = undefined + req.userdocument.markModified("gamejoin2018") + await req.userdocument.save() + //sign with our sign module + var signature = signatures.signer(joinJson) + //console.log(signature) - router.post("/validate-machine",async (req, res) => { + return res.send( + "--rbxsig%" + signature + "%\r\n" + JSON.stringify(joinJson), + ) + } + if (req.query.ver === "2020") { + if ( + !req.userdocument.gamejoin2020 || + req.userdocument.gamejoin2020 === "{}" + ) { + return res.json({ status: "error", error: "no placelauncher" }) + } + var joinJson = JSON.parse(req.userdocument.gamejoin2020) + req.userdocument.gamejoin2020 = undefined + req.userdocument.markModified("gamejoin2020") + await req.userdocument.save() + //sign with our sign module + const sign = crypto.createSign("SHA1") + sign.update("\r\n" + JSON.stringify(joinJson)) + var signature = sign.sign(key2020, "base64") - res.json({"success":true,"message":""}) - }) + //console.log(signature) -router.get(["/join","/join.ashx"],requireAuth,async (req, res) => { - if (!req.userdocument.discordid){ - return res.json({status:"error",error:"Link your discord account stinky"}) - } - if (req.query.ver === "2018"){ - if (!req.userdocument.gamejoin2018 || req.userdocument.gamejoin2018 === "{}"){ - return res.json({status:"error",error:"no placelauncher"}) - } - var joinJson = JSON.parse(req.userdocument.gamejoin2018) - req.userdocument.gamejoin2018 = undefined - req.userdocument.markModified('gamejoin2018') - await req.userdocument.save() - //sign with our sign module - var signature = signatures.signer(joinJson) - //console.log(signature) + return res.send( + "--rbxsig2%" + signature + "%\r\n" + JSON.stringify(joinJson), + ) + } + if (!req.userdocument.gamejoin || req.userdocument.gamejoin === "{}") { + return res.json({ status: "error", error: "no placelauncher" }) + } + var joinJson = JSON.parse(req.userdocument.gamejoin) + req.userdocument.gamejoin = undefined + req.userdocument.markModified("gamejoin") + await req.userdocument.save() + //sign with our sign module + var signature = signatures.signer(joinJson) + //console.log(signature) - return res.send("--rbxsig%"+signature+"%\r\n"+JSON.stringify(joinJson)) - } - if (req.query.ver === "2020"){ - if (!req.userdocument.gamejoin2020 || req.userdocument.gamejoin2020 === "{}"){ - return res.json({status:"error",error:"no placelauncher"}) - } - var joinJson = JSON.parse(req.userdocument.gamejoin2020) - req.userdocument.gamejoin2020 = undefined - req.userdocument.markModified('gamejoin2020') - await req.userdocument.save() - //sign with our sign module - const sign = crypto.createSign('SHA1'); - sign.update("\r\n" + JSON.stringify(joinJson)) - var signature = sign.sign(key2020, "base64") - - //console.log(signature) + res.send("--rbxsig%" + signature + "%\r\n" + JSON.stringify(joinJson)) +}) - return res.send("--rbxsig2%"+signature+"%\r\n"+JSON.stringify(joinJson)) - } - if (!req.userdocument.gamejoin || req.userdocument.gamejoin === "{}"){ - return res.json({status:"error",error:"no placelauncher"}) - } - var joinJson = JSON.parse(req.userdocument.gamejoin) - req.userdocument.gamejoin = undefined - req.userdocument.markModified('gamejoin') - await req.userdocument.save() - //sign with our sign module - var signature = signatures.signer(joinJson) - //console.log(signature) +router.all( + ["/placelauncher", "/placelauncher.ashx"], + requireAuth, + _2020placelauncher, + _2018placelauncher, + async (req, res, next) => { + var enabled = req.config + if (enabled.GamesEnabled === false) { + return res.json({ + status: "error", + error: "Games are disabled bad boy", + }) + } + var joinJson = { + ClientPort: 0, + MachineAddress: "localhost", + ServerPort: 25564, + PingUrl: "", + PingInterval: 120, + UserName: "default", + SeleniumTestMode: false, + UserId: 0, + SuperSafeChat: false, + CharacterAppearance: + "http://shitncumblox.gq/game/charapp?name=default", + ClientTicket: "", + GameId: 1, + PlaceId: 1818, + MeasurementUrl: "", + WaitingForCharacterGuid: "cad99b30-7983-434b-b24c-eac12595e5fd", + BaseUrl: "http://www.mete0r.xyz/", + ChatStyle: "ClassicAndBubble", + VendorId: 0, + ScreenShotInfo: "", + VideoInfo: + 'GamesROBLOX, video, free game, online virtual world', + CreatorId: 0, + CreatorTypeEnum: "User", + MembershipType: "None", + AccountAge: 365, + CookieStoreFirstTimePlayKey: "rbx_evt_ftp", + CookieStoreFiveMinutePlayKey: "rbx_evt_fmp", + CookieStoreEnabled: true, + IsRobloxPlace: false, + GenerateTeleportJoin: false, + IsUnknownOrUnder13: false, + SessionId: + "c25fd620-bbaa-4fb2-b022-3f053cdd1abd|00000000-0000-0000-0000-000000000000|0|204.236.226.210|8|2016-08-17T01:05:05.7115837Z|0|null|null|null|null", + DataCenterId: 0, + UniverseId: 0, + BrowserTrackerId: 0, + UsePortraitMode: false, + FollowUserId: 0, + CharacterAppearanceId: 1, + } + if (!req.query.name && !req.query.placeId) { + return res.json({ status: "error", error: "no placeid bad" }) + } + if (req.userdocument.gamejoin) { + return res.json({ + jobId: "Test", + status: 2, + joinScriptUrl: + "http://mete0r.xyz/game/join.ashx?auth=" + req.query.auth ?? + req.cookies.jwt, + authenticationUrl: "http://mete0r.xyz/Login/Negotiate.ashx", + authenticationTicket: "SomeTicketThatDosentCrash", + message: "", + }) + } + var sanitizedplaceid = sanitize(req.query.name ?? req.query.placeId) + const game = await games.findOne({ idofgame: sanitizedplaceid }).lean() + if (!game) { + return res.json({ + status: "error", + error: "that game doesn't exist!", + }) + } + if (game.version != "2016") { + return res.json({ + status: "error", + error: "game version is different than client requested", + }) + } + const instance = await rcc.findOne({ PlaceId: sanitizedplaceid }).lean() + if (instance && instance.Status === 2) { + // if an rcc instance already exists we don't need to create a new one so we will just drag them into the existing game + joinJson.UserName = req.userdocument.username + joinJson.UserId = req.userdocument.userid + joinJson.CharacterAppearance = + "http://mete0r.xyz/game/charapp?name=" + req.userdocument.userid + joinJson.MachineAddress = RCC_HOST // need to put rcc host here lol + joinJson.ServerPort = instance.Port + joinJson.PlaceId = instance.PlaceId + joinJson.GameId = sanitizedplaceid + joinJson.CharacterAppearanceId = req.userdocument.userid + joinJson.MembershipType = req.userdocument.membership + joinJson.CreatorId = game.useridofowner + joinJson.SessionId = req.query.auth ?? req.cookies.jwt - res.send("--rbxsig%"+signature+"%\r\n"+JSON.stringify(joinJson)) -}) + const timestamp = Date.now() + joinJson.ClientTicket = timestamp + ";" // timestamp + //create signature 1 + const sign1 = crypto.createSign("SHA1") + sign1.update( + `${req.userdocument.userid}\n` /*userid*/ + + `${req.userdocument.username}\n` /*username*/ + + `http://mete0r.xyz/game/charapp?name=${req.userdocument.userid}\n` /*charapp*/ + + `game${sanitizedplaceid}\n` /*jobid*/ + + timestamp /*timestamp*/, + ) + var signature1 = sign1.sign(key, "base64") + joinJson.ClientTicket += signature1 + ";" -router.all(["/placelauncher","/placelauncher.ashx"],requireAuth,_2020placelauncher,_2018placelauncher,async (req, res, next) => { - var enabled = req.config - if (enabled.GamesEnabled === false){ - return res.json({status:"error",error:"Games are disabled bad boy"}) - } - var joinJson = {"ClientPort":0,"MachineAddress":"localhost","ServerPort":25564,"PingUrl":"","PingInterval":120,"UserName":"default","SeleniumTestMode":false,"UserId":0,"SuperSafeChat":false,"CharacterAppearance":"http://shitncumblox.gq/game/charapp?name=default","ClientTicket":"","GameId":1,"PlaceId":1818,"MeasurementUrl":"","WaitingForCharacterGuid":"cad99b30-7983-434b-b24c-eac12595e5fd","BaseUrl":"http://www.mete0r.xyz/","ChatStyle":"ClassicAndBubble","VendorId":0,"ScreenShotInfo":"","VideoInfo":"GamesROBLOX, video, free game, online virtual world","CreatorId":0,"CreatorTypeEnum":"User","MembershipType":"None","AccountAge":365,"CookieStoreFirstTimePlayKey":"rbx_evt_ftp","CookieStoreFiveMinutePlayKey":"rbx_evt_fmp","CookieStoreEnabled":true,"IsRobloxPlace":false,"GenerateTeleportJoin":false,"IsUnknownOrUnder13":false,"SessionId":"c25fd620-bbaa-4fb2-b022-3f053cdd1abd|00000000-0000-0000-0000-000000000000|0|204.236.226.210|8|2016-08-17T01:05:05.7115837Z|0|null|null|null|null","DataCenterId":0,"UniverseId":0,"BrowserTrackerId":0,"UsePortraitMode":false,"FollowUserId":0,"CharacterAppearanceId":1} - if (!req.query.name && !req.query.placeId){ - return res.json({status:"error",error:"no placeid bad"}) - } - if (req.userdocument.gamejoin){ - return res.json({"jobId":"Test","status":2,"joinScriptUrl":"http://mete0r.xyz/game/join.ashx?auth="+req.query.auth??req.cookies.jwt,"authenticationUrl":"http://mete0r.xyz/Login/Negotiate.ashx","authenticationTicket":"SomeTicketThatDosentCrash","message":""}) - } - var sanitizedplaceid = sanitize(req.query.name??req.query.placeId) - const game = await games.findOne({idofgame: sanitizedplaceid}).lean() - if (!game){ - return res.json({status:"error",error:"that game doesn't exist!"}) - } - if (game.version != "2016"){ - return res.json({status: "error",error:"game version is different than client requested"}) - } - const instance = await rcc.findOne({PlaceId: sanitizedplaceid}).lean() - if (instance && instance.Status === 2){ - // if an rcc instance already exists we don't need to create a new one so we will just drag them into the existing game - joinJson.UserName = req.userdocument.username - joinJson.UserId = req.userdocument.userid - joinJson.CharacterAppearance = "http://mete0r.xyz/game/charapp?name=" + req.userdocument.userid - joinJson.MachineAddress = RCC_HOST // need to put rcc host here lol - joinJson.ServerPort = instance.Port - joinJson.PlaceId = instance.PlaceId - joinJson.GameId = sanitizedplaceid - joinJson.CharacterAppearanceId = req.userdocument.userid - joinJson.MembershipType = req.userdocument.membership - joinJson.CreatorId = game.useridofowner - joinJson.SessionId = req.query.auth??req.cookies.jwt + //create signature 2 + const sign2 = crypto.createSign("SHA1") + sign2.update( + `${req.userdocument.userid}\n` /*userid*/ + + `game${sanitizedplaceid}\n` /*jobid*/ + + timestamp /*timestamp*/, + ) + var signature2 = sign2.sign(key, "base64") + joinJson.ClientTicket += signature2 - const timestamp = Date.now() - joinJson.ClientTicket = timestamp+";" // timestamp - //create signature 1 - const sign1 = crypto.createSign('SHA1'); - sign1.update(`${req.userdocument.userid}\n`/*userid*/+`${req.userdocument.username}\n`/*username*/+`http://mete0r.xyz/game/charapp?name=${req.userdocument.userid}\n`/*charapp*/+`game${sanitizedplaceid}\n`/*jobid*/+ timestamp/*timestamp*/) - var signature1 = sign1.sign(key, "base64") - joinJson.ClientTicket += signature1 + ";" - - //create signature 2 - const sign2 = crypto.createSign('SHA1'); - sign2.update(`${req.userdocument.userid}\n`/*userid*/+`game${sanitizedplaceid}\n`/*jobid*/+ timestamp/*timestamp*/) - var signature2 = sign2.sign(key, "base64") - joinJson.ClientTicket += signature2 - - req.userdocument.gamejoin = JSON.stringify(joinJson) - req.userdocument.markModified('gamejoin') - await req.userdocument.save() - var joinScriptJson = {"jobId":"Test","status":2,"joinScriptUrl":"http://mete0r.xyz/game/join.ashx?auth="+joinJson.SessionId,"authenticationUrl":"http://mete0r.xyz/Login/Negotiate.ashx","authenticationTicket":"SomeTicketThatDosentCrash","message":""} + req.userdocument.gamejoin = JSON.stringify(joinJson) + req.userdocument.markModified("gamejoin") + await req.userdocument.save() + var joinScriptJson = { + jobId: "Test", + status: 2, + joinScriptUrl: + "http://mete0r.xyz/game/join.ashx?auth=" + + joinJson.SessionId, + authenticationUrl: "http://mete0r.xyz/Login/Negotiate.ashx", + authenticationTicket: "SomeTicketThatDosentCrash", + message: "", + } + return res.send(JSON.stringify(joinScriptJson)) + } + if (instance && instance.Status === 1) { + var joinScriptJson = { + jobId: "Test", + status: 1, + joinScriptUrl: + "http://mete0r.xyz/game/join.ashx?auth=" + + joinJson.SessionId, + authenticationUrl: "http://mete0r.xyz/Login/Negotiate.ashx", + authenticationTicket: "SomeTicketThatDosentCrash", + message: "", + } + return res.send(JSON.stringify(joinScriptJson)) + } - return res.send(JSON.stringify(joinScriptJson)) - } - if (instance && instance.Status === 1){ - var joinScriptJson = {"jobId":"Test","status":1,"joinScriptUrl":"http://mete0r.xyz/game/join.ashx?auth="+joinJson.SessionId,"authenticationUrl":"http://mete0r.xyz/Login/Negotiate.ashx","authenticationTicket":"SomeTicketThatDosentCrash","message":""} - return res.send(JSON.stringify(joinScriptJson)) - } + var port = await getPort({ random: true }) + var newgamescript = + "local placeId = " + sanitizedplaceid + "\n" + gamescript + newgamescript = "local port = " + port + "\n" + newgamescript + // launch job + var response = await rcctalk.OpenJob( + "game" + sanitizedplaceid, + newgamescript, + "99999", + ) + await rcc.create({ + PlaceId: sanitizedplaceid, + Port: port, + Status: 1, // 1 means loading + }) + //console.log(newrenderscript) - var port = await getPort({random: true}) - var newgamescript = "local placeId = "+sanitizedplaceid+"\n"+ gamescript - newgamescript = "local port = "+port+"\n"+ newgamescript - // launch job - var response = await rcctalk.OpenJob("game"+sanitizedplaceid,newgamescript,"99999") - await rcc.create({ - PlaceId: sanitizedplaceid, - Port: port, - Status: 1 // 1 means loading - }) - - //console.log(newrenderscript) - - var joinScriptJson = {"jobId":"Test","status":1,"joinScriptUrl":"http://mete0r.xyz/game/join.ashx?auth="+joinJson.SessionId,"authenticationUrl":"http://mete0r.xyz/Login/Negotiate.ashx","authenticationTicket":"SomeTicketThatDosentCrash","message":""} - res.send(JSON.stringify(joinScriptJson)) - -} + var joinScriptJson = { + jobId: "Test", + status: 1, + joinScriptUrl: + "http://mete0r.xyz/game/join.ashx?auth=" + joinJson.SessionId, + authenticationUrl: "http://mete0r.xyz/Login/Negotiate.ashx", + authenticationTicket: "SomeTicketThatDosentCrash", + message: "", + } + res.send(JSON.stringify(joinScriptJson)) + }, ) //charapp and colors stealing from roblox - router.get("/charapp", async (req, res) => { - if (Object.keys(req.query).length === 0) { - res.status(404).send('No variables :('); - } else{ - const user = await User.findOne({userid: req.query.name}).lean() - const placeid = req.headers?.['roblox-place-id']??0 - const placedoc = await games.findOne({idofgame: placeid}) - if (!placedoc){ - return res.json({status:"error",error:"Place not found."}) - } + if (Object.keys(req.query).length === 0) { + res.status(404).send("No variables :(") + } else { + const user = await User.findOne({ userid: req.query.name }).lean() + const placeid = req.headers?.["roblox-place-id"] ?? 0 + const placedoc = await games.findOne({ idofgame: placeid }) + if (!placedoc) { + return res.json({ status: "error", error: "Place not found." }) + } - if (!user) { - return res.json({status: 'error', error: 'User not found!'}) - } + if (!user) { + return res.json({ status: "error", error: "User not found!" }) + } - if (!user.inventory){ - if (req.query.rcc){ - return res.json([]) - } - return res.send('http://mete0r.xyz/game/colors?name='+req.query.name+';') - } + if (!user.inventory) { + if (req.query.rcc) { + return res.json([]) + } + return res.send( + "http://mete0r.xyz/game/colors?name=" + req.query.name + ";", + ) + } - if (req.query.rcc){ - var empty = [] - for (var key of user.inventory) { - if (key.Equipped === true){ - empty.push({"item": {itemid: key.ItemId, type: key.Type}}) - } - } - return res.json(empty) - } + if (req.query.rcc) { + var empty = [] + for (var key of user.inventory) { + if (key.Equipped === true) { + empty.push({ item: { itemid: key.ItemId, type: key.Type } }) + } + } + return res.json(empty) + } + var charapp = "http://mete0r.xyz/asset?name=" + req.query.name + ";" + // add to charapp string by adding json to it + for (var key of user.inventory) { + if (key.Equipped === true) { + if (placedoc.gearallowed ?? false === true) { + charapp += "http://mete0r.xyz/asset?id=" + key.ItemId + ";" + } else { + if (key.Type != "Gears") { + charapp += + "http://mete0r.xyz/asset?id=" + key.ItemId + ";" + } + } + } + } - var charapp = 'http://mete0r.xyz/asset?name='+req.query.name+';' - // add to charapp string by adding json to it - for (var key of user.inventory) { - if (key.Equipped === true){ - if (placedoc.gearallowed??false === true){ - charapp += "http://mete0r.xyz/asset?id=" + key.ItemId + ";" - }else{ - if (key.Type != "Gears"){ - charapp += "http://mete0r.xyz/asset?id=" + key.ItemId + ";" - } - } - } - } - - res.write(charapp) - res.end() - } + res.write(charapp) + res.end() + } }) router.get("/colors", async (req, res) => { - if (Object.keys(req.query).length === 0) { - res.status(404).send('No variables :('); - } else{ - const user = await User.findOne({userid: req.query.name}).lean() - if (!user) { - return res.json({status: 'error', error: 'User not found!'}) - } + if (Object.keys(req.query).length === 0) { + res.status(404).send("No variables :(") + } else { + const user = await User.findOne({ userid: req.query.name }).lean() + if (!user) { + return res.json({ status: "error", error: "User not found!" }) + } - if (req.query.rcc){ - var empty = [] - for (var key of user.colors) { - empty.push(key.value) - } - return res.json(empty) - } + if (req.query.rcc) { + var empty = [] + for (var key of user.colors) { + empty.push(key.value) + } + return res.json(empty) + } - - res.type('application/xml'); - var colorsxml = ` + res.type("application/xml") + var colorsxml = + ` null nil - `+user.colors.find(x => x.name === 'Head').value+` - `+user.colors.find(x => x.name === 'Left Arm').value+` - `+user.colors.find(x => x.name === 'Left Leg').value+` + ` + + user.colors.find(x => x.name === "Head").value + + ` + ` + + user.colors.find(x => x.name === "Left Arm").value + + ` + ` + + user.colors.find(x => x.name === "Left Leg").value + + ` Body Colors - `+user.colors.find(x => x.name === 'Right Arm').value+` - `+user.colors.find(x => x.name === 'Right Leg').value+` - `+user.colors.find(x => x.name === 'Torso').value+` + ` + + user.colors.find(x => x.name === "Right Arm").value + + ` + ` + + user.colors.find(x => x.name === "Right Leg").value + + ` + ` + + user.colors.find(x => x.name === "Torso").value + + ` true ` - res.send(colorsxml) - - } + res.send(colorsxml) + } }) router.get("/", (req, res) => { - res.status(404).send('hmmm? kinda sus'); + res.status(404).send("hmmm? kinda sus") }) router.get("/players/:id", (req, res) => { - res.json({"ChatFilter":"whitelist"}) + res.json({ ChatFilter: "whitelist" }) }) router.post("/load-place-info", (req, res) => { - res.json({"CreatorId": 0, "CreatorType": "User", "PlaceVersion": 1}) + res.json({ CreatorId: 0, CreatorType: "User", PlaceVersion: 1 }) }) -router.post("/badge/awardbadge",async (req, res) => { - const userid = req.query.UserID - const badgeid = req.query.BadgeID - const placeid = req.query.PlaceID +router.post("/badge/awardbadge", async (req, res) => { + const userid = req.query.UserID + const badgeid = req.query.BadgeID + const placeid = req.query.PlaceID - const badge = await catalog.findOne({ItemId: badgeid}).lean() - const user = await User.findOne({userid: userid}).lean() + const badge = await catalog.findOne({ ItemId: badgeid }).lean() + const user = await User.findOne({ userid: userid }).lean() - if(!badge){ - //Badge doesn't exist! - return res.send("0") - } + if (!badge) { + //Badge doesn't exist! + return res.send("0") + } - if(!user){ - return res.send("0") - } + if (!user) { + return res.send("0") + } - const badgecreator = await User.findOne({userid: badge.Creator}).lean() + const badgecreator = await User.findOne({ userid: badge.Creator }).lean() - if (typeof user.badges !== "undefined"){ - // check if user already owns item - for (var v of user.badges){ - if (v.badgeid === badgeid){ - // they already own it - return res.send("0") - } - } - } + if (typeof user.badges !== "undefined") { + // check if user already owns item + for (var v of user.badges) { + if (v.badgeid === badgeid) { + // they already own it + return res.send("0") + } + } + } - User.updateOne({userid: req.query.UserID}, { - $push: { - badges: {badgeid: badgeid, badgename: badge.Name, creator: badge.Creator, placeid: placeid} - } - }, - function(err, doc) { - if (err){ - return res.send("0") - } - }) + User.updateOne( + { userid: req.query.UserID }, + { + $push: { + badges: { + badgeid: badgeid, + badgename: badge.Name, + creator: badge.Creator, + placeid: placeid, + }, + }, + }, + function (err, doc) { + if (err) { + return res.send("0") + } + }, + ) - return res.send(user.username+" won "+badgecreator.username+"'s "+badge.Name+" award!") + return res.send( + user.username + + " won " + + badgecreator.username + + "'s " + + badge.Name + + " award!", + ) }) +router.get( + [ + "/LuaWebService/HandleSocialRequest", + "/LuaWebService/HandleSocialRequest.ashx", + ], + async (req, res) => { + res.type("application/xml") + if (req.query.method === "IsInGroup") { + if (req.query.groupid === "0" || req.query.groupid === "1200769") { + // 1200769 admin group + const user = await User.findOne({ + userid: req.query.playerid, + }).lean() + if (user) { + return res.send( + `${user.admin}`, + ) + } + } + return res.send('false') + } + if (req.query.method === "GetGroupRank") { + if (req.query.groupid === "0" || req.query.groupid === "1200769") { + const user = await User.findOne({ + userid: req.query.playerid, + }).lean() + if (user) { + if (user.admin === true) { + return res.send(`255`) + } + } + } + return res.send('0') + } + if (req.query.method === "IsBestFriendsWith") { + return res.send('false') + } + if (req.query.method === "IsFriendsWith") { + return res.send('false') + } + res.type("html") + return res.status(404).end() + }, +) -router.get(["/LuaWebService/HandleSocialRequest","/LuaWebService/HandleSocialRequest.ashx"],async (req, res) => { - res.type('application/xml'); - if (req.query.method === "IsInGroup"){ - if (req.query.groupid === '0' || req.query.groupid === '1200769'){ // 1200769 admin group - const user = await User.findOne({userid: req.query.playerid}).lean() - if (user){ - return res.send(`${user.admin}`) - } - } - return res.send('false') - } - if (req.query.method === "GetGroupRank"){ - if (req.query.groupid === '0'|| req.query.groupid === '1200769'){ - const user = await User.findOne({userid: req.query.playerid}).lean() - if (user){ - if (user.admin === true){ - return res.send(`255`) - } - } - } - return res.send('0') - } - if (req.query.method === "IsBestFriendsWith"){ - return res.send('false') - } - if (req.query.method === "IsFriendsWith"){ - return res.send('false') - } - res.type('html'); - return res.status(404).end() +router.get("/Tools/InsertAsset.ashx", async (req, res) => { + const lol = await fetch("http://sets.pizzaboxer.xyz/Game" + req.url) + if (lol.status === 400) { + return res.send(``) + } + return res.send(await lol.text()) }) -router.get("/Tools/InsertAsset.ashx",async (req, res) => { - const lol = await fetch('http://sets.pizzaboxer.xyz/Game'+req.url); - if (lol.status === 400){ - return res.send(``) - } - return res.send(await lol.text()) +router.post("/MachineConfiguration.ashx", (req, res) => { + res.json({ success: true }) }) -router.post("/MachineConfiguration.ashx", (req,res) => { - res.json({"success": true}) -}) - -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/games.js b/Back/routes/games.js index 5f34821..78d7e67 100644 --- a/Back/routes/games.js +++ b/Back/routes/games.js @@ -1,214 +1,320 @@ const express = require("express") const router = express.Router() -const { requireAuth } = require('./../middleware/authmiddleware') -const games = require('./../model/games.js') +const { requireAuth } = require("./../middleware/authmiddleware") +const games = require("./../model/games.js") const catalog = require("./../model/item.js") -const { grabAuth } = require('./../middleware/grabauth.js') -const rcc = require('./../model/rcc.js') -const rcc2018 = require('./../model/rcc2018.js') -const rcc2020 = require('./../model/rcc2020.js') -const rcctalk = require('./../rcctalk') -const rcctalk2018 = require('./../rcctalk2018') -const bodyParser = require('body-parser') +const { grabAuth } = require("./../middleware/grabauth.js") +const rcc = require("./../model/rcc.js") +const rcc2018 = require("./../model/rcc2018.js") +const rcc2020 = require("./../model/rcc2020.js") +const rcctalk = require("./../rcctalk") +const rcctalk2018 = require("./../rcctalk2018") +const bodyParser = require("body-parser") router.use(bodyParser.json()) router.post("/scroll", async (req, res) => { - const resultsPerPage = 10 - let cursor = req.body.cursor >= 0 ? req.body.cursor : 0 - let type = req.body.type ? req.body.type : "Popular" - let allowed = ['idofgame', 'version', 'nameofgame', 'numberofplayers', 'visits', 'useridofowner'] - try{ - if (type === "Popular"){ - const response = await games.find().sort({numberofplayers: "descending", idofgame: 1}).skip(0+parseFloat(cursor)*resultsPerPage).limit(10).lean().select(allowed).populate("owner", "username") - return res.json(response) - } - if (type === "OurRecommendations"){ - const featured = await games.find({featured: true}).skip(0+parseFloat(cursor)*resultsPerPage).limit(10).lean().select(allowed).populate("owner", "username") - return res.json(featured) - } - if (type === "Visits"){ - const mostvisitedresponse = await games.find().sort({visits: "descending", idofgame: 1}).skip(0+parseFloat(cursor)*resultsPerPage).limit(10).lean().select(allowed).populate("owner", "username") - return res.json(mostvisitedresponse) - } - if (type === "NewestArrivals"){ - const newest = await games.find().sort({idofgame: "descending"}).skip(0+parseFloat(cursor)*resultsPerPage).limit(10).lean().select(allowed).populate("owner", "username") - return res.json(newest) - } - return res.json({status: "error", error: "wtf"}) - - - - - } catch (error) { - console.log(error) - return res.json({status: "error", error: "wtf"}) - } - + const resultsPerPage = 10 + let cursor = req.body.cursor >= 0 ? req.body.cursor : 0 + let type = req.body.type ? req.body.type : "Popular" + let allowed = [ + "idofgame", + "version", + "nameofgame", + "numberofplayers", + "visits", + "useridofowner", + ] + try { + if (type === "Popular") { + const response = await games + .find() + .sort({ numberofplayers: "descending", idofgame: 1 }) + .skip(0 + parseFloat(cursor) * resultsPerPage) + .limit(10) + .lean() + .select(allowed) + .populate("owner", "username") + return res.json(response) + } + if (type === "OurRecommendations") { + const featured = await games + .find({ featured: true }) + .skip(0 + parseFloat(cursor) * resultsPerPage) + .limit(10) + .lean() + .select(allowed) + .populate("owner", "username") + return res.json(featured) + } + if (type === "Visits") { + const mostvisitedresponse = await games + .find() + .sort({ visits: "descending", idofgame: 1 }) + .skip(0 + parseFloat(cursor) * resultsPerPage) + .limit(10) + .lean() + .select(allowed) + .populate("owner", "username") + return res.json(mostvisitedresponse) + } + if (type === "NewestArrivals") { + const newest = await games + .find() + .sort({ idofgame: "descending" }) + .skip(0 + parseFloat(cursor) * resultsPerPage) + .limit(10) + .lean() + .select(allowed) + .populate("owner", "username") + return res.json(newest) + } + return res.json({ status: "error", error: "wtf" }) + } catch (error) { + console.log(error) + return res.json({ status: "error", error: "wtf" }) + } }) router.post("/firstpaint", async (req, res) => { - const resultsPerPage = 10 - let cursor = 0 - let allowed = ['idofgame', 'version', 'nameofgame', 'numberofplayers', 'visits', 'useridofowner'] - try{ - const response = await games.find().sort({numberofplayers: "descending", idofgame: 1}).skip(0+parseFloat(cursor)*resultsPerPage).limit(10).lean().select(allowed).populate("owner", "username") - const featured = await games.find({featured: true}).skip(0+parseFloat(cursor)*resultsPerPage).limit(10).lean().select(allowed).populate("owner", "username") - const mostvisitedresponse = await games.find().sort({visits: "descending", idofgame: 1}).skip(0+parseFloat(cursor)*resultsPerPage).limit(10).lean().select(allowed).populate("owner", "username") - const newest = await games.find().sort({idofgame: "descending"}).skip(0+parseFloat(cursor)*resultsPerPage).limit(10).lean().select(allowed).populate("owner", "username") - return res.json({Popular: {array: response},OurRecommendations: {array: featured}, Visits: {array: mostvisitedresponse}, NewestArrivals: {array: newest} }) - - } catch (error) { - console.log(error) - return res.json({status: "error", error: "wtf"}) - } - + const resultsPerPage = 10 + let cursor = 0 + let allowed = [ + "idofgame", + "version", + "nameofgame", + "numberofplayers", + "visits", + "useridofowner", + ] + try { + const response = await games + .find() + .sort({ numberofplayers: "descending", idofgame: 1 }) + .skip(0 + parseFloat(cursor) * resultsPerPage) + .limit(10) + .lean() + .select(allowed) + .populate("owner", "username") + const featured = await games + .find({ featured: true }) + .skip(0 + parseFloat(cursor) * resultsPerPage) + .limit(10) + .lean() + .select(allowed) + .populate("owner", "username") + const mostvisitedresponse = await games + .find() + .sort({ visits: "descending", idofgame: 1 }) + .skip(0 + parseFloat(cursor) * resultsPerPage) + .limit(10) + .lean() + .select(allowed) + .populate("owner", "username") + const newest = await games + .find() + .sort({ idofgame: "descending" }) + .skip(0 + parseFloat(cursor) * resultsPerPage) + .limit(10) + .lean() + .select(allowed) + .populate("owner", "username") + return res.json({ + Popular: { array: response }, + OurRecommendations: { array: featured }, + Visits: { array: mostvisitedresponse }, + NewestArrivals: { array: newest }, + }) + } catch (error) { + console.log(error) + return res.json({ status: "error", error: "wtf" }) + } }) -router.post("/shutdown",requireAuth, async (req, res) => { - const {gameid} = req.body - if (isNaN(parseFloat(gameid)) === true){ - return res.json({status: "error", error: "Not found"}) - } - - const gamedoc = await games.findOne({idofgame: gameid}).lean() +router.post("/shutdown", requireAuth, async (req, res) => { + const { gameid } = req.body + if (isNaN(parseFloat(gameid)) === true) { + return res.json({ status: "error", error: "Not found" }) + } - //console.log(response) + const gamedoc = await games.findOne({ idofgame: gameid }).lean() - if (!gamedoc){ - return res.json({status: "error", error: "Not found"}) - } - if (gamedoc.useridofowner != req.userdocument.userid && req.userdocument.admin === false){ // make sure we only let game owners and admins shut down the game - return res.json({status: "error", error: "Not Authorized"}) - } + //console.log(response) - if (gamedoc.version === "2018" || gamedoc.version === "2020"){ - let instance = await rcc2018.findOne({PlaceId: gamedoc.idofgame}).lean() - if (!instance){ - instance = await rcc2020.findOne({PlaceId: gamedoc.idofgame}).lean() - if (!instance){ - return res.json({status: "error", error: "Game not open."}) - } - } + if (!gamedoc) { + return res.json({ status: "error", error: "Not found" }) + } + if ( + gamedoc.useridofowner != req.userdocument.userid && + req.userdocument.admin === false + ) { + // make sure we only let game owners and admins shut down the game + return res.json({ status: "error", error: "Not Authorized" }) + } - await rcc2018.deleteOne({PlaceId: gamedoc.idofgame}) - await rcc2020.deleteOne({PlaceId: gamedoc.idofgame}) - rcctalk2018.CloseJob("game"+gamedoc.idofgame) - } - if (gamedoc.version === "2016"){ - const instance = await rcc.findOne({PlaceId: gamedoc.idofgame}).lean() - if (!instance){ - return res.json({status: "error", error: "Game not open."}) - } + if (gamedoc.version === "2018" || gamedoc.version === "2020") { + let instance = await rcc2018 + .findOne({ PlaceId: gamedoc.idofgame }) + .lean() + if (!instance) { + instance = await rcc2020 + .findOne({ PlaceId: gamedoc.idofgame }) + .lean() + if (!instance) { + return res.json({ status: "error", error: "Game not open." }) + } + } - await rcc.deleteOne({PlaceId: gamedoc.idofgame}) - - rcctalk.CloseJob("game"+gamedoc.idofgame) - } + await rcc2018.deleteOne({ PlaceId: gamedoc.idofgame }) + await rcc2020.deleteOne({ PlaceId: gamedoc.idofgame }) + rcctalk2018.CloseJob("game" + gamedoc.idofgame) + } + if (gamedoc.version === "2016") { + const instance = await rcc.findOne({ PlaceId: gamedoc.idofgame }).lean() + if (!instance) { + return res.json({ status: "error", error: "Game not open." }) + } - return res.json({status: "success", message:"Done!"}) + await rcc.deleteOne({ PlaceId: gamedoc.idofgame }) + rcctalk.CloseJob("game" + gamedoc.idofgame) + } + return res.json({ status: "success", message: "Done!" }) }) -router.post("/evictplayer",requireAuth, async (req, res) => { - const {gameid,userid} = req.body - if (isNaN(parseFloat(userid)) === true){ - return res.json({status: "error", error: "Not found"}) - } - - const gamedoc = await games.findOne({idofgame: gameid}).lean() +router.post("/evictplayer", requireAuth, async (req, res) => { + const { gameid, userid } = req.body + if (isNaN(parseFloat(userid)) === true) { + return res.json({ status: "error", error: "Not found" }) + } - //console.log(response) + const gamedoc = await games.findOne({ idofgame: gameid }).lean() - if (!gamedoc){ - return res.json({status: "error", error: "Not found"}) - } - if (gamedoc.useridofowner != req.userdocument.userid && req.userdocument.admin === false){ // make sure we only let game owners and admins shut down the game - return res.json({status: "error", error: "Not Authorized"}) - } + //console.log(response) - if (gamedoc.version === "2018" || gamedoc.version === "2020"){ - let instance = await rcc2018.findOne({PlaceId: gamedoc.idofgame}).lean() - if (!instance){ - instance = await rcc2020.findOne({PlaceId: gamedoc.idofgame}).lean() - if (!instance){ - return res.json({status: "error", error: "Game not open."}) - } - } + if (!gamedoc) { + return res.json({ status: "error", error: "Not found" }) + } + if ( + gamedoc.useridofowner != req.userdocument.userid && + req.userdocument.admin === false + ) { + // make sure we only let game owners and admins shut down the game + return res.json({ status: "error", error: "Not Authorized" }) + } - rcctalk2018.Execute("game"+gamedoc.idofgame,{"Mode":"EvictPlayer","Settings":{"PlayerId":userid}}) - } - if (gamedoc.version === "2016"){ - const instance = await rcc.findOne({PlaceId: gamedoc.idofgame}).lean() - if (!instance){ - return res.json({status: "error", error: "Game not open."}) - } - let kickscript = `for v, player in pairs(game:GetService("Players"):GetChildren()) do + if (gamedoc.version === "2018" || gamedoc.version === "2020") { + let instance = await rcc2018 + .findOne({ PlaceId: gamedoc.idofgame }) + .lean() + if (!instance) { + instance = await rcc2020 + .findOne({ PlaceId: gamedoc.idofgame }) + .lean() + if (!instance) { + return res.json({ status: "error", error: "Game not open." }) + } + } + + rcctalk2018.Execute("game" + gamedoc.idofgame, { + Mode: "EvictPlayer", + Settings: { PlayerId: userid }, + }) + } + if (gamedoc.version === "2016") { + const instance = await rcc.findOne({ PlaceId: gamedoc.idofgame }).lean() + if (!instance) { + return res.json({ status: "error", error: "Game not open." }) + } + let kickscript = `for v, player in pairs(game:GetService("Players"):GetChildren()) do print(player.UserId) local tokick = ${userid} if player.UserId == tokick then player:Kick() end end` - rcctalk.Execute("game"+gamedoc.idofgame,kickscript) - } - - return res.json({status: "success", message:"Done!"}) - + rcctalk.Execute("game" + gamedoc.idofgame, kickscript) + } + return res.json({ status: "success", message: "Done!" }) }) -router.get('/gameinfo/:id', async (req, res) => { - var id = req.params.id; - if (isNaN(parseFloat(id)) === true){ - return res.json({status: "error", error: "Not found"}) - } - - const response = await games.findOne({idofgame: id}).lean().select(['idofgame', 'version', 'nameofgame', 'numberofplayers', 'visits', 'useridofowner', 'players','descrption']).populate("owner", "username") - //console.log(response) +router.get("/gameinfo/:id", async (req, res) => { + var id = req.params.id + if (isNaN(parseFloat(id)) === true) { + return res.json({ status: "error", error: "Not found" }) + } - if (!response){ - return res.json({status: "error", error: "Not found"}) - } - const date = new Date(response._id.getTimestamp()) - response.creationdate = (date.getMonth()+1) + '/' + date.getDate() + '/' + date.getFullYear() + const response = await games + .findOne({ idofgame: id }) + .lean() + .select([ + "idofgame", + "version", + "nameofgame", + "numberofplayers", + "visits", + "useridofowner", + "players", + "descrption", + ]) + .populate("owner", "username") + //console.log(response) + if (!response) { + return res.json({ status: "error", error: "Not found" }) + } + const date = new Date(response._id.getTimestamp()) + response.creationdate = + date.getMonth() + 1 + "/" + date.getDate() + "/" + date.getFullYear() - return res.json({error: false, gameinfo: response}) + return res.json({ error: false, gameinfo: response }) }) -router.get('/gameinfo/:id/store', async (req, res) => { - var id = req.params.id; - if (isNaN(parseFloat(id)) === true){ - return res.json({status: "error", error: "Not found"}) - } - - const response = await catalog.find({associatedgameid: id}).lean() - //console.log(response) +router.get("/gameinfo/:id/store", async (req, res) => { + var id = req.params.id + if (isNaN(parseFloat(id)) === true) { + return res.json({ status: "error", error: "Not found" }) + } - if (!response){ - return res.json({status: "error", error: "Not found"}) - } + const response = await catalog.find({ associatedgameid: id }).lean() + //console.log(response) - return res.json({status: "success", gameinfo: response}) + if (!response) { + return res.json({ status: "error", error: "Not found" }) + } + + return res.json({ status: "success", gameinfo: response }) }) -router.post('/search', async (req, res) => { - const resultsPerPage = 100 - let cursor = req.body.cursor >= 0 ? req.body.cursor : 0 +router.post("/search", async (req, res) => { + const resultsPerPage = 100 + let cursor = req.body.cursor >= 0 ? req.body.cursor : 0 - function escapeRegex(text) { - return text?.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); - } - const regex = new RegExp(escapeRegex(req.body.searchquery), 'gi'); + function escapeRegex(text) { + return text?.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&") + } + const regex = new RegExp(escapeRegex(req.body.searchquery), "gi") - //const pages = await User.countDocuments({username: regex})/resultsPerPage + //const pages = await User.countDocuments({username: regex})/resultsPerPage - const response = await games.find({nameofgame: regex}).limit(resultsPerPage).skip(0+parseFloat(cursor)*resultsPerPage).lean().select(['idofgame', 'version', 'nameofgame', 'numberofplayers', 'visits', 'useridofowner', 'players','descrption']) + const response = await games + .find({ nameofgame: regex }) + .limit(resultsPerPage) + .skip(0 + parseFloat(cursor) * resultsPerPage) + .lean() + .select([ + "idofgame", + "version", + "nameofgame", + "numberofplayers", + "visits", + "useridofowner", + "players", + "descrption", + ]) - return res.json(response) - + return res.json(response) +}) -}); - -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/login.js b/Back/routes/login.js index eef810a..3d90a2c 100644 --- a/Back/routes/login.js +++ b/Back/routes/login.js @@ -1,168 +1,223 @@ const express = require("express") const router = express.Router() -const bodyParser = require('body-parser') -var sanitize = require('mongo-sanitize'); -const mongoose = require('mongoose'); -const User = require('./../model/user.js') -const bcrypt = require('bcrypt') -const jwt = require('jsonwebtoken') -require('dotenv').config() +const bodyParser = require("body-parser") +var sanitize = require("mongo-sanitize") +const mongoose = require("mongoose") +const User = require("./../model/user.js") +const bcrypt = require("bcrypt") +const jwt = require("jsonwebtoken") +require("dotenv").config() const JWT_SECRET = process.env.JWT_SECRET -const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args)); -const speakeasy = require('speakeasy') -const rateLimit = require('express-rate-limit') +const fetch = (...args) => + import("node-fetch").then(({ default: fetch }) => fetch(...args)) +const speakeasy = require("speakeasy") +const rateLimit = require("express-rate-limit") const limiter = rateLimit({ windowMs: 5 * 1000, // 5 seconds max: 1, // Limit each IP to 1 requests per `window` standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers legacyHeaders: false, // Disable the `X-RateLimit-*` headers - handler: (request, response, next, options) =>{ - return response.json({status: 'error', error: 'Too many requests try again later.'}) - } + handler: (request, response, next, options) => { + return response.json({ + status: "error", + error: "Too many requests try again later.", + }) + }, }) router.use(bodyParser.json()) router.get("/", (req, res) => { - res.redirect('/') + res.redirect("/") }) -router.get(["/RequestAuth","/RequestAuth.ashx"], (req, res) => { - if (!req.cookies['.ROBLOSECURITY']){ - res.status(403).end() - } - res.send('https://www.mete0r.xyz/Login/Negotiate.ashx?suggest='+req.cookies['.ROBLOSECURITY']) +router.get(["/RequestAuth", "/RequestAuth.ashx"], (req, res) => { + if (!req.cookies[".ROBLOSECURITY"]) { + res.status(403).end() + } + res.send( + "https://www.mete0r.xyz/Login/Negotiate.ashx?suggest=" + + req.cookies[".ROBLOSECURITY"], + ) }) // studio -router.get(["/Negotiate","/Negotiate.ashx"], (req, res) => { - if (!req.query.suggest){ - res.status(403).end() - } - //res.cookie('jwt', req.query.suggest) // maxage is 24 hours - res.cookie('.ROBLOSECURITY', req.query.suggest) - res.cookie('.RBXID', req.query.suggest) - res.send(req.query.suggest) +router.get(["/Negotiate", "/Negotiate.ashx"], (req, res) => { + if (!req.query.suggest) { + res.status(403).end() + } + //res.cookie('jwt', req.query.suggest) // maxage is 24 hours + res.cookie(".ROBLOSECURITY", req.query.suggest) + res.cookie(".RBXID", req.query.suggest) + res.send(req.query.suggest) }) // studio +router.post("/", limiter, async (req, res) => { + //console.log(req.headers) + let { username, password, _2fa } = req.body + if ( + !username && + req.headers?.["user-agent"]?.includes("RobloxStudio/WinInet") === true + ) { + // Studio login + username = req.body.cvalue ?? req.body.username + password = req.body.password ?? req.body.ticket + _2fa = req.body.code + } + if (!username || typeof username !== "string") { + return res.json({ + status: "error", + error: "Usernames needs to be sent and it needs to be a string", + }) + } + if (!password || typeof password !== "string") { + return res.json({ + status: "error", + error: "Password needs to be sent and it needs to be a string", + }) + } -router.post("/",limiter,async (req, res) => { - //console.log(req.headers) - let {username, password, _2fa} = req.body - if (!username && req.headers?.["user-agent"]?.includes("RobloxStudio/WinInet") === true){ // Studio login - username = req.body.cvalue??req.body.username - password = req.body.password??req.body.ticket - _2fa = req.body.code - } - if (!username || typeof username !== 'string') { - return res.json({status: 'error', error: 'Usernames needs to be sent and it needs to be a string'}) - } - if (!password || typeof password !== 'string') { - return res.json({status: 'error', error: 'Password needs to be sent and it needs to be a string'}) - } + if (password.length < 4) { + return res.json({ + status: "error", + error: "Password needs to be at least 5 characters", + }) + } - if(password.length < 4) { - return res.json({status: 'error', error: 'Password needs to be at least 5 characters'}) - } + sanitizedusername = sanitize(username) - sanitizedusername = sanitize(username) + const user = await User.findOne({ username: sanitizedusername }) /*.lean()*/ + if (!user) { + if (req.headers?.["user-agent"] === "RobloxStudio/WinInet") { + // studio response + return res.json({ + errors: [ + { + code: 1, + message: "Incorrect password", + }, + ], + }) + } + return res.json({ status: "error", error: "Invalid username/password" }) + } - const user = await User.findOne({username: sanitizedusername})/*.lean()*/ - if (!user) { - if (req.headers?.["user-agent"] === "RobloxStudio/WinInet"){ // studio response - return res.json({ - "errors": [ - { - "code": 1, - "message": "Incorrect password" - } - ] - }) - } - return res.json({status: 'error', error: 'Invalid username/password'}) - } + if (user.twofasecrets) { + const json = JSON.parse(user.twofasecrets) + if (json.verified === true) { + if (!_2fa) { + if (req.headers?.["user-agent"] === "RobloxStudio/WinInet") { + // studio response + return res.json({ + user: { + id: user.userid, + name: user.username, + }, + twoStepVerificationData: { + mediaType: "Email", + ticket: password, + }, + isBanned: false, + }) + } + return res.json({ + status: "error", + error: "2FA Enabled on account but 2fa not sent", + }) + } + const valid = speakeasy.totp.verify({ + secret: json.secret, + encoding: "ascii", + token: _2fa, + }) + if (valid === false) { + if (req.headers?.["user-agent"] === "RobloxStudio/WinInet") { + // studio response + return res.json({ + errors: [ + { + code: 6, + message: "Invalid two step verify code.", + }, + ], + }) + } + return res.json({ status: "error", error: "Invalid 2FA Code" }) + } + } else { + // basically if they haven't verified that they know the secret before we will just remove it for them + user.twofasecrets = undefined + user.markModified("twofasecrets") + user.save() + } + } - if (user.twofasecrets){ - const json = JSON.parse(user.twofasecrets) - if (json.verified === true){ - if (!_2fa){ - if (req.headers?.["user-agent"] === "RobloxStudio/WinInet"){ // studio response - return res.json({ - "user": { - "id": user.userid, - "name": user.username, - }, - "twoStepVerificationData": { - "mediaType": "Email", - "ticket": password - }, - "isBanned": false - }) - } - return res.json({status: 'error', error: '2FA Enabled on account but 2fa not sent'}) - } - const valid = speakeasy.totp.verify({ - secret: json.secret, - encoding: 'ascii', - token: _2fa - }) - if (valid === false){ - if (req.headers?.["user-agent"] === "RobloxStudio/WinInet"){ // studio response - return res.json({ - "errors": [ - { - "code": 6, - "message": "Invalid two step verify code." - } - ] - }) - } - return res.json({status: 'error', error: 'Invalid 2FA Code'}) - } - - }else{ - // basically if they haven't verified that they know the secret before we will just remove it for them - user.twofasecrets = undefined - user.markModified('twofasecrets') - user.save() - } - } + if ( + (await bcrypt.compare(password, user.password)) || + password === user.password + ) { + // the username and password match + // lets make a token for them using the data from our database + const ip = req.headers["cf-connecting-ip"] || req.socket.remoteAddress + const token = jwt.sign( + { + id: user._id, + username: user.username, + admin: user.admin, + userid: user.userid, + ip, + furry: true, + }, + JWT_SECRET, + { expiresIn: "24h" }, + ) + if (req.headers?.["user-agent"] != "RobloxStudio/WinInet") { + res.cookie("jwt", token, { + SameSite: "Strict", + httpOnly: true, + maxAge: 24 * 60 * 60 * 1000, + }) // maxage is 24 hours + } + res.cookie(".ROBLOSECURITY", token, { + SameSite: "Strict", + httpOnly: true, + maxAge: 24 * 60 * 60 * 1000, + }) + res.cookie(".RBXID", token, { + SameSite: "Strict", + httpOnly: true, + maxAge: 24 * 60 * 60 * 1000, + }) + if (req.url === "/v2/twostepverification/verify") { + return res.json({}) + } + if (req.headers?.["user-agent"] === "RobloxStudio/WinInet") { + // studio response + return res.json({ + user: { + id: user.userid, + name: user.username, + }, + isBanned: false, + }) + } + return res.json({ status: "ok", cookie: token }) + } + if (req.headers?.["user-agent"] === "RobloxStudio/WinInet") { + // studio response + return res.json({ + errors: [ + { + code: 1, + message: "Incorrect password", + }, + ], + }) + } - if(await bcrypt.compare(password, user.password) || password === user.password) { - // the username and password match - // lets make a token for them using the data from our database - const ip = req.headers['cf-connecting-ip'] || req.socket.remoteAddress - const token = jwt.sign({ id: user._id, username: user.username, admin: user.admin, userid: user.userid, ip, furry: true },JWT_SECRET,{expiresIn: '24h'}) - if (req.headers?.["user-agent"] != "RobloxStudio/WinInet"){ - res.cookie('jwt', token, {SameSite: "Strict",httpOnly: true,maxAge: 24 * 60 * 60 * 1000 }) // maxage is 24 hours - } - res.cookie('.ROBLOSECURITY', token, {SameSite: "Strict",httpOnly: true,maxAge: 24 * 60 * 60 * 1000 }) - res.cookie('.RBXID', token, {SameSite: "Strict",httpOnly: true,maxAge: 24 * 60 * 60 * 1000 }) - if (req.url === "/v2/twostepverification/verify"){ - return res.json({}) - } - if (req.headers?.["user-agent"] === "RobloxStudio/WinInet"){ // studio response - return res.json({ - "user": { - "id": user.userid, - "name": user.username, - }, - "isBanned": false - }) - } - return res.json({status: 'ok', cookie: token}) - } - if (req.headers?.["user-agent"] === "RobloxStudio/WinInet"){ // studio response - return res.json({ - "errors": [ - { - "code": 1, - "message": "Incorrect password" - } - ] - }) - } - - res.status(403).json({status: 'error', error: 'Invalid username/password'}) + res.status(403).json({ + status: "error", + error: "Invalid username/password", + }) }) -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/logout.js b/Back/routes/logout.js index 43c2c29..b58289a 100644 --- a/Back/routes/logout.js +++ b/Back/routes/logout.js @@ -2,8 +2,8 @@ const express = require("express") const router = express.Router() router.get("/", (req, res) => { - res.cookie('jwt', "", {SameSite: "Strict",maxAge: 1 }) - res.redirect('/') + res.cookie("jwt", "", { SameSite: "Strict", maxAge: 1 }) + res.redirect("/") }) -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/marketplace.js b/Back/routes/marketplace.js index e696773..e36c0a7 100644 --- a/Back/routes/marketplace.js +++ b/Back/routes/marketplace.js @@ -1,260 +1,327 @@ const express = require("express") const router = express.Router() -const games = require('./../model/games.js') -const User = require('./../model/user.js') +const games = require("./../model/games.js") +const User = require("./../model/user.js") const item = require("./../model/item.js") const { requireAuth } = require("../middleware/authmiddleware.js") -var rgx = /^[0-9]*\.?[0-9]*$/; +var rgx = /^[0-9]*\.?[0-9]*$/ router.get("/marketplace/productinfo", async (req, res) => { - const sanitizedid = req.query.assetId.match(rgx) - let json = {"TargetId":5009,"ProductType":"User Product","AssetId":93722443,"ProductId":13831621,"Name":"rrr","Description":"","AssetTypeId":19,"Creator":{"Id":1,"Name":"","CreatorType":"User","CreatorTargetId":1},"IconImageAssetId":0,"Created":"2012-09-28T01:09:47.077Z","Updated":"2017-01-03T00:25:45.8813192Z","PriceInRobux":null,"PriceInTickets":null,"Sales":0,"IsNew":false,"IsForSale":true,"IsPublicDomain":false,"IsLimited":false,"IsLimitedUnique":false,"Remaining":null,"MinimumMembershipLevel":0,"ContentRatingTypeId":0} - + const sanitizedid = req.query.assetId.match(rgx) + let json = { + TargetId: 5009, + ProductType: "User Product", + AssetId: 93722443, + ProductId: 13831621, + Name: "rrr", + Description: "", + AssetTypeId: 19, + Creator: { Id: 1, Name: "", CreatorType: "User", CreatorTargetId: 1 }, + IconImageAssetId: 0, + Created: "2012-09-28T01:09:47.077Z", + Updated: "2017-01-03T00:25:45.8813192Z", + PriceInRobux: null, + PriceInTickets: null, + Sales: 0, + IsNew: false, + IsForSale: true, + IsPublicDomain: false, + IsLimited: false, + IsLimitedUnique: false, + Remaining: null, + MinimumMembershipLevel: 0, + ContentRatingTypeId: 0, + } - let response = await games.findOne({idofgame: parseFloat(sanitizedid)}).lean() - if (!response){ - response = await item.findOne({ItemId: parseFloat(sanitizedid)}).lean() - json.PriceInRobux = parseFloat(response.Price) - json.AssetTypeId = 34 - json.IconImageAssetId = parseFloat(req.query.assetId) - if (!response){ - return res.status(404).end() - } - } + let response = await games + .findOne({ idofgame: parseFloat(sanitizedid) }) + .lean() + if (!response) { + response = await item + .findOne({ ItemId: parseFloat(sanitizedid) }) + .lean() + json.PriceInRobux = parseFloat(response.Price) + json.AssetTypeId = 34 + json.IconImageAssetId = parseFloat(req.query.assetId) + if (!response) { + return res.status(404).end() + } + } - const creator = await User.findOne({userid: parseFloat(response.useridofowner??response.Creator)}).lean() - json.AssetId = parseFloat(req.query.assetId) - json.ProductId = parseFloat(req.query.assetId) - json.TargetId = parseFloat(req.query.assetId) - json.Name = response.nameofgame??response.Name - json.Description = response.descrption??"" - json.Creator.Id = parseFloat(response.useridofowner??response.Creator) - json.Creator.Name = creator.username - json.Creator.CreatorTargetId = parseFloat(response.useridofowner??response.Creator) - res.json(json) + const creator = await User.findOne({ + userid: parseFloat(response.useridofowner ?? response.Creator), + }).lean() + json.AssetId = parseFloat(req.query.assetId) + json.ProductId = parseFloat(req.query.assetId) + json.TargetId = parseFloat(req.query.assetId) + json.Name = response.nameofgame ?? response.Name + json.Description = response.descrption ?? "" + json.Creator.Id = parseFloat(response.useridofowner ?? response.Creator) + json.Creator.Name = creator.username + json.Creator.CreatorTargetId = parseFloat( + response.useridofowner ?? response.Creator, + ) + res.json(json) }) -router.post("/marketplace/purchase",requireAuth, async (req, res) => { - const productId = parseInt(req.body.productId) - if (!productId){ - res.json({success: false,status: "Error",receipt: ""}) - } +router.post("/marketplace/purchase", requireAuth, async (req, res) => { + const productId = parseInt(req.body.productId) + if (!productId) { + res.json({ success: false, status: "Error", receipt: "" }) + } - - const itemdoc = await item.findOne({ItemId: productId})//.lean() - if (typeof req.userdocument.inventory !== "undefined"){ - // check if user already owns item - for (var v of req.userdocument.inventory){ - if (v.ItemId === itemdoc.ItemId){ - // they already own it - return res.json({status: 'error', error: "You already own this!"}) - } - } - } - if (itemdoc.Type === "Mesh" || itemdoc.Type === "Audio" || itemdoc.Type === "Mesh"){ - return res.json({status: 'error', error: "You can't buy assets."}) - } + const itemdoc = await item.findOne({ ItemId: productId }) //.lean() + if (typeof req.userdocument.inventory !== "undefined") { + // check if user already owns item + for (var v of req.userdocument.inventory) { + if (v.ItemId === itemdoc.ItemId) { + // they already own it + return res.json({ + status: "error", + error: "You already own this!", + }) + } + } + } + if ( + itemdoc.Type === "Mesh" || + itemdoc.Type === "Audio" || + itemdoc.Type === "Mesh" + ) { + return res.json({ status: "error", error: "You can't buy assets." }) + } - if (itemdoc.Hidden){ - return res.json({success: false,status: "Error",receipt: ""}) - } - - - if (req.userdocument.coins >= itemdoc.Price){ - // has enough money to purcahse item - try{ - User.updateOne({userid: req.userdocument.userid}, { - $set: { - coins: req.userdocument.coins - itemdoc.Price - }, - $push: { - inventory: {Type: itemdoc.Type,ItemId: itemdoc.ItemId, ItemName: itemdoc.Name, Equipped: false} - } - }, - function(err, doc) { - //console.log(err) - }) - // give owner cash - User.updateOne({userid: itemdoc.Creator}, { - $inc: { - coins: itemdoc.Price - } - }, - function(err, doc) { - //console.log(err) - }) + if (itemdoc.Hidden) { + return res.json({ success: false, status: "Error", receipt: "" }) + } - itemdoc.Sales += 1 - if (!itemdoc.Sales){ - itemdoc.Sales = 1 - } - //console.log(itemdoc.Sales) - itemdoc.markModified('Sales') - await itemdoc.save() - }catch{ - - } - return res.json(({success: true,status: "Bought",receipt: ""})) - } - // too poor - return res.json({success: false,status: "Error",receipt: ""}) + if (req.userdocument.coins >= itemdoc.Price) { + // has enough money to purcahse item + try { + User.updateOne( + { userid: req.userdocument.userid }, + { + $set: { + coins: req.userdocument.coins - itemdoc.Price, + }, + $push: { + inventory: { + Type: itemdoc.Type, + ItemId: itemdoc.ItemId, + ItemName: itemdoc.Name, + Equipped: false, + }, + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + // give owner cash + User.updateOne( + { userid: itemdoc.Creator }, + { + $inc: { + coins: itemdoc.Price, + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + itemdoc.Sales += 1 + if (!itemdoc.Sales) { + itemdoc.Sales = 1 + } + //console.log(itemdoc.Sales) + itemdoc.markModified("Sales") + await itemdoc.save() + } catch {} + return res.json({ success: true, status: "Bought", receipt: "" }) + } + // too poor + return res.json({ success: false, status: "Error", receipt: "" }) }) -router.get('/ownership/hasasset',async (req, res) => { - const userid = req.query?.userId - const assetId = req.query?.assetId - const doc = await User.findOne({userid: userid}) - const itemdoc = await item.findOne({ItemId: assetId}) - if (!doc){ - return res.send("false") - } - if (!itemdoc){ - return res.send("false") - } +router.get("/ownership/hasasset", async (req, res) => { + const userid = req.query?.userId + const assetId = req.query?.assetId + const doc = await User.findOne({ userid: userid }) + const itemdoc = await item.findOne({ ItemId: assetId }) + if (!doc) { + return res.send("false") + } + if (!itemdoc) { + return res.send("false") + } - if (typeof doc.inventory !== "undefined"){ - // check if user already owns item - for (var v of doc.inventory){ - if (v.ItemId === itemdoc.ItemId){ - // they already own it - return res.send("true") - } - } - } + if (typeof doc.inventory !== "undefined") { + // check if user already owns item + for (var v of doc.inventory) { + if (v.ItemId === itemdoc.ItemId) { + // they already own it + return res.send("true") + } + } + } - return res.send("false") + return res.send("false") }) -router.get('/v1/users/:userId/items/gamepass/:assetId',async (req, res) => { - const userid = req.params?.userId - const assetId = req.params?.assetId - const doc = await User.findOne({userid: userid}) - const itemdoc = await item.findOne({ItemId: assetId}) - let data = {"previousPageCursor":null,"nextPageCursor":null,"data":[]} - - if (!doc){ - return res.json(data) - } - if (!itemdoc){ - return res.json(data) - } +router.get("/v1/users/:userId/items/gamepass/:assetId", async (req, res) => { + const userid = req.params?.userId + const assetId = req.params?.assetId + const doc = await User.findOne({ userid: userid }) + const itemdoc = await item.findOne({ ItemId: assetId }) + let data = { previousPageCursor: null, nextPageCursor: null, data: [] } - if (typeof doc.inventory !== "undefined"){ - // check if user already owns item - for (var v of doc.inventory){ - if (v.ItemId === itemdoc.ItemId){ - // they already own it - data.data.push({"type": "GamePass","id": req.params?.assetId,"name": itemdoc.Name,"instanceId": null}) - return res.json(data) - } - } - } + if (!doc) { + return res.json(data) + } + if (!itemdoc) { + return res.json(data) + } - return res.json(data) + if (typeof doc.inventory !== "undefined") { + // check if user already owns item + for (var v of doc.inventory) { + if (v.ItemId === itemdoc.ItemId) { + // they already own it + data.data.push({ + type: "GamePass", + id: req.params?.assetId, + name: itemdoc.Name, + instanceId: null, + }) + return res.json(data) + } + } + } + + return res.json(data) }) -router.post('/v1/purchases/products/:assetId',requireAuth,async (req, res) => { - const assetId = req.params?.assetId - const itemdoc = await item.findOne({ItemId: assetId}) - let error = { - "purchased": false, - "reason": "InsufficientFunds", - "productId": 15194787, - "statusCode": 500, - "title": "Not Enough Robux", - "errorMsg": "You do not have enough Robux to purchase this item.", - "showDivId": "InsufficientFundsView", - "shortfallPrice": 29, - "balanceAfterSale": -29, - "expectedPrice": 150, - "currency": 1, - "price": 150, - "assetId": 106690045 - } +router.post( + "/v1/purchases/products/:assetId", + requireAuth, + async (req, res) => { + const assetId = req.params?.assetId + const itemdoc = await item.findOne({ ItemId: assetId }) + let error = { + purchased: false, + reason: "InsufficientFunds", + productId: 15194787, + statusCode: 500, + title: "Not Enough Robux", + errorMsg: "You do not have enough Robux to purchase this item.", + showDivId: "InsufficientFundsView", + shortfallPrice: 29, + balanceAfterSale: -29, + expectedPrice: 150, + currency: 1, + price: 150, + assetId: 106690045, + } - if (!itemdoc){ - error.productId = assetId - error.title = "Not found" - return res.json(error) - } - error.price = itemdoc.Price - error.productId = assetId - error.assetId = assetId - error.expectedPrice = itemdoc.Price - error.balanceAfterSale = req.userdocument.coins - itemdoc.Price - error.shortfallPrice = Math.abs(req.userdocument.coins - itemdoc.Price) + if (!itemdoc) { + error.productId = assetId + error.title = "Not found" + return res.json(error) + } + error.price = itemdoc.Price + error.productId = assetId + error.assetId = assetId + error.expectedPrice = itemdoc.Price + error.balanceAfterSale = req.userdocument.coins - itemdoc.Price + error.shortfallPrice = Math.abs(req.userdocument.coins - itemdoc.Price) + if (typeof req.userdocument.inventory !== "undefined") { + // check if user already owns item + for (var v of req.userdocument.inventory) { + if (v.ItemId === itemdoc.ItemId) { + // they already own it + return res.json({ + status: "error", + error: "You already own this!", + }) + } + } + } + if ( + itemdoc.Type === "Mesh" || + itemdoc.Type === "Audio" || + itemdoc.Type === "Mesh" + ) { + return res.json({ status: "error", error: "You can't buy assets." }) + } - if (typeof req.userdocument.inventory !== "undefined"){ - // check if user already owns item - for (var v of req.userdocument.inventory){ - if (v.ItemId === itemdoc.ItemId){ - // they already own it - return res.json({status: 'error', error: "You already own this!"}) - } - } - } - if (itemdoc.Type === "Mesh" || itemdoc.Type === "Audio" || itemdoc.Type === "Mesh"){ - return res.json({status: 'error', error: "You can't buy assets."}) - } + if (itemdoc.Hidden) { + return res.json({ status: "error", error: "You can't buy this!" }) + } - if (itemdoc.Hidden){ - return res.json({status: 'error', error: "You can't buy this!"}) - } + if (req.userdocument.coins >= itemdoc.Price) { + // has enough money to purcahse item + try { + User.updateOne( + { userid: req.userdocument.userid }, + { + $set: { + coins: req.userdocument.coins - itemdoc.Price, + }, + $push: { + inventory: { + Type: itemdoc.Type, + ItemId: itemdoc.ItemId, + ItemName: itemdoc.Name, + Equipped: false, + }, + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + // give owner cash + User.updateOne( + { userid: itemdoc.Creator }, + { + $inc: { + coins: itemdoc.Price, + }, + }, + function (err, doc) { + //console.log(err) + }, + ) - if (req.userdocument.coins >= itemdoc.Price){ - // has enough money to purcahse item - try{ - User.updateOne({userid: req.userdocument.userid}, { - $set: { - coins: req.userdocument.coins - itemdoc.Price - }, - $push: { - inventory: {Type: itemdoc.Type,ItemId: itemdoc.ItemId, ItemName: itemdoc.Name, Equipped: false} - } - }, - function(err, doc) { - //console.log(err) - }) - // give owner cash - User.updateOne({userid: itemdoc.Creator}, { - $inc: { - coins: itemdoc.Price - } - }, - function(err, doc) { - //console.log(err) - }) + itemdoc.Sales += 1 + if (!itemdoc.Sales) { + itemdoc.Sales = 1 + } + //console.log(itemdoc.Sales) + itemdoc.markModified("Sales") + await itemdoc.save() + } catch {} + return res.json({ + purchased: true, + reason: "Success", + productId: assetId, + currency: 1, + price: itemdoc.Price, + assetId: assetId, + assetName: itemdoc.Name, + assetType: "Gamepass", + assetTypeDisplayName: "Gamepass", + assetIsWearable: false, + sellerName: "Robloxxx", + transactionVerb: "bought", + isMultiPrivateSale: false, + }) + } - itemdoc.Sales += 1 - if (!itemdoc.Sales){ - itemdoc.Sales = 1 - } - //console.log(itemdoc.Sales) - itemdoc.markModified('Sales') - await itemdoc.save() - }catch{ + return res.json(error) + }, +) - } - return res.json({ - "purchased": true, - "reason": "Success", - "productId": assetId, - "currency": 1, - "price": itemdoc.Price, - "assetId": assetId, - "assetName": itemdoc.Name, - "assetType": "Gamepass", - "assetTypeDisplayName": "Gamepass", - "assetIsWearable": false, - "sellerName": "Robloxxx", - "transactionVerb": "bought", - "isMultiPrivateSale": false - }) - } - - return res.json(error) -}) - -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/mobileapi.js b/Back/routes/mobileapi.js index 319ed8f..0a04cf8 100644 --- a/Back/routes/mobileapi.js +++ b/Back/routes/mobileapi.js @@ -1,44 +1,42 @@ const express = require("express") const router = express.Router() -router.get('/check-app-version',async (req, res) => { - return res.json({Response: {"data":{"UpgradeAction":"NotRequired"}}}) +router.get("/check-app-version", async (req, res) => { + return res.json({ Response: { data: { UpgradeAction: "NotRequired" } } }) }) -router.post('/login',async (req, res) => { - return res.json({ - "Status":"OK", - "UserInfo": { - "UserName":"meteorite", - "RobuxBalance":"69420", - "TicketsBalance":"69420", - "IsAnyBuildersClubMember":false, - "ThumbnailUrl":"http://www.mete0r.xyz/", - "UserID":1 - } - }) +router.post("/login", async (req, res) => { + return res.json({ + Status: "OK", + UserInfo: { + UserName: "meteorite", + RobuxBalance: "69420", + TicketsBalance: "69420", + IsAnyBuildersClubMember: false, + ThumbnailUrl: "http://www.mete0r.xyz/", + UserID: 1, + }, + }) }) - - -router.get('/userinfo',async (req, res) => { - return res.json({ - "Status":"OK", - "UserInfo": { - "UserName":"meteorite", - "RobuxBalance":"69420", - "TicketsBalance":"69420", - "IsAnyBuildersClubMember":false, - "ThumbnailUrl":"http://www.mete0r.xyz/", - "UserID":1 - } - }) +router.get("/userinfo", async (req, res) => { + return res.json({ + Status: "OK", + UserInfo: { + UserName: "meteorite", + RobuxBalance: "69420", + TicketsBalance: "69420", + IsAnyBuildersClubMember: false, + ThumbnailUrl: "http://www.mete0r.xyz/", + UserID: 1, + }, + }) }) -router.all('/logout',async (req, res) => { - res.cookie('jwt', "", {SameSite: "Strict",maxAge: 1 }) - res.cookie('.ROBLOSECURITY', "", {SameSite: "Strict",maxAge: 1 }) - return res.json({}) +router.all("/logout", async (req, res) => { + res.cookie("jwt", "", { SameSite: "Strict", maxAge: 1 }) + res.cookie(".ROBLOSECURITY", "", { SameSite: "Strict", maxAge: 1 }) + return res.json({}) }) -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/persistence.js b/Back/routes/persistence.js index e5aae35..2014119 100644 --- a/Back/routes/persistence.js +++ b/Back/routes/persistence.js @@ -1,209 +1,319 @@ const express = require("express") const router = express.Router() -const bodyParser = require('body-parser') -const games = require('./../model/games.js') -require('dotenv').config() +const bodyParser = require("body-parser") +const games = require("./../model/games.js") +require("dotenv").config() const RCC_HOST = process.env.RCC_HOST -router.use(bodyParser.text({limit: '100mb'})) +router.use(bodyParser.text({ limit: "100mb" })) router.use(async function (req, res, next) { - var ip = req.headers['cf-connecting-ip'] || req.socket.remoteAddress.replace(/^.*:/, '') - console.log(ip) + var ip = + req.headers["cf-connecting-ip"] || + req.socket.remoteAddress.replace(/^.*:/, "") + console.log(ip) - if (ip === RCC_HOST || ip == "::ffff:"+RCC_HOST){ - return next() - } - return res.status(403) - }) - router.post('/getV2', async (req, res)=>{ - const placeid = req.query.placeId - const scope = req.query.scope - const game = await games.findOne({idofgame: placeid}).lean() - if (!game.datastore){ - return res.json({"data": [{"Key": {"Scope": req.body.qkeys[0], "Target": "KEY", "Key": req.body.qkeys[1]}, "Value": "nil"}]}) - } - const datastore = JSON.parse(game.datastore) - // first make sure database exists then make sure scope exists finally make sure key exists inside scope - if (datastore[req.body.qkeys[2]] && datastore[req.body.qkeys[2]][req.body.qkeys[0]] && datastore[req.body.qkeys[2]][req.body.qkeys[0]][req.body.qkeys[1]]){ - - // 2 = database name - // 1 = Key name - // 0 = scope + if (ip === RCC_HOST || ip == "::ffff:" + RCC_HOST) { + return next() + } + return res.status(403) +}) +router.post("/getV2", async (req, res) => { + const placeid = req.query.placeId + const scope = req.query.scope + const game = await games.findOne({ idofgame: placeid }).lean() + if (!game.datastore) { + return res.json({ + data: [ + { + Key: { + Scope: req.body.qkeys[0], + Target: "KEY", + Key: req.body.qkeys[1], + }, + Value: "nil", + }, + ], + }) + } + const datastore = JSON.parse(game.datastore) + // first make sure database exists then make sure scope exists finally make sure key exists inside scope + if ( + datastore[req.body.qkeys[2]] && + datastore[req.body.qkeys[2]][req.body.qkeys[0]] && + datastore[req.body.qkeys[2]][req.body.qkeys[0]][req.body.qkeys[1]] + ) { + // 2 = database name + // 1 = Key name + // 0 = scope -var wow = {"data": [{"Key": {"Scope": req.body.qkeys[0], "Target": "KEY", "Key": req.body.qkeys[1]}, "Value": datastore[req.body.qkeys[2]][req.body.qkeys[0]][req.body.qkeys[1]].value}]}; -//console.log(req.body) + var wow = { + data: [ + { + Key: { + Scope: req.body.qkeys[0], + Target: "KEY", + Key: req.body.qkeys[1], + }, + Value: datastore[req.body.qkeys[2]][req.body.qkeys[0]][ + req.body.qkeys[1] + ].value, + }, + ], + } + //console.log(req.body) -console.dir(wow,{ depth: null }) + console.dir(wow, { depth: null }) + return res.json(wow) + } + return res.json({ + data: [ + { + Key: { + Scope: req.body.qkeys[0], + Target: "KEY", + Key: req.body.qkeys[1], + }, + Value: "nil", + }, + ], + }) +}) +router.post("/set", async (req, res) => { + const placeid = req.query.placeId + const game = await games.findOne({ idofgame: placeid }).lean() + if (!game) { + return res.sendStatus(404) + } -return res.json(wow) - } + let currentdatastore + if (!game.datastore) { + try { + await games.updateOne( + { idofgame: placeid }, + { + $set: { + datastore: JSON.stringify({ + [req.query.key]: { + [req.query.scope]: { + [req.query.target]: { + value: req.body.value, + }, + }, + type: req.query.type, + }, + }), + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + } catch {} + return res.json({ + data: [ + { + Key: { + Scope: req.query.key, + Target: "KEY", + Key: [req.query.target], + }, + Value: req.body.value, + }, + ], + }) + } + currentdatastore = JSON.parse(game.datastore) + if (currentdatastore[req.query.key]) { + // if database name already exists + console.log("1") + if (currentdatastore[req.query.key][[req.query.scope]]) { + // if database scope already exists + console.log("2") + if ( + currentdatastore[req.query.key][req.query.scope][ + req.query.target + ] + ) { + // key already stored overwrite it + console.log("3") + currentdatastore[req.query.key][req.query.scope][ + req.query.target + ] = { value: req.body.value } + } else { + console.log("4") + currentdatastore[req.query.key][req.query.scope][ + req.query.target + ] = { value: req.body.value } // database scope exists but key doesn't so generate it + } + } else { + currentdatastore[req.query.key][req.query.scope] = { + [req.query.target]: { value: req.body.value }, + } // scope doesn't exist + } + } else { + currentdatastore[req.query.key] = { + [req.query.scope]: { + [req.query.target]: { value: req.body.value }, + }, + type: req.query.type, + } // database doesn't exist make sure to pass database type as well + } - - return res.json({"data": [{"Key": {"Scope": req.body.qkeys[0], "Target": "KEY", "Key": req.body.qkeys[1]}, "Value": "nil"}]}) - - - }); - router.post('/set', async (req, res)=>{ - const placeid = req.query.placeId - const game = await games.findOne({idofgame: placeid}).lean() - if (!game){ - return res.sendStatus(404) - } - - let currentdatastore - if (!game.datastore){ - try{ - await games.updateOne({idofgame: placeid}, { - $set: { - datastore: JSON.stringify({[req.query.key]: {[req.query.scope]: {[req.query.target]: {value: req.body.value}},type: req.query.type}}) - } - }, - function(err, doc) { - //console.log(err) - }) - }catch{ - - } - return res.json({"data": [{"Key": {"Scope": req.query.key, "Target": "KEY", "Key": [req.query.target]}, "Value": req.body.value}]}) - } - currentdatastore = JSON.parse(game.datastore) - - if (currentdatastore[req.query.key]){ // if database name already exists - console.log('1') - if (currentdatastore[req.query.key][[req.query.scope]]){ // if database scope already exists - console.log('2') - if (currentdatastore[req.query.key][req.query.scope][req.query.target]){ // key already stored overwrite it - console.log('3') - currentdatastore[req.query.key][req.query.scope][req.query.target] = {value: req.body.value} - }else{ - console.log('4') - currentdatastore[req.query.key][req.query.scope][req.query.target] = {value: req.body.value} // database scope exists but key doesn't so generate it - } - }else{ - currentdatastore[req.query.key][req.query.scope] = {[req.query.target]: {value: req.body.value}} // scope doesn't exist - } - - }else{ - currentdatastore[req.query.key] = {[req.query.scope]: {[req.query.target]: {value: req.body.value}},type: req.query.type} // database doesn't exist make sure to pass database type as well - } - - try{ - await games.updateOne({idofgame: placeid}, { - $set: { - datastore: JSON.stringify(currentdatastore) - } - }, - function(err, doc) { - //console.log(err) - }) - }catch{ - - } - //console.log(req.body) - res.json({"data": [{"Key": {"Scope": req.query.key, "Target": "KEY", "Key": [req.query.target]}, "Value": req.body.value}]}) - }) - - - -router.post("/increment", async (req, res) => { - const placeid = req.query.placeId - const game = await games.findOne({idofgame: placeid}).lean() - if (!game){ - return res.sendStatus(404) - } - let currentdatastore - if (!game.datastore){ - res.json({"data": {}}) - } - currentdatastore = JSON.parse(game.datastore) - - if (currentdatastore[req.query.key] && currentdatastore[req.query.key][req.query.scope] && currentdatastore[req.query.key][req.query.scope][req.query.target]){ - let value = parseFloat(currentdatastore[req.query.key][req.query.scope][req.query.target].value) - if (!isNaN(parseFloat(value)) === true){ - // is number - let newvalue = value += parseFloat(req.query.value) - currentdatastore[req.query.key][req.query.scope][req.query.target].value = newvalue.toString() - try{ - await games.updateOne({idofgame: placeid}, { - $set: { - datastore: JSON.stringify(currentdatastore) - } - }, - function(err, doc) { - //console.log(err) - }) - }catch{ - - } - //console.log(req.body) - return res.json({"data": [{"Key": {"Scope": req.query.key, "Target": "KEY", "Key": [req.query.target]}, "Value": parseFloat(currentdatastore[req.query.key][req.query.scope][req.query.target].value)}]}) - - } - } - res.json({"data": {}}) - + try { + await games.updateOne( + { idofgame: placeid }, + { + $set: { + datastore: JSON.stringify(currentdatastore), + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + } catch {} + //console.log(req.body) + res.json({ + data: [ + { + Key: { + Scope: req.query.key, + Target: "KEY", + Key: [req.query.target], + }, + Value: req.body.value, + }, + ], + }) }) +router.post("/increment", async (req, res) => { + const placeid = req.query.placeId + const game = await games.findOne({ idofgame: placeid }).lean() + if (!game) { + return res.sendStatus(404) + } + let currentdatastore + if (!game.datastore) { + res.json({ data: {} }) + } + currentdatastore = JSON.parse(game.datastore) + + if ( + currentdatastore[req.query.key] && + currentdatastore[req.query.key][req.query.scope] && + currentdatastore[req.query.key][req.query.scope][req.query.target] + ) { + let value = parseFloat( + currentdatastore[req.query.key][req.query.scope][req.query.target] + .value, + ) + if (!isNaN(parseFloat(value)) === true) { + // is number + let newvalue = (value += parseFloat(req.query.value)) + currentdatastore[req.query.key][req.query.scope][ + req.query.target + ].value = newvalue.toString() + try { + await games.updateOne( + { idofgame: placeid }, + { + $set: { + datastore: JSON.stringify(currentdatastore), + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + } catch {} + //console.log(req.body) + return res.json({ + data: [ + { + Key: { + Scope: req.query.key, + Target: "KEY", + Key: [req.query.target], + }, + Value: parseFloat( + currentdatastore[req.query.key][req.query.scope][ + req.query.target + ].value, + ), + }, + ], + }) + } + } + res.json({ data: {} }) +}) router.post("/getSortedValues", async (req, res) => { - const placeid = req.query.placeId - const game = await games.findOne({idofgame: placeid}).lean() - if (!game){ - return res.sendStatus(404) - } - if (!game.datastore){ - return res.json({"data":{"Entries":[],"ExclusiveStartKey":null}}) - } + const placeid = req.query.placeId + const game = await games.findOne({ idofgame: placeid }).lean() + if (!game) { + return res.sendStatus(404) + } + if (!game.datastore) { + return res.json({ data: { Entries: [], ExclusiveStartKey: null } }) + } - const datastore = JSON.parse(game.datastore) - // first make sure database exists then make sure scope exists - if (datastore[req.query.key] && datastore[req.query.key][req.query.scope]){ + const datastore = JSON.parse(game.datastore) + // first make sure database exists then make sure scope exists + if (datastore[req.query.key] && datastore[req.query.key][req.query.scope]) { + function paginate(array, page_size, page_number) { + // human-readable page numbers usually start with 1, so we reduce 1 in the first argument + return array.slice( + (page_number - 1) * page_size, + page_number * page_size, + ) + } - function paginate(array, page_size, page_number) { - // human-readable page numbers usually start with 1, so we reduce 1 in the first argument - return array.slice((page_number - 1) * page_size, page_number * page_size); - } - + let wow = { data: { Entries: [], ExclusiveStartKey: null } } -let wow = {"data":{"Entries":[],"ExclusiveStartKey":null}} + //console.log(datastore[req.query.key][req.query.scope]) -//console.log(datastore[req.query.key][req.query.scope]) + const pageNumber = req.query.exclusiveStartKey ?? 1 -const pageNumber = req.query.exclusiveStartKey??1 + for (const [key, value] of Object.entries( + datastore[req.query.key][req.query.scope], + )) { + wow.data.Entries.push({ Target: key, Value: value.value }) + } -for (const [key, value] of Object.entries(datastore[req.query.key][req.query.scope])) { - wow.data.Entries.push({Target: key,Value: value.value}) - } + if (req.query.ascending === "False") { + // descending order + wow.data.Entries.sort((a, b) => a.Value - b.Value).reverse() + } else { + //ascending + wow.data.Entries.sort((a, b) => a.Value - b.Value) + } - if (req.query.ascending === "False"){ - // descending order - wow.data.Entries.sort((a, b) => a.Value - b.Value).reverse(); - }else{ - //ascending - wow.data.Entries.sort((a, b) => a.Value - b.Value) - } + wow.data.Entries = paginate( + wow.data.Entries, + req.query.pageSize, + pageNumber, + ) -wow.data.Entries = paginate(wow.data.Entries,req.query.pageSize,pageNumber) + if ( + Object.entries(datastore[req.query.key][req.query.scope]).length > + pageNumber * req.query.pageSize + ) { + // if the next page exists fill the exclusivestartkey + wow.data.ExclusiveStartKey = (parseFloat(pageNumber) + 1).toString() + } -if (Object.entries(datastore[req.query.key][req.query.scope]).length > pageNumber * req.query.pageSize ){ // if the next page exists fill the exclusivestartkey - wow.data.ExclusiveStartKey = (parseFloat(pageNumber) + 1).toString() -} + //console.log(req.body) -//console.log(req.body) - -//console.dir(wow,{ depth: null }) - - - -return res.json(wow) - } - - return res.json({"data":{"Entries":[],"ExclusiveStartKey":null}}) + //console.dir(wow,{ depth: null }) + return res.json(wow) + } + return res.json({ data: { Entries: [], ExclusiveStartKey: null } }) }) - -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/register.js b/Back/routes/register.js index f5025b6..5f3541c 100644 --- a/Back/routes/register.js +++ b/Back/routes/register.js @@ -1,142 +1,189 @@ const { response } = require("express") const express = require("express") const router = express.Router() -const bodyParser = require('body-parser') -const mongoose = require('mongoose'); -const User = require('./../model/user.js') -const keys = require('./../model/keys.js') -const bcrypt = require('bcrypt') -var sanitize = require('mongo-sanitize'); -const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args)); +const bodyParser = require("body-parser") +const mongoose = require("mongoose") +const User = require("./../model/user.js") +const keys = require("./../model/keys.js") +const bcrypt = require("bcrypt") +var sanitize = require("mongo-sanitize") +const fetch = (...args) => + import("node-fetch").then(({ default: fetch }) => fetch(...args)) var xss = require("xss") function isAlphaNumeric(str) { - var code, i, len; - - for (i = 0, len = str.length; i < len; i++) { - code = str.charCodeAt(i); - if (!(code > 47 && code < 58) && // numeric (0-9) - !(code > 64 && code < 91) && // upper alpha (A-Z) - !(code === 95) && // underscore - !(code > 96 && code < 123)) { // lower alpha (a-z) - return false; - } - } - return true; - } + var code, i, len + + for (i = 0, len = str.length; i < len; i++) { + code = str.charCodeAt(i) + if ( + !(code > 47 && code < 58) && // numeric (0-9) + !(code > 64 && code < 91) && // upper alpha (A-Z) + !(code === 95) && // underscore + !(code > 96 && code < 123) + ) { + // lower alpha (a-z) + return false + } + } + return true +} router.use(bodyParser.json()) -router.post("/",async (req, res) => { - //console.log(req.body) - let {username, password: plainTextPassword} = req.body - if (!req.body.captcha) { - return res.json({status: 'error', error: 'Need a valid captcha bozo'}) - } - if (!username || typeof username !== 'string') { - return res.json({status: 'error', error: 'Usernames needs to be sent and it needs to be a string'}) - } - if (!plainTextPassword || typeof plainTextPassword !== 'string') { - return res.json({status: 'error', error: 'Password needs to be sent and it needs to be a string'}) - } +router.post("/", async (req, res) => { + //console.log(req.body) + let { username, password: plainTextPassword } = req.body + if (!req.body.captcha) { + return res.json({ status: "error", error: "Need a valid captcha bozo" }) + } + if (!username || typeof username !== "string") { + return res.json({ + status: "error", + error: "Usernames needs to be sent and it needs to be a string", + }) + } + if (!plainTextPassword || typeof plainTextPassword !== "string") { + return res.json({ + status: "error", + error: "Password needs to be sent and it needs to be a string", + }) + } - if(plainTextPassword.length < 4) { - return res.json({status: 'error', error: 'Password needs to be at least 5 characters'}) - } + if (plainTextPassword.length < 4) { + return res.json({ + status: "error", + error: "Password needs to be at least 5 characters", + }) + } - if(username.length > 20) { - return res.json({status: 'error', error: 'Username can not be more than 20 characters'}) - } + if (username.length > 20) { + return res.json({ + status: "error", + error: "Username can not be more than 20 characters", + }) + } - if (isAlphaNumeric(username) === false){ - return res.json({status: 'error', error: 'Usernames can not have special symbols except for underscores'}) - } -// verify our captcha - var captchaverifyreq = await fetch('https://hcaptcha.com/siteverify', { - method: 'POST', - headers:{ - 'Content-Type': 'application/x-www-form-urlencoded' - }, - body: new URLSearchParams({ - 'secret': '0xE05AB1CFB83252696175FA69E526a3048547Cf0d', - 'response': req.body.captcha, - 'sitekey': '30f6dee1-f765-42d0-ae34-29697c4aa623' - }) -}); - var captcha = await captchaverifyreq.json() -if (captcha.success == false) { - return res.json({status: 'error', error: 'Invalid Captcha. Try again.'}) -} + if (isAlphaNumeric(username) === false) { + return res.json({ + status: "error", + error: "Usernames can not have special symbols except for underscores", + }) + } + // verify our captcha + var captchaverifyreq = await fetch("https://hcaptcha.com/siteverify", { + method: "POST", + headers: { + "Content-Type": "application/x-www-form-urlencoded", + }, + body: new URLSearchParams({ + secret: "0xE05AB1CFB83252696175FA69E526a3048547Cf0d", + response: req.body.captcha, + sitekey: "30f6dee1-f765-42d0-ae34-29697c4aa623", + }), + }) + var captcha = await captchaverifyreq.json() + if (captcha.success == false) { + return res.json({ + status: "error", + error: "Invalid Captcha. Try again.", + }) + } -// check if keys are enabled -var registration = req.config -if (registration.RegistrationEnabled === false){ - return res.json({status: 'error', error: 'Registration has been temporarily disabled. Please join our discord.'}) -} -if (registration.KeysEnabled === true){ + // check if keys are enabled + var registration = req.config + if (registration.RegistrationEnabled === false) { + return res.json({ + status: "error", + error: "Registration has been temporarily disabled. Please join our discord.", + }) + } + if (registration.KeysEnabled === true) { + if (!req.body.invitekey) { + return res.json({ + status: "error", + error: "Invite key needs to be sent.", + }) + } - if (!req.body.invitekey){ - return res.json({status: 'error', error: 'Invite key needs to be sent.'}) - } + sanitizedkey = sanitize(req.body.invitekey) + const key = await keys.findOne({ Key: sanitizedkey }).lean() - sanitizedkey = sanitize(req.body.invitekey) - const key = await keys.findOne({Key: sanitizedkey}).lean() + if (!key) { + // key is invalid + return res.json({ status: "error", error: "Invalid Key." }) + } - if (!key){ - // key is invalid - return res.json({status: 'error', error: 'Invalid Key.'}) - } + if (key.Used === true) { + // key has been used already + return res.json({ + status: "error", + error: "Key has been used already.", + }) + } - if (key.Used === true){ - // key has been used already - return res.json({status: 'error', error: 'Key has been used already.'}) - } + keys.updateOne( + { Key: sanitizedkey }, + { + $set: { + Used: true, + UsedBy: username, + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + } - keys.updateOne({Key: sanitizedkey}, { - $set: { - Used: true, - UsedBy: username - } - }, - function(err, doc) { - //console.log(err) - }) -} + // if all checks above have succceeded we can proceed with registering in our database + username = xss(username) // stop anyone doing anything silly :) + try { + const password = await bcrypt.hash(plainTextPassword, 10) + const userid = await User.countDocuments() + var datetime = new Date() + var datetimeepoch = new Date().getTime() + const response = await User.create({ + username, + password, + admin: false, + coins: 15, + userid, + moderation: JSON.stringify({ + status: "ok", + Reason: "None", + ExpiresIn: "None", + }), + joindate: datetime.toISOString().slice(0, 10), + colors: [ + { name: "Head", value: 1001 }, + { name: "Torso", value: 1001 }, + { name: "Left Arm", value: 1001 }, + { name: "Right Arm", value: 1001 }, + { name: "Left Leg", value: 1001 }, + { name: "Right Leg", value: 1001 }, + ], + lastclaimofcurrency: datetimeepoch, + membership: "None", + timesincelastrequest: datetimeepoch, + }) + //console.log(response) + } catch (error) { + if (error.code === 11000) { + return res.json({ + status: "error", + error: "Username already in use", + }) + } else if (error.errors.username.kind === "unique") { + return res.json({ + status: "error", + error: "Username already in use", + }) + } + throw error + } - - -// if all checks above have succceeded we can proceed with registering in our database -username = xss(username) // stop anyone doing anything silly :) - try{ - const password = (await bcrypt.hash(plainTextPassword, 10)) - const userid = await User.countDocuments(); - var datetime = new Date() - var datetimeepoch = new Date().getTime() - const response = await User.create({ - username, - password, - admin: false, - coins: 15, - userid, - moderation: JSON.stringify({status: "ok", Reason: "None", ExpiresIn: "None"}), - joindate: datetime.toISOString().slice(0,10), - colors: [{name: "Head",value: 1001 },{name: "Torso",value: 1001 },{name: "Left Arm",value: 1001 },{name: "Right Arm",value: 1001 },{name: "Left Leg",value: 1001 },{name: "Right Leg",value: 1001 }], - lastclaimofcurrency: datetimeepoch, - membership: "None", - timesincelastrequest: datetimeepoch - - }) - //console.log(response) - }catch(error){ - if (error.code === 11000) { - return res.json({status: 'error', error: 'Username already in use'}) - }else if (error.errors.username.kind === "unique") { - return res.json({status: 'error', error: 'Username already in use'}) - } - throw error - } - - res.json({status: 'ok'}) + res.json({ status: "ok" }) }) -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/settings.js b/Back/routes/settings.js index 3681d28..b49b5dd 100644 --- a/Back/routes/settings.js +++ b/Back/routes/settings.js @@ -1,67 +1,71 @@ const express = require("express") const router = express.Router() -const { requireAuth } = require('./../middleware/authmiddleware') +const { requireAuth } = require("./../middleware/authmiddleware") const clientid = "1008206768989544449" const secret = "M2ixbjumSA6o1Qgt7KvCNcPb_giJHyp3" -const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args)); -const User = require('./../model/user.js') -const speakeasy = require('speakeasy') -const qrcode = require('qrcode') -const bodyParser = require('body-parser') -const xss = require('xss') +const fetch = (...args) => + import("node-fetch").then(({ default: fetch }) => fetch(...args)) +const User = require("./../model/user.js") +const speakeasy = require("speakeasy") +const qrcode = require("qrcode") +const bodyParser = require("body-parser") +const xss = require("xss") router.use(bodyParser.json()) -router.get('/authenticate',requireAuth,async function(req,rep){ - const code = req.query.code - //console.log(code) - if (code){ - const response = await fetch("https://discord.com/api/oauth2/token",{ - body: new URLSearchParams({ - client_id: clientid, - client_secret: secret, - code, - grant_type: 'authorization_code', - redirect_uri: `http://mete0r.xyz/settings/authenticate`, - scope: 'identify', - }), - method: "POST", - headers: { - "Content-Type": "application/x-www-form-urlencoded" - } - }) +router.get("/authenticate", requireAuth, async function (req, rep) { + const code = req.query.code + //console.log(code) + if (code) { + const response = await fetch("https://discord.com/api/oauth2/token", { + body: new URLSearchParams({ + client_id: clientid, + client_secret: secret, + code, + grant_type: "authorization_code", + redirect_uri: `http://mete0r.xyz/settings/authenticate`, + scope: "identify", + }), + method: "POST", + headers: { + "Content-Type": "application/x-www-form-urlencoded", + }, + }) - const son = await response.json() - //console.log(son) - //console.log(son["access_token"]) + const son = await response.json() + //console.log(son) + //console.log(son["access_token"]) - const resp2 = await fetch("https://discord.com/api/users/@me",{ - headers: { - "authorization": `${son["token_type"]} ${son["access_token"]}` - } - }) + const resp2 = await fetch("https://discord.com/api/users/@me", { + headers: { + authorization: `${son["token_type"]} ${son["access_token"]}`, + }, + }) - const final = await resp2.json() + const final = await resp2.json() - const dcid = final.id - //console.log(dcid) - const user = await User.findOne({discordid: dcid})/*.lean()*/ - if (user) { - return rep.redirect("/settings?error=alreadyused") - } - const milliseconds = BigInt(dcid) >> 22n - if (new Date(Number(milliseconds) + 1420070400000)> Date.now() - (1000 * 60 * 60 * 24 * 7 * 4) === true){ // 1 month - return rep.redirect("/settings?error=toonew") - } - req.userdocument.discordid = dcid.toString() - req.userdocument.markModified('discordid') - await req.userdocument.save() + const dcid = final.id + //console.log(dcid) + const user = await User.findOne({ discordid: dcid }) /*.lean()*/ + if (user) { + return rep.redirect("/settings?error=alreadyused") + } + const milliseconds = BigInt(dcid) >> 22n + if ( + new Date(Number(milliseconds) + 1420070400000) > + Date.now() - 1000 * 60 * 60 * 24 * 7 * 4 === + true + ) { + // 1 month + return rep.redirect("/settings?error=toonew") + } + req.userdocument.discordid = dcid.toString() + req.userdocument.markModified("discordid") + await req.userdocument.save() - rep.redirect('/settings') - - } + rep.redirect("/settings") + } }) - /*router.get("/unlink", requireAuth,async (req, res) => { req.userdocument.discordid = undefined req.userdocument.markModified('discordid') @@ -69,101 +73,107 @@ router.get('/authenticate',requireAuth,async function(req,rep){ res.redirect('/settings') })*/ -router.get("/2fa", requireAuth,async (req, res) => { - if (req.userdocument.twofasecrets){ - const json = JSON.parse(req.userdocument.twofasecrets) - if (json.verified === true){ - return res.json({status: "success", message: "2FA already set sorry."}) - }else{ - // basically if they haven't verified that they know the secret before we will just remove it for them - req.userdocument.twofasecrets = undefined - req.userdocument.markModified('twofasecrets') - req.userdocument.save() - } - } - const secret = speakeasy.generateSecret({ - name: "Meteorite" - }) - qrcode.toDataURL(secret.otpauth_url, function(err, data) { - - req.userdocument.twofasecrets = JSON.stringify({secret: secret.ascii, verified: false}) - req.userdocument.markModified('twofasecrets') - req.userdocument.save() - return res.json({status: "success", message: "2FA set please verify to complete.", qrcode: data}) - }); - +router.get("/2fa", requireAuth, async (req, res) => { + if (req.userdocument.twofasecrets) { + const json = JSON.parse(req.userdocument.twofasecrets) + if (json.verified === true) { + return res.json({ + status: "success", + message: "2FA already set sorry.", + }) + } else { + // basically if they haven't verified that they know the secret before we will just remove it for them + req.userdocument.twofasecrets = undefined + req.userdocument.markModified("twofasecrets") + req.userdocument.save() + } + } + const secret = speakeasy.generateSecret({ + name: "Meteorite", + }) + qrcode.toDataURL(secret.otpauth_url, function (err, data) { + req.userdocument.twofasecrets = JSON.stringify({ + secret: secret.ascii, + verified: false, + }) + req.userdocument.markModified("twofasecrets") + req.userdocument.save() + return res.json({ + status: "success", + message: "2FA set please verify to complete.", + qrcode: data, + }) + }) }) - -router.post("/verify2fa", requireAuth,async (req, res) => { - const {code} = req.body - if (req.userdocument.twofasecrets){ - const json = JSON.parse(req.userdocument.twofasecrets) - if (json.verified === true){ - return res.json({status: "success", message: "2FA already set sorry."}) - }else{ - - const valid = speakeasy.totp.verify({ - secret: json.secret, - encoding: 'ascii', - token: code - }) - if (valid === false){ - return res.json({status: 'error', error: 'Invalid 2FA Code'}) - }else{ - json.verified = true - req.userdocument.twofasecrets = JSON.stringify(json) - req.userdocument.markModified('twofasecrets') - req.userdocument.save() - return res.json({status: "success", message:"2FA verified."}) - } - - - } - } +router.post("/verify2fa", requireAuth, async (req, res) => { + const { code } = req.body + if (req.userdocument.twofasecrets) { + const json = JSON.parse(req.userdocument.twofasecrets) + if (json.verified === true) { + return res.json({ + status: "success", + message: "2FA already set sorry.", + }) + } else { + const valid = speakeasy.totp.verify({ + secret: json.secret, + encoding: "ascii", + token: code, + }) + if (valid === false) { + return res.json({ status: "error", error: "Invalid 2FA Code" }) + } else { + json.verified = true + req.userdocument.twofasecrets = JSON.stringify(json) + req.userdocument.markModified("twofasecrets") + req.userdocument.save() + return res.json({ status: "success", message: "2FA verified." }) + } + } + } }) -router.post("/setbio", requireAuth,async (req, res) => { - const { bio } = req.body - if (typeof bio !== 'string'){ - return res.json({status: 'error', error: 'Bio not sent'}) - } - if (bio.length>100){ - return res.json({status: 'error', error: 'Length over 100.'}) - } - req.userdocument.bio = xss(bio) - req.userdocument.markModified('bio') - req.userdocument.save() - return res.json({status: "success", message:"Done."}) +router.post("/setbio", requireAuth, async (req, res) => { + const { bio } = req.body + if (typeof bio !== "string") { + return res.json({ status: "error", error: "Bio not sent" }) + } + if (bio.length > 100) { + return res.json({ status: "error", error: "Length over 100." }) + } + req.userdocument.bio = xss(bio) + req.userdocument.markModified("bio") + req.userdocument.save() + return res.json({ status: "success", message: "Done." }) }) -router.post("/changecss", requireAuth,async (req, res) => { - const { customcss } = req.body - if (typeof customcss !== 'string'){ - return res.json({status: 'error', error: 'Bio not sent'}) - } - if (customcss.length>5000){ - return res.json({status: 'error', error: 'Length over 5000.'}) - } - req.userdocument.css = xss(customcss) - req.userdocument.markModified('css') - req.userdocument.save() - return res.json({status: "success", message:"Done."}) +router.post("/changecss", requireAuth, async (req, res) => { + const { customcss } = req.body + if (typeof customcss !== "string") { + return res.json({ status: "error", error: "Bio not sent" }) + } + if (customcss.length > 5000) { + return res.json({ status: "error", error: "Length over 5000." }) + } + req.userdocument.css = xss(customcss) + req.userdocument.markModified("css") + req.userdocument.save() + return res.json({ status: "success", message: "Done." }) }) -router.post("/aboutme", requireAuth,async (req, res) => { - const { about } = req.body - if (typeof about !== 'string'){ - return res.json({status: 'error', error: 'Bio not sent'}) - } - if (about.length>200){ - return res.json({status: 'error', error: 'Length over 200.'}) - } - req.userdocument.aboutme = xss(about) - req.userdocument.markModified('aboutme') - req.userdocument.save() - return res.json({status: "success", message:"Done."}) +router.post("/aboutme", requireAuth, async (req, res) => { + const { about } = req.body + if (typeof about !== "string") { + return res.json({ status: "error", error: "Bio not sent" }) + } + if (about.length > 200) { + return res.json({ status: "error", error: "Length over 200." }) + } + req.userdocument.aboutme = xss(about) + req.userdocument.markModified("aboutme") + req.userdocument.save() + return res.json({ status: "success", message: "Done." }) }) - -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/signatures.js b/Back/routes/signatures.js index bcbb98d..c28e05b 100644 --- a/Back/routes/signatures.js +++ b/Back/routes/signatures.js @@ -1,14 +1,14 @@ -const crypto = require('crypto'); -const fs = require('fs') -const key = fs.readFileSync('DefaultPrivateKey.pem') +const crypto = require("crypto") +const fs = require("fs") +const key = fs.readFileSync("DefaultPrivateKey.pem") // signature API for roblos , used to bless scripts from site to client/rcc/studio and will grant // FULL Lua permissions to scripts, and allow CoreGui access. -function signer(wow){ - const sign = crypto.createSign('SHA1'); - sign.update("\r\n" + JSON.stringify(wow)) - var signature_b64 = sign.sign(key, "base64") - //console.log(signature_b64) +function signer(wow) { + const sign = crypto.createSign("SHA1") + sign.update("\r\n" + JSON.stringify(wow)) + var signature_b64 = sign.sign(key, "base64") + //console.log(signature_b64) - return(signature_b64) + return signature_b64 } -module.exports = {signer} \ No newline at end of file +module.exports = { signer } diff --git a/Back/routes/userinfoclient.js b/Back/routes/userinfoclient.js index df29568..b3f2023 100644 --- a/Back/routes/userinfoclient.js +++ b/Back/routes/userinfoclient.js @@ -1,257 +1,303 @@ const express = require("express") const router = express.Router() -const User = require('./../model/user.js') -var bodyParser = require('body-parser'); -router.use(bodyParser.json()); // support json encoded bodies -router.use(bodyParser.urlencoded({ extended: true })); // support encoded bodies -router.use(bodyParser.text()); // support encoded bodies +const User = require("./../model/user.js") +var bodyParser = require("body-parser") +router.use(bodyParser.json()) // support json encoded bodies +router.use(bodyParser.urlencoded({ extended: true })) // support encoded bodies +router.use(bodyParser.text()) // support encoded bodies const JWT_SECRET = process.env.JWT_SECRET -const jwt = require('jsonwebtoken') -const jwtverify = (req,res,next) => { - jwt.verify(req.headers['roblox-session-id'],JWT_SECRET, (err,decodedtoken) => { - if (err){ - return res.status(403).end() - }else{ - var tokendata = decodedtoken - var name = tokendata.username - try { - User.findOne({username: new RegExp('^'+name+'$', "i")}, function(err, doc) { - - req.userdocument = doc - next() - - })/*.lean()*/} - catch (error) { - console.error(error); - } - - } - - }) - -}; - +const jwt = require("jsonwebtoken") +const jwtverify = (req, res, next) => { + jwt.verify( + req.headers["roblox-session-id"], + JWT_SECRET, + (err, decodedtoken) => { + if (err) { + return res.status(403).end() + } else { + var tokendata = decodedtoken + var name = tokendata.username + try { + User.findOne( + { username: new RegExp("^" + name + "$", "i") }, + function (err, doc) { + req.userdocument = doc + next() + }, + ) /*.lean()*/ + } catch (error) { + console.error(error) + } + } + }, + ) +} // below is follow code -router.get("/user/following-exists",async (req, res) => { - //console.log("My userid"+req.query.userId) - //console.log("their userid"+req.query.followerUserId) - const user = await User.findOne({userid: req.query.userId}).lean() - if(!user){ - return res.json({isFollowing:"false"}) - } - if (!user.followers){ - return res.json({isFollowing:"false"}) - } +router.get("/user/following-exists", async (req, res) => { + //console.log("My userid"+req.query.userId) + //console.log("their userid"+req.query.followerUserId) + const user = await User.findOne({ userid: req.query.userId }).lean() + if (!user) { + return res.json({ isFollowing: "false" }) + } + if (!user.followers) { + return res.json({ isFollowing: "false" }) + } - const follower = user.followers.some(word => word.userid == req.query.followerUserId ) + const follower = user.followers.some( + word => word.userid == req.query.followerUserId, + ) - if (follower === false){ - return res.json({isFollowing:"false"}) - } + if (follower === false) { + return res.json({ isFollowing: "false" }) + } - res.json({success:"true",isFollowing:"true"}) + res.json({ success: "true", isFollowing: "true" }) }) -router.post("/user/follow",jwtverify,async (req, res) => { - const tofollow = req.body.followedUserId - if (!tofollow){ - return res.json({isFollowing:"false"}) - } - let follower = false - if (req.userdocument.followers){ - follower = req.userdocument.followers.some(word => word.userid == req.query.followerUserId ) - } +router.post("/user/follow", jwtverify, async (req, res) => { + const tofollow = req.body.followedUserId + if (!tofollow) { + return res.json({ isFollowing: "false" }) + } + let follower = false + if (req.userdocument.followers) { + follower = req.userdocument.followers.some( + word => word.userid == req.query.followerUserId, + ) + } + if (follower === true) { + // already following + res.json({ success: "true", isFollowing: "true" }) + } - if (follower === true){ - // already following - res.json({success:"true",isFollowing:"true"}) - } - - - User.updateOne({userid: tofollow}, { - $push: { - followers: {userid: req.userdocument.userid, username: req.userdocument.username} - } - }, - function(err, doc) { - //console.log(err) - }) - - res.json({success:"true",isFollowing:"true"}) - - + User.updateOne( + { userid: tofollow }, + { + $push: { + followers: { + userid: req.userdocument.userid, + username: req.userdocument.username, + }, + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + res.json({ success: "true", isFollowing: "true" }) }) -router.post("/user/unfollow",jwtverify,async (req, res) => { - const tofollow = req.body.followedUserId - if (!tofollow){ - return res.json({isFollowing:"false"}) - } - - - User.updateOne({userid: tofollow}, { - $pull: { - followers: {userid: req.userdocument.userid, username: req.userdocument.username} - } - }, - function(err, doc) { - //console.log(err) - }) - - res.json({success:"true",isFollowing:"false"}) - +router.post("/user/unfollow", jwtverify, async (req, res) => { + const tofollow = req.body.followedUserId + if (!tofollow) { + return res.json({ isFollowing: "false" }) + } + User.updateOne( + { userid: tofollow }, + { + $pull: { + followers: { + userid: req.userdocument.userid, + username: req.userdocument.username, + }, + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + res.json({ success: "true", isFollowing: "false" }) }) //below is friend code -router.get("/user/get-friendship-count",async (req, res) => { - // this is used to limit friends on the client but since we won't have friends limits we can leave it here - res.json({success:"true",count:1}) +router.get("/user/get-friendship-count", async (req, res) => { + // this is used to limit friends on the client but since we won't have friends limits we can leave it here + res.json({ success: "true", count: 1 }) }) -router.post("/user/request-friendship",jwtverify,async (req, res) => { - const tofriend = req.query.recipientUserId +router.post("/user/request-friendship", jwtverify, async (req, res) => { + const tofriend = req.query.recipientUserId - if (!tofriend){ - return res.json({isFollowing:"false"}) - } - - const usertofriend = await User.findOne({userid: tofriend}).lean() - if (!usertofriend){ - return res.json({success:"true",isFollowing:"true"}) - } + if (!tofriend) { + return res.json({ isFollowing: "false" }) + } + const usertofriend = await User.findOne({ userid: tofriend }).lean() + if (!usertofriend) { + return res.json({ success: "true", isFollowing: "true" }) + } - if (usertofriend.friends){ - const friends = usertofriend.friends.some(word => word.userid == req.userdocument.userid) - if (friends === true){ + if (usertofriend.friends) { + const friends = usertofriend.friends.some( + word => word.userid == req.userdocument.userid, + ) + if (friends === true) { + return res.json({ success: "true", isFollowing: "true" }) + } + // already friends + } + if (req.userdocument.friendrequests) { + // check if the other user is already requesting to friend the player so then they both want to be firends so we can interperept this as an accept request - return res.json({success:"true",isFollowing:"true"}) - } - // already friends - } - if (req.userdocument.friendrequests){ - // check if the other user is already requesting to friend the player so then they both want to be firends so we can interperept this as an accept request - - const bothwantobefriends = req.userdocument.friendrequests.some(word => word.userid == usertofriend.userid) - if (bothwantobefriends === true){ - console.log(tofriend) - User.updateOne({userid: req.userdocument.userid}, { - $push: { - friends: {userid: usertofriend.userid, username: usertofriend.username} - }, - $pull: { - friendrequests: {userid: usertofriend.userid, username: usertofriend.username} - } - }, - function(err, doc) { - - }) + const bothwantobefriends = req.userdocument.friendrequests.some( + word => word.userid == usertofriend.userid, + ) + if (bothwantobefriends === true) { + console.log(tofriend) + User.updateOne( + { userid: req.userdocument.userid }, + { + $push: { + friends: { + userid: usertofriend.userid, + username: usertofriend.username, + }, + }, + $pull: { + friendrequests: { + userid: usertofriend.userid, + username: usertofriend.username, + }, + }, + }, + function (err, doc) {}, + ) - User.updateOne({userid: tofriend}, { - $push: { - friends: {userid: req.userdocument.userid, username: req.userdocument.username} - }, - $pull: { - friendrequests: {userid: req.userdocument.userid, username: req.userdocument.username} - } - }, - function(err, doc) { - - }) + User.updateOne( + { userid: tofriend }, + { + $push: { + friends: { + userid: req.userdocument.userid, + username: req.userdocument.username, + }, + }, + $pull: { + friendrequests: { + userid: req.userdocument.userid, + username: req.userdocument.username, + }, + }, + }, + function (err, doc) {}, + ) - return res.json({success:"true",isFollowing:"true"}) - } + return res.json({ success: "true", isFollowing: "true" }) + } + } + if (usertofriend.friendrequests) { + const alreadyrequested = usertofriend.friendrequests.some( + word => word.userid == req.userdocument.userid, + ) - } - if (usertofriend.friendrequests){ - const alreadyrequested = usertofriend.friendrequests.some(word => word.userid == req.userdocument.userid) - - // already friend requested - if (alreadyrequested === true){ - - return res.json({success:"true",isFollowing:"true"}) - } - } - - User.updateOne({userid: usertofriend.userid}, { - $push: { - friendrequests: {userid: req.userdocument.userid, username: req.userdocument.username} - } - }, - function(err, doc) { - - }) - - res.json({success:"true",isFollowing:"true"}) - + // already friend requested + if (alreadyrequested === true) { + return res.json({ success: "true", isFollowing: "true" }) + } + } + User.updateOne( + { userid: usertofriend.userid }, + { + $push: { + friendrequests: { + userid: req.userdocument.userid, + username: req.userdocument.username, + }, + }, + }, + function (err, doc) {}, + ) + res.json({ success: "true", isFollowing: "true" }) }) -router.post("/user/decline-friend-request",jwtverify,async (req, res) => { - const tounfriend = req.query.requesterUserId - //console.log(tounfriend+" nerd") - if (!tounfriend){ - return res.json({isFollowing:"false"}) - } - const usertofriend = await User.findOne({userid: tounfriend}).lean() - if (!usertofriend){ - return res.json({success:"true",isFollowing:"true"}) - } - - const alreadyfriends = req.userdocument.friends.some(word => word.userid == tounfriend ) - if (alreadyfriends === true){ - // already friends with the person so they want ro remove their friend - User.updateOne({userid: tounfriend}, { - $pull: { - friends: {userid: req.userdocument.userid, username: req.userdocument.username} - } - }, - function(err, doc) { - //console.log(err) - }) - User.updateOne({userid: req.userdocument.userid}, { - $pull: { - friends: {userid:usertofriend.userid, username: usertofriend.username} - } - }, - function(err, doc) { - //console.log(err) - }) - return res.json({success:"true",isFollowing:"true"}) - } +router.post("/user/decline-friend-request", jwtverify, async (req, res) => { + const tounfriend = req.query.requesterUserId + //console.log(tounfriend+" nerd") + if (!tounfriend) { + return res.json({ isFollowing: "false" }) + } + const usertofriend = await User.findOne({ userid: tounfriend }).lean() + if (!usertofriend) { + return res.json({ success: "true", isFollowing: "true" }) + } + const alreadyfriends = req.userdocument.friends.some( + word => word.userid == tounfriend, + ) + if (alreadyfriends === true) { + // already friends with the person so they want ro remove their friend + User.updateOne( + { userid: tounfriend }, + { + $pull: { + friends: { + userid: req.userdocument.userid, + username: req.userdocument.username, + }, + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + User.updateOne( + { userid: req.userdocument.userid }, + { + $pull: { + friends: { + userid: usertofriend.userid, + username: usertofriend.username, + }, + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + return res.json({ success: "true", isFollowing: "true" }) + } + //otherwise the user isn't friends but still declines the friend request - //otherwise the user isn't friends but still declines the friend request - - User.updateOne({userid: tounfriend}, { - $pull: { - friendrequests: {userid: req.userdocument.userid, username: req.userdocument.username} - } - }, - function(err, doc) { - //console.log(err) - }) - User.updateOne({userid: req.userdocument.userid}, { - $pull: { - friendrequests: {userid: usertofriend.userid, username: usertofriend.username} - } - }, - function(err, doc) { - //console.log(err) - }) - - res.json({success:"true",isFollowing:"true"}) - - + User.updateOne( + { userid: tounfriend }, + { + $pull: { + friendrequests: { + userid: req.userdocument.userid, + username: req.userdocument.username, + }, + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + User.updateOne( + { userid: req.userdocument.userid }, + { + $pull: { + friendrequests: { + userid: usertofriend.userid, + username: usertofriend.username, + }, + }, + }, + function (err, doc) { + //console.log(err) + }, + ) + res.json({ success: "true", isFollowing: "true" }) }) -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/users.js b/Back/routes/users.js index f2cf3ac..e338740 100644 --- a/Back/routes/users.js +++ b/Back/routes/users.js @@ -1,49 +1,64 @@ const express = require("express") const router = express.Router() -const { requireAuth } = require('./../middleware/authmiddleware') -const User = require('./../model/user.js') -const games = require('./../model/games.js') -const bodyParser = require('body-parser') +const { requireAuth } = require("./../middleware/authmiddleware") +const User = require("./../model/user.js") +const games = require("./../model/games.js") +const bodyParser = require("body-parser") router.use(bodyParser.json()) -router.post('/api/users/search', async (req, res) => { - const resultsPerPage = 12 - let page = req.body.page ?? 0 - if (page != 0){ - page-=1 - } - let {searchquery} = req.body +router.post("/api/users/search", async (req, res) => { + const resultsPerPage = 12 + let page = req.body.page ?? 0 + if (page != 0) { + page -= 1 + } + let { searchquery } = req.body - function escapeRegex(text) { - return text?.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); - } - const regex = new RegExp(escapeRegex(searchquery), 'gi'); + function escapeRegex(text) { + return text?.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&") + } + const regex = new RegExp(escapeRegex(searchquery), "gi") - //const pages = await User.countDocuments({username: regex})/resultsPerPage + //const pages = await User.countDocuments({username: regex})/resultsPerPage - const response = await User.find({username: regex}).limit(resultsPerPage).skip(0+parseFloat(page)*resultsPerPage).select(['userid','username']).lean() - let responsecount = await User.countDocuments({username: regex}) + const response = await User.find({ username: regex }) + .limit(resultsPerPage) + .skip(0 + parseFloat(page) * resultsPerPage) + .select(["userid", "username"]) + .lean() + let responsecount = await User.countDocuments({ username: regex }) - res.json({data: response, pages: Math.ceil(Math.max(responsecount/resultsPerPage, 1))}) -}); + res.json({ + data: response, + pages: Math.ceil(Math.max(responsecount / resultsPerPage, 1)), + }) +}) -router.get(['/users/:userid/canmanage/:gameid','//users/:userid/canmanage/:gameid'], async (req, res) => { +router.get( + ["/users/:userid/canmanage/:gameid", "//users/:userid/canmanage/:gameid"], + async (req, res) => { + const user = await User.findOne({ + userid: req.params.userid, + }) /*.lean()*/ + if (!user) { + return res.json({ Success: false, CanManage: false }) + } - const user = await User.findOne({userid: req.params.userid})/*.lean()*/ - if (!user) { - return res.json({"Success":false,"CanManage":false}) - } - - const game = await games.findOne({idofgame: req.params.gameid}).lean() - if (!game) { - return res.json({"Success":false,"CanManage":false}) - } + const game = await games.findOne({ idofgame: req.params.gameid }).lean() + if (!game) { + return res.json({ Success: false, CanManage: false }) + } - if (game.useridofowner === user.userid || user.userid === 0 || user.userid === 18){ - return res.json({"Success":true,"CanManage":true}) - } + if ( + game.useridofowner === user.userid || + user.userid === 0 || + user.userid === 18 + ) { + return res.json({ Success: true, CanManage: true }) + } - return res.json({"Success":true,"CanManage":false}) -}); + return res.json({ Success: true, CanManage: false }) + }, +) -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/routes/versioncompatibility.js b/Back/routes/versioncompatibility.js index 7b5f1bf..a6001ae 100644 --- a/Back/routes/versioncompatibility.js +++ b/Back/routes/versioncompatibility.js @@ -10,7 +10,7 @@ const router = express.Router() //}) router.get("/universes/validate-place-join", async (req, res) => { - res.send("true") + res.send("true") }) -module.exports = router \ No newline at end of file +module.exports = router diff --git a/Back/server.mjs b/Back/server.mjs index f417149..0722d73 100644 --- a/Back/server.mjs +++ b/Back/server.mjs @@ -1,378 +1,426 @@ -import Module from "node:module"; +import Module from "node:module" -const require = Module.createRequire(import.meta.url); -import path from 'path'; -import { fileURLToPath } from 'url'; -import { requireAuth } from "./middleware/authmiddleware.js"; +const require = Module.createRequire(import.meta.url) +import path from "path" +import { fileURLToPath } from "url" +import { requireAuth } from "./middleware/authmiddleware.js" -const __filename = fileURLToPath(import.meta.url); +const __filename = fileURLToPath(import.meta.url) -const __dirname = path.dirname(__filename); +const __dirname = path.dirname(__filename) - -var express = require('express'); -const app = require("express")(); -var cookieParser = require('cookie-parser') -var session = require('express-session') -const helmet = require("helmet"); -const mongoose = require('mongoose'); -const config = require('./model/config.js') -import ipWhitelist from './model/ipWhitelist.mjs' -const user = require('./model/user.js') +var express = require("express") +const app = require("express")() +var cookieParser = require("cookie-parser") +var session = require("express-session") +const helmet = require("helmet") +const mongoose = require("mongoose") +const config = require("./model/config.js") +import ipWhitelist from "./model/ipWhitelist.mjs" +const user = require("./model/user.js") const model = require("./model/user.js") -const jwt = require('jsonwebtoken') -const rcctalk = require('./rcctalk') -const { grabAuth } = require('./middleware/grabauth.js') -const games = require('./model/games.js') -require('dotenv').config() -const https = require('https') +const jwt = require("jsonwebtoken") +const rcctalk = require("./rcctalk") +const { grabAuth } = require("./middleware/grabauth.js") +const games = require("./model/games.js") +require("dotenv").config() +const https = require("https") const PROD = process.env.PROD -const client = require('prom-client') -const { handler } = await import('../meteoriterewrite/build/handler.js') +const client = require("prom-client") +const { handler } = await import("../meteoriterewrite/build/handler.js") app.use((req, res, next) => { - const allowedOrigins = ['m.mete0r.xyz', 'mete0r.xyz', 'assetgame.mete0r.xyz', 'www.mete0r.xyz', 'api.mete0r.xyz', 'dinnerbone.mete0r.xyz' /* funny */, 'assetgame.mete0r.xyz', 'clientsettingscdn.mete0r.xyz', 'http://127.0.0.1:5173'] - const origin = req.get('host') - if (allowedOrigins.includes(origin)) { - res.setHeader('Access-Control-Allow-Origin', req.headers['x-forwarded-proto']??"http"+"://"+origin) - } - if (origin === "mete0r.xyz"){ - res.setHeader('Access-Control-Allow-Origin', '*'); - } - //res.header('Access-Control-Allow-Origin', 'http://127.0.0.1:8020'); - res.header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS'); - res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization') - res.header('Access-Control-Allow-Credentials', true); - return next(); - }); + const allowedOrigins = [ + "m.mete0r.xyz", + "mete0r.xyz", + "assetgame.mete0r.xyz", + "www.mete0r.xyz", + "api.mete0r.xyz", + "dinnerbone.mete0r.xyz" /* funny */, + "assetgame.mete0r.xyz", + "clientsettingscdn.mete0r.xyz", + "http://127.0.0.1:5173", + ] + const origin = req.get("host") + if (allowedOrigins.includes(origin)) { + res.setHeader( + "Access-Control-Allow-Origin", + req.headers["x-forwarded-proto"] ?? "http" + "://" + origin, + ) + } + if (origin === "mete0r.xyz") { + res.setHeader("Access-Control-Allow-Origin", "*") + } + //res.header('Access-Control-Allow-Origin', 'http://127.0.0.1:8020'); + res.header("Access-Control-Allow-Methods", "POST, GET, OPTIONS") + res.header("Access-Control-Allow-Headers", "Content-Type, Authorization") + res.header("Access-Control-Allow-Credentials", true) + return next() +}) -import { createClient } from 'redis' +import { createClient } from "redis" let redis // on prod we can just use a locally hosted redisStack I'm too lazy to use docker on windows to host one for local dev -if (PROD === "true"){ - redis = createClient() -}else{ - redis = createClient({url: "redis://default:2BxaAV7Dcbt8d6QqNm58TdUfdIQtEY5q@redis-15195.c53.west-us.azure.cloud.redislabs.com:15195"}) +if (PROD === "true") { + redis = createClient() +} else { + redis = createClient({ + url: "redis://default:2BxaAV7Dcbt8d6QqNm58TdUfdIQtEY5q@redis-15195.c53.west-us.azure.cloud.redislabs.com:15195", + }) } -redis.on('error', (err) => console.log('Redis Client Error', err)); +redis.on("error", err => console.log("Redis Client Error", err)) await redis.connect() -import { Repository } from 'redis-om' - +import { Repository } from "redis-om" const ipWhiteListRepository = new Repository(ipWhitelist, redis) const collectDefaultMetrics = client.collectDefaultMetrics -collectDefaultMetrics({timeout: 5000}) +collectDefaultMetrics({ timeout: 5000 }) const counter = new client.Counter({ - name: 'node_request_operations_total', - help: 'The total number of processed requests' + name: "node_request_operations_total", + help: "The total number of processed requests", }) const playercounter = new client.Gauge({ - name: 'node_players', - help: 'Amount of players every minute', - async collect() { - // Invoked when the registry collects its metrics' values. - const currentValue = await games.aggregate([ - { - "$group": { - "_id": null, - "numberofplayers": { - '$sum': { - '$convert': { 'input': '$numberofplayers', 'to': 'int' } - } - } - } - } - ]) - this.set(currentValue[0].numberofplayers); - }, + name: "node_players", + help: "Amount of players every minute", + async collect() { + // Invoked when the registry collects its metrics' values. + const currentValue = await games.aggregate([ + { + $group: { + _id: null, + numberofplayers: { + $sum: { + $convert: { input: "$numberofplayers", to: "int" }, + }, + }, + }, + }, + ]) + this.set(currentValue[0].numberofplayers) + }, }) const histogram = new client.Histogram({ - name: 'node_request_duration_seconds', - help: 'Histogram for the duration in seconds', - buckets: [1,2,5,6,10] + name: "node_request_duration_seconds", + help: "Histogram for the duration in seconds", + buckets: [1, 2, 5, 6, 10], }) -const getDurationInMilliseconds = (start) => { - const NS_PER_SEC = 1e9 - const NS_TO_MS = 1e6 - const diff = process.hrtime(start) +const getDurationInMilliseconds = start => { + const NS_PER_SEC = 1e9 + const NS_TO_MS = 1e6 + const diff = process.hrtime(start) - return (diff[0] * NS_PER_SEC + diff[1]) / NS_TO_MS + return (diff[0] * NS_PER_SEC + diff[1]) / NS_TO_MS } app.use((req, res, next) => { - const start = process.hrtime() - counter.inc() + const start = process.hrtime() + counter.inc() - res.on('finish', () => { - const durationInMilliseconds = getDurationInMilliseconds (start) - histogram.observe(durationInMilliseconds) - }) + res.on("finish", () => { + const durationInMilliseconds = getDurationInMilliseconds(start) + histogram.observe(durationInMilliseconds) + }) - next() + next() }) - const JWT_SECRET = process.env.JWT_SECRET const RCC_HOST = process.env.RCC_HOST const DB_PASSWORD = process.env.DB_PASSWORD console.log(RCC_HOST) -if (PROD === "true"){ - mongoose.connect('mongodb://localhost:27017/meteoritedb', { - useNewUrlParser: true, - useUnifiedTopology: true, - authSource: "admin", - user: "server", - pass: DB_PASSWORD, -}) -}else{ - mongoose.connect('mongodb://localhost:27017/meteoritedb', { - useNewUrlParser: true, - useUnifiedTopology: true, - }) +if (PROD === "true") { + mongoose.connect("mongodb://localhost:27017/meteoritedb", { + useNewUrlParser: true, + useUnifiedTopology: true, + authSource: "admin", + user: "server", + pass: DB_PASSWORD, + }) +} else { + mongoose.connect("mongodb://localhost:27017/meteoritedb", { + useNewUrlParser: true, + useUnifiedTopology: true, + }) } -app.disable('x-powered-by') // we don't wanna tell potential attackers our exact framework yet lol +app.disable("x-powered-by") // we don't wanna tell potential attackers our exact framework yet lol // automatically create a default document in mongodb for our config // if the config document doesn't exist auto create one these are also the default settings your site will start with -async function createconfig(){ -try { - var resp = await config.findOne() - if (!resp) { - const response = await config.create({ - RegistrationEnabled: true, - MaintenanceEnabled: false, - KeysEnabled: false, - GamesEnabled: true - }) - } - } catch (err) { - throw(err) - } +async function createconfig() { + try { + var resp = await config.findOne() + if (!resp) { + const response = await config.create({ + RegistrationEnabled: true, + MaintenanceEnabled: false, + KeysEnabled: false, + GamesEnabled: true, + }) + } + } catch (err) { + throw err + } } createconfig() app.use(cookieParser()) // maintenance mode middleware app.use(async function (req, res, next) { - if (req.url === "/assets/audio/wof.mp3"){ - return next() - } - res.header("Cache-Control", "no-store,no-cache,must-revalidate"); - var resp = await config.findOne().lean() - req.config = resp + if (req.url === "/assets/audio/wof.mp3") { + return next() + } + res.header("Cache-Control", "no-store,no-cache,must-revalidate") + var resp = await config.findOne().lean() + req.config = resp - //console.log(req.headers['x-forwarded-proto']) - if (!req.headers['x-forwarded-proto']){ - if (req.secure === true){ - req.headers['x-forwarded-proto'] = "https" - }else{ - req.headers['x-forwarded-proto'] = "http" - } - } - if (!req.headers['cf-connecting-ip']){ //localhost - res.header("Access-Control-Allow-Origin", "*"); - } - if (req.headers['x-forwarded-host'] === "www.mete0r.xyz" && req.headers['x-forwarded-host'] && req.headers?.["user-agent"] != "RobloxStudio/WinInet" && req.headers?.["user-agent"] != "Roblox/WinInet"){ - if (req.method === "GET" && req.url.startsWith('/game/') === false && req.url.startsWith("/login/") === false){ - return res.redirect(302, req.headers['x-forwarded-proto']+"://mete0r.xyz"+req.url) - } - } - //console.log(req.headers['x-forwarded-host']) - //req.headers['x-forwarded-host'] = "mete0r.xyz" - //console.log(req.headers?.['cf-connecting-ip']) - //console.log(req.socket.remoteAddress) - //console.log(req.url) - if (req.url === "/assets/2020.zip"){ - return res.redirect("https://www.youtube.com/watch?v=dQw4w9WgXcQ") - } - //return res.sendFile(path.join(__dirname, '/under_maintenance.html')); + //console.log(req.headers['x-forwarded-proto']) + if (!req.headers["x-forwarded-proto"]) { + if (req.secure === true) { + req.headers["x-forwarded-proto"] = "https" + } else { + req.headers["x-forwarded-proto"] = "http" + } + } + if (!req.headers["cf-connecting-ip"]) { + //localhost + res.header("Access-Control-Allow-Origin", "*") + } + if ( + req.headers["x-forwarded-host"] === "www.mete0r.xyz" && + req.headers["x-forwarded-host"] && + req.headers?.["user-agent"] != "RobloxStudio/WinInet" && + req.headers?.["user-agent"] != "Roblox/WinInet" + ) { + if ( + req.method === "GET" && + req.url.startsWith("/game/") === false && + req.url.startsWith("/login/") === false + ) { + return res.redirect( + 302, + req.headers["x-forwarded-proto"] + "://mete0r.xyz" + req.url, + ) + } + } + //console.log(req.headers['x-forwarded-host']) + //req.headers['x-forwarded-host'] = "mete0r.xyz" + //console.log(req.headers?.['cf-connecting-ip']) + //console.log(req.socket.remoteAddress) + //console.log(req.url) + if (req.url === "/assets/2020.zip") { + return res.redirect("https://www.youtube.com/watch?v=dQw4w9WgXcQ") + } + //return res.sendFile(path.join(__dirname, '/under_maintenance.html')); - if (resp.MaintenanceEnabled === true && req.headers?.['cf-connecting-ip'] != RCC_HOST && req.headers?.['cf-connecting-ip']){ - if (!req.cookies) { - return res.sendFile(path.join(__dirname, '/under_maintenance.html')); - } + if ( + resp.MaintenanceEnabled === true && + req.headers?.["cf-connecting-ip"] != RCC_HOST && + req.headers?.["cf-connecting-ip"] + ) { + if (!req.cookies) { + return res.sendFile(path.join(__dirname, "/under_maintenance.html")) + } - if (req?.cookies?.real === "2fKMlOumsNSnbuVJkLonCOYZXYZbWrGrdDeRTIeWAbXeOiFGyAY"){ - return next() - } - return res.sendFile(path.join(__dirname, '/under_maintenance.html')); - } + if ( + req?.cookies?.real === + "2fKMlOumsNSnbuVJkLonCOYZXYZbWrGrdDeRTIeWAbXeOiFGyAY" + ) { + return next() + } + return res.sendFile(path.join(__dirname, "/under_maintenance.html")) + } - if (req.headers?.['cf-connecting-ip'] != RCC_HOST && req.headers?.['cf-connecting-ip'] && req.url != "/initialize" && req.headers?.["user-agent"] != "Roblox/WinInet" && req.headers?.["user-agent"] != "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/605.1.15 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/605.1.15"){ - var ip = req.headers['cf-connecting-ip'] || req.socket.remoteAddress - var resp = await redis.exists('ipWhiteListSchema:'+ip.toString()) - if (resp === 0){ - return res.status(401).send("Not allowed visit the discord. discord.gg/5r6ZjG57kU") - } - } - next() - }) - -app.use(express.urlencoded({ extended: true })) -async function lol(){ - try { - const res= await rcctalk.GetAllJobs() - //console.dir(res,{ depth: null }) - } catch (error) { - throw("RCC Test run failed please have rcc soap running on port 64989") - } -} -//lol() -app.set('trust proxy', true) - -// routes lol -const assetRouter = require('./routes/assets.js') - -app.use(['/asset','/v1/asset'], assetRouter) - -const gameRouter = require('./routes/game.js') - -app.use(['/game','//game'],gameRouter) - -const persistenceRouter = require('./routes/persistence.js') - -app.use('/persistence',persistenceRouter) - -const clientSettingsRouter = require('./routes/clientsettings.js') - -app.use('/',clientSettingsRouter) - -const registerRouter = require('./routes/register.js') - -app.use('/register',registerRouter) - -const loginRouter = require('./routes/login.js') - -app.use(['/login',"/v2/login","/v2/twostepverification/verify"],loginRouter) - -const logoutRouter = require('./routes/logout.js'); - -app.use('/logout',logoutRouter) - -const gamesRouter = require('./routes/games.js'); - -app.use('/games',gamesRouter) - -const adminRouter = require('./routes/admin.js'); - -app.use('/admin',adminRouter) - -app.get('/users/account-info', (req, res) => { - return res.json({ - AgeBracket : 0, - Email : { - IsVerified : 1, - Value : "kmulherin@roblox.com", - }, - HasPasswordSet : 1, - Username : "iMightBeLying", - RobuxBalance: 9999999 - }) + if ( + req.headers?.["cf-connecting-ip"] != RCC_HOST && + req.headers?.["cf-connecting-ip"] && + req.url != "/initialize" && + req.headers?.["user-agent"] != "Roblox/WinInet" && + req.headers?.["user-agent"] != + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/605.1.15 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/605.1.15" + ) { + var ip = req.headers["cf-connecting-ip"] || req.socket.remoteAddress + var resp = await redis.exists("ipWhiteListSchema:" + ip.toString()) + if (resp === 0) { + return res + .status(401) + .send("Not allowed visit the discord. discord.gg/5r6ZjG57kU") + } + } + next() }) -const usersRouter = require('./routes/users.js'); +app.use(express.urlencoded({ extended: true })) +async function lol() { + try { + const res = await rcctalk.GetAllJobs() + //console.dir(res,{ depth: null }) + } catch (error) { + throw "RCC Test run failed please have rcc soap running on port 64989" + } +} +//lol() +app.set("trust proxy", true) -app.use('/',usersRouter) +// routes lol +const assetRouter = require("./routes/assets.js") -const avatarRouter = require('./routes/avatar.js'); +app.use(["/asset", "/v1/asset"], assetRouter) -app.use('/api/avatar',avatarRouter) +const gameRouter = require("./routes/game.js") -const settingsRouter = require('./routes/settings.js'); +app.use(["/game", "//game"], gameRouter) -app.use('/settings',settingsRouter) +const persistenceRouter = require("./routes/persistence.js") -const developRouter = require('./routes/develop.js'); +app.use("/persistence", persistenceRouter) -app.use('/develop',developRouter) +const clientSettingsRouter = require("./routes/clientsettings.js") -const thumbnailRenderRouter = require('./routes/api/renderthumbnail.js'); +app.use("/", clientSettingsRouter) -app.use(['/api/thumbnailrender','/thumbs'/*2016 asset thumbs*/, '/avatar-thumbnail/image'],thumbnailRenderRouter) +const registerRouter = require("./routes/register.js") -const purchaseRouter = require('./routes/api/purchase.js'); +app.use("/register", registerRouter) -app.use('/api/purchase',purchaseRouter) +const loginRouter = require("./routes/login.js") -const moderateRouter = require('./routes/api/moderate.js'); +app.use(["/login", "/v2/login", "/v2/twostepverification/verify"], loginRouter) -app.use('/api/moderate',moderateRouter) +const logoutRouter = require("./routes/logout.js") -const verifyRouter = require('./routes/api/verify.js'); +app.use("/logout", logoutRouter) -app.use('/api/verify',verifyRouter) +const gamesRouter = require("./routes/games.js") -const itemactionRouter = require('./routes/api/itemaction.js'); +app.use("/games", gamesRouter) -app.use('/api/itemaction',itemactionRouter) +const adminRouter = require("./routes/admin.js") -const bodycolorupdateRouter = require('./routes/api/bodycolorupdate.js'); +app.use("/admin", adminRouter) -app.use('/api/bodycolorupdate',bodycolorupdateRouter) +app.get("/users/account-info", (req, res) => { + return res.json({ + AgeBracket: 0, + Email: { + IsVerified: 1, + Value: "kmulherin@roblox.com", + }, + HasPasswordSet: 1, + Username: "iMightBeLying", + RobuxBalance: 9999999, + }) +}) -const changepasswordRouter = require('./routes/api/changepassword.js'); +const usersRouter = require("./routes/users.js") -app.use('/api/changepassword',changepasswordRouter) +app.use("/", usersRouter) -const generatekeyRouter = require('./routes/api/generatekey.js'); +const avatarRouter = require("./routes/avatar.js") -app.use('/api/generatekey',generatekeyRouter) +app.use("/api/avatar", avatarRouter) -const authRouter = require('./routes/api/auth.js'); +const settingsRouter = require("./routes/settings.js") -app.use('/api/auth',authRouter) +app.use("/settings", settingsRouter) -const catalogRouter = require('./routes/catalog.js'); +const developRouter = require("./routes/develop.js") -app.use('/api/catalog',catalogRouter) +app.use("/develop", developRouter) -const updategameinfoRouter = require('./routes/api/updategameinfo.js'); +const thumbnailRenderRouter = require("./routes/api/renderthumbnail.js") -app.use('/',updategameinfoRouter) +app.use( + [ + "/api/thumbnailrender", + "/thumbs" /*2016 asset thumbs*/, + "/avatar-thumbnail/image", + ], + thumbnailRenderRouter, +) -const userinfoRouter = require('./routes/api/userinfo.js'); +const purchaseRouter = require("./routes/api/purchase.js") -app.use('/api/userinfo',userinfoRouter) +app.use("/api/purchase", purchaseRouter) -const updateusermembershipRouter = require('./routes/api/updateusermembership.js'); +const moderateRouter = require("./routes/api/moderate.js") -app.use('/api/updateusermembership',updateusermembershipRouter) +app.use("/api/moderate", moderateRouter) -const marketplaceRouter = require('./routes/marketplace.js'); +const verifyRouter = require("./routes/api/verify.js") -app.use('/',marketplaceRouter) +app.use("/api/verify", verifyRouter) -const versioncompatibilityRouter = require('./routes/versioncompatibility.js'); +const itemactionRouter = require("./routes/api/itemaction.js") -app.use('/',versioncompatibilityRouter) +app.use("/api/itemaction", itemactionRouter) -const t8gameRouter = require('./routes/2018/game.js'); +const bodycolorupdateRouter = require("./routes/api/bodycolorupdate.js") -app.use('/game/',t8gameRouter.router) +app.use("/api/bodycolorupdate", bodycolorupdateRouter) -const t20gameRouter = require('./routes/2020/game.js') +const changepasswordRouter = require("./routes/api/changepassword.js") -app.use(['/game/','/v1'],t20gameRouter.router) +app.use("/api/changepassword", changepasswordRouter) -const mobileApiRouter = require('./routes/mobileapi.js'); +const generatekeyRouter = require("./routes/api/generatekey.js") -app.use('/mobileapi',mobileApiRouter) +app.use("/api/generatekey", generatekeyRouter) -const friendsApiRouter = require('./routes/api/friends.js'); +const authRouter = require("./routes/api/auth.js") -app.use('/api/friends',friendsApiRouter) +app.use("/api/auth", authRouter) -const advertiseApiRouter = require('./routes/api/advertise.js'); +const catalogRouter = require("./routes/catalog.js") -app.use('/api/advertise',advertiseApiRouter) +app.use("/api/catalog", catalogRouter) -const requestAdRouter = require('./routes/api/requestad.js'); +const updategameinfoRouter = require("./routes/api/updategameinfo.js") -app.use('/api/requestad',requestAdRouter) +app.use("/", updategameinfoRouter) + +const userinfoRouter = require("./routes/api/userinfo.js") + +app.use("/api/userinfo", userinfoRouter) + +const updateusermembershipRouter = require("./routes/api/updateusermembership.js") + +app.use("/api/updateusermembership", updateusermembershipRouter) + +const marketplaceRouter = require("./routes/marketplace.js") + +app.use("/", marketplaceRouter) + +const versioncompatibilityRouter = require("./routes/versioncompatibility.js") + +app.use("/", versioncompatibilityRouter) + +const t8gameRouter = require("./routes/2018/game.js") + +app.use("/game/", t8gameRouter.router) + +const t20gameRouter = require("./routes/2020/game.js") + +app.use(["/game/", "/v1"], t20gameRouter.router) + +const mobileApiRouter = require("./routes/mobileapi.js") + +app.use("/mobileapi", mobileApiRouter) + +const friendsApiRouter = require("./routes/api/friends.js") + +app.use("/api/friends", friendsApiRouter) + +const advertiseApiRouter = require("./routes/api/advertise.js") + +app.use("/api/advertise", advertiseApiRouter) + +const requestAdRouter = require("./routes/api/requestad.js") + +app.use("/api/requestad", requestAdRouter) /*const bankRouter = require('./routes/api/bank.js'); @@ -382,14 +430,13 @@ app.use('/api/bank',bankRouter)*/ app.use('/api/groups',groupRouter)*/ -const feedRouter = require('./routes/api/feed.js'); +const feedRouter = require("./routes/api/feed.js") -app.use('/api/feed',feedRouter) +app.use("/api/feed", feedRouter) -const commentRouter = require('./routes/api/comment.js'); - -app.use('/api/comments',commentRouter) +const commentRouter = require("./routes/api/comment.js") +app.use("/api/comments", commentRouter) /* app.get("/My/Places", (req, res) => { @@ -397,309 +444,3479 @@ app.get("/My/Places", (req, res) => { })*/ app.get("/studio/e.png", (req, res) => { - res.send() + res.send() }) app.get("/tags/c/36/studio.json", (req, res) => { - res.json({"users":[{"id":306443,"username":"Hajimalago","avatar_template":"/user_avatar/devforum.roblox.com/hajimalago/{size}/724795_2.png"},{"id":36263,"username":"rickje139","avatar_template":"/user_avatar/devforum.roblox.com/rickje139/{size}/1459648_2.png"},{"id":120450,"username":"GodSysAdmin","avatar_template":"/user_avatar/devforum.roblox.com/godsysadmin/{size}/1540208_2.png"},{"id":472489,"username":"ItsMeFelixAccept","avatar_template":"/user_avatar/devforum.roblox.com/itsmefelixaccept/{size}/1551006_2.png"},{"id":44883,"username":"iSyriux","avatar_template":"/user_avatar/devforum.roblox.com/isyriux/{size}/1464807_2.png"},{"id":351893,"username":"JoshSedai","avatar_template":"/user_avatar/devforum.roblox.com/joshsedai/{size}/842420_2.png"},{"id":376200,"username":"Logimite","avatar_template":"/user_avatar/devforum.roblox.com/logimite/{size}/1573532_2.png"},{"id":598293,"username":"jmkd3v","avatar_template":"/user_avatar/devforum.roblox.com/jmkd3v/{size}/1572236_2.png"},{"id":249742,"username":"zachary108181","avatar_template":"/user_avatar/devforum.roblox.com/zachary108181/{size}/1376998_2.png"},{"id":557246,"username":"Miles_1king","avatar_template":"/user_avatar/devforum.roblox.com/miles_1king/{size}/1558993_2.png"},{"id":341046,"username":"tnavarts","avatar_template":"/user_avatar/devforum.roblox.com/tnavarts/{size}/797168_2.png"},{"id":164536,"username":"LucasTutoriaisSaimo","avatar_template":"/user_avatar/devforum.roblox.com/lucastutoriaissaimo/{size}/1572474_2.png"},{"id":300,"username":"Tomarty","avatar_template":"/user_avatar/devforum.roblox.com/tomarty/{size}/1557837_2.png"},{"id":27022,"username":"nooneisback","avatar_template":"/user_avatar/devforum.roblox.com/nooneisback/{size}/1488960_2.png"},{"id":11348,"username":"Hexcede","avatar_template":"/user_avatar/devforum.roblox.com/hexcede/{size}/1152765_2.png"},{"id":350909,"username":"crypto_mancer","avatar_template":"/user_avatar/devforum.roblox.com/crypto_mancer/{size}/822643_2.png"},{"id":200305,"username":"Kyxino","avatar_template":"/user_avatar/devforum.roblox.com/kyxino/{size}/1526293_2.png"},{"id":176552,"username":"7z99","avatar_template":"/user_avatar/devforum.roblox.com/7z99/{size}/1375229_2.png"},{"id":17304,"username":"FilteredStudio","avatar_template":"/user_avatar/devforum.roblox.com/filteredstudio/{size}/1555102_2.png"},{"id":461567,"username":"Optiplex3020SFF","avatar_template":"/user_avatar/devforum.roblox.com/optiplex3020sff/{size}/1498767_2.png"},{"id":260389,"username":"WallsAreForClimbing","avatar_template":"/user_avatar/devforum.roblox.com/wallsareforclimbing/{size}/1041671_2.png"},{"id":163116,"username":"SillyMeTimbers","avatar_template":"/user_avatar/devforum.roblox.com/sillymetimbers/{size}/1395188_2.png"},{"id":396736,"username":"HugeCoolboy2007","avatar_template":"/user_avatar/devforum.roblox.com/hugecoolboy2007/{size}/1533064_2.png"},{"id":105134,"username":"Fire540Games","avatar_template":"/user_avatar/devforum.roblox.com/fire540games/{size}/1539762_2.png"},{"id":17941,"username":"RBLXImagineer","avatar_template":"/user_avatar/devforum.roblox.com/rblximagineer/{size}/1417349_2.png"},{"id":395244,"username":"IdontPlayz343","avatar_template":"/user_avatar/devforum.roblox.com/idontplayz343/{size}/1379043_2.png"},{"id":351579,"username":"SimonEnderB","avatar_template":"/user_avatar/devforum.roblox.com/simonenderb/{size}/1533230_2.png"},{"id":194130,"username":"cunpliy","avatar_template":"/user_avatar/devforum.roblox.com/cunpliy/{size}/1426008_2.png"},{"id":7289,"username":"ittrgrey","avatar_template":"/user_avatar/devforum.roblox.com/ittrgrey/{size}/1570588_2.png"},{"id":451394,"username":"parker02311","avatar_template":"/user_avatar/devforum.roblox.com/parker02311/{size}/1103926_2.png"},{"id":312723,"username":"ihavoc101","avatar_template":"/user_avatar/devforum.roblox.com/ihavoc101/{size}/1574065_2.png"},{"id":51619,"username":"G2_funny","avatar_template":"/user_avatar/devforum.roblox.com/g2_funny/{size}/1528742_2.png"},{"id":285060,"username":"RainingSwordFire","avatar_template":"/user_avatar/devforum.roblox.com/rainingswordfire/{size}/1311775_2.png"},{"id":417018,"username":"SoaringKeyy","avatar_template":"/user_avatar/devforum.roblox.com/soaringkeyy/{size}/1551178_2.png"},{"id":32451,"username":"Clueless_Brick","avatar_template":"/user_avatar/devforum.roblox.com/clueless_brick/{size}/1556141_2.png"},{"id":45822,"username":"Vulkarin","avatar_template":"/user_avatar/devforum.roblox.com/vulkarin/{size}/1533760_2.png"},{"id":100697,"username":"ItzDaSniper_ALT","avatar_template":"/user_avatar/devforum.roblox.com/itzdasniper_alt/{size}/1111052_2.png"},{"id":192817,"username":"GeneralRelish","avatar_template":"/user_avatar/devforum.roblox.com/generalrelish/{size}/882303_2.png"},{"id":3657,"username":"Maxx_J","avatar_template":"/user_avatar/devforum.roblox.com/maxx_j/{size}/1257582_2.png"},{"id":778,"username":"gillern","avatar_template":"/user_avatar/devforum.roblox.com/gillern/{size}/1063851_2.png"},{"id":5316,"username":"unmiss","avatar_template":"/user_avatar/devforum.roblox.com/unmiss/{size}/1275904_2.png"},{"id":230186,"username":"overflowed","avatar_template":"/user_avatar/devforum.roblox.com/overflowed/{size}/1518666_2.png"},{"id":119859,"username":"kleptonaut","avatar_template":"/user_avatar/devforum.roblox.com/kleptonaut/{size}/1534225_2.png"},{"id":222257,"username":"ko_ch4","avatar_template":"/user_avatar/devforum.roblox.com/ko_ch4/{size}/1277003_2.png"},{"id":96898,"username":"Phoninian","avatar_template":"/user_avatar/devforum.roblox.com/phoninian/{size}/1505728_2.png"},{"id":130,"username":"zeuxcg","avatar_template":"/user_avatar/devforum.roblox.com/zeuxcg/{size}/759527_2.png"},{"id":346894,"username":"XOLT1268","avatar_template":"/user_avatar/devforum.roblox.com/xolt1268/{size}/1081693_2.png"},{"id":223,"username":"Dekkonot","avatar_template":"/user_avatar/devforum.roblox.com/dekkonot/{size}/1268788_2.png"},{"id":431,"username":"DataBrain","avatar_template":"/user_avatar/devforum.roblox.com/databrain/{size}/1346532_2.png"},{"id":87089,"username":"ForgotenR4","avatar_template":"/user_avatar/devforum.roblox.com/forgotenr4/{size}/993976_2.png"},{"id":134567,"username":"RoxyBloxyy","avatar_template":"/user_avatar/devforum.roblox.com/roxybloxyy/{size}/1063572_2.png"},{"id":214043,"username":"DavidNet22","avatar_template":"/user_avatar/devforum.roblox.com/davidnet22/{size}/1561725_2.png"},{"id":393053,"username":"jumbopushpop112","avatar_template":"/user_avatar/devforum.roblox.com/jumbopushpop112/{size}/1448545_2.png"},{"id":9518,"username":"jacklollz2","avatar_template":"/user_avatar/devforum.roblox.com/jacklollz2/{size}/1453855_2.png"},{"id":34253,"username":"incapaz","avatar_template":"/user_avatar/devforum.roblox.com/incapaz/{size}/1097885_2.png"},{"id":32226,"username":"Optikk","avatar_template":"/user_avatar/devforum.roblox.com/optikk/{size}/1515061_2.png"},{"id":317122,"username":"DoctorNO2106","avatar_template":"/user_avatar/devforum.roblox.com/doctorno2106/{size}/1439049_2.png"},{"id":33762,"username":"RuizuKun_Dev","avatar_template":"/user_avatar/devforum.roblox.com/ruizukun_dev/{size}/1587315_2.png"},{"id":237547,"username":"darkmodeonn","avatar_template":"/user_avatar/devforum.roblox.com/darkmodeonn/{size}/975957_2.png"},{"id":1045,"username":"WingItMan","avatar_template":"/user_avatar/devforum.roblox.com/wingitman/{size}/1288630_2.png"},{"id":27530,"username":"swmaniac","avatar_template":"/user_avatar/devforum.roblox.com/swmaniac/{size}/1054812_2.png"},{"id":47029,"username":"PH_OENlX","avatar_template":"/user_avatar/devforum.roblox.com/ph_oenlx/{size}/1462687_2.png"},{"id":231587,"username":"KrYn0MoRe","avatar_template":"/user_avatar/devforum.roblox.com/kryn0more/{size}/1347965_2.png"},{"id":347486,"username":"CanadianCrepe","avatar_template":"/user_avatar/devforum.roblox.com/canadiancrepe/{size}/1544739_2.png"},{"id":416893,"username":"FirewolfYT_751Adult","avatar_template":"/user_avatar/devforum.roblox.com/firewolfyt_751adult/{size}/1002940_2.png"},{"id":33422,"username":"nsgriff","avatar_template":"/user_avatar/devforum.roblox.com/nsgriff/{size}/648586_2.png"},{"id":-1,"username":"system","avatar_template":"/user_avatar/devforum.roblox.com/system/{size}/278369_2.png"},{"id":112950,"username":"coefficients","avatar_template":"/user_avatar/devforum.roblox.com/coefficients/{size}/1344844_2.png"},{"id":419793,"username":"ORLANDOMAGIC00","avatar_template":"/user_avatar/devforum.roblox.com/orlandomagic00/{size}/1583711_2.png"},{"id":57718,"username":"rogchamp","avatar_template":"/user_avatar/devforum.roblox.com/rogchamp/{size}/1359144_2.png"},{"id":3052,"username":"ziplocBag","avatar_template":"/user_avatar/devforum.roblox.com/ziplocbag/{size}/909305_2.png"},{"id":26244,"username":"mxdanger","avatar_template":"/user_avatar/devforum.roblox.com/mxdanger/{size}/1457829_2.png"},{"id":2791,"username":"Dogutsune","avatar_template":"/user_avatar/devforum.roblox.com/dogutsune/{size}/1053710_2.png"},{"id":431740,"username":"TheSenorDuck","avatar_template":"/user_avatar/devforum.roblox.com/thesenorduck/{size}/933266_2.png"},{"id":155602,"username":"RobieTheCat","avatar_template":"/user_avatar/devforum.roblox.com/robiethecat/{size}/1572265_2.png"},{"id":6350,"username":"The_Aliens","avatar_template":"/user_avatar/devforum.roblox.com/the_aliens/{size}/1369228_2.png"},{"id":8849,"username":"lateregistration","avatar_template":"/user_avatar/devforum.roblox.com/lateregistration/{size}/964581_2.png"},{"id":241899,"username":"CringeEngineer","avatar_template":"/user_avatar/devforum.roblox.com/cringeengineer/{size}/1141949_2.png"},{"id":789,"username":"mothmage","avatar_template":"/user_avatar/devforum.roblox.com/mothmage/{size}/1387000_2.png"},{"id":273497,"username":"Voxelinator","avatar_template":"/user_avatar/devforum.roblox.com/voxelinator/{size}/1083723_2.png"},{"id":120247,"username":"MeaxisDev","avatar_template":"/user_avatar/devforum.roblox.com/meaxisdev/{size}/1454273_2.png"},{"id":38549,"username":"NickoSCP","avatar_template":"/user_avatar/devforum.roblox.com/nickoscp/{size}/1128258_2.png"},{"id":139902,"username":"LuukOriginal","avatar_template":"/user_avatar/devforum.roblox.com/luukoriginal/{size}/1314121_2.png"},{"id":38606,"username":"Homeomorph","avatar_template":"/user_avatar/devforum.roblox.com/homeomorph/{size}/1521085_2.png"},{"id":31496,"username":"Sentross","avatar_template":"/user_avatar/devforum.roblox.com/sentross/{size}/1485711_2.png"},{"id":326221,"username":"so1ehee","avatar_template":"/user_avatar/devforum.roblox.com/so1ehee/{size}/1494050_2.png"},{"id":304229,"username":"RawEggTheGreatIX","avatar_template":"/user_avatar/devforum.roblox.com/raweggthegreatix/{size}/1534316_2.png"},{"id":357,"username":"Plutonem","avatar_template":"/user_avatar/devforum.roblox.com/plutonem/{size}/1214626_2.png"},{"id":281177,"username":"meshadapt","avatar_template":"/user_avatar/devforum.roblox.com/meshadapt/{size}/1024879_2.png"},{"id":1227,"username":"Rocky28447","avatar_template":"/user_avatar/devforum.roblox.com/rocky28447/{size}/1025963_2.png"},{"id":439104,"username":"meblec","avatar_template":"/user_avatar/devforum.roblox.com/meblec/{size}/1582125_2.png"},{"id":224996,"username":"TheCrypticRunner","avatar_template":"/user_avatar/devforum.roblox.com/thecrypticrunner/{size}/1457066_2.png"},{"id":92183,"username":"Vasilakious","avatar_template":"/user_avatar/devforum.roblox.com/vasilakious/{size}/1117302_2.png"},{"id":9593,"username":"BanTech","avatar_template":"/user_avatar/devforum.roblox.com/bantech/{size}/1534999_2.png"},{"id":7351,"username":"Sublivion","avatar_template":"/user_avatar/devforum.roblox.com/sublivion/{size}/629555_2.png"},{"id":643,"username":"buildthomas","avatar_template":"/user_avatar/devforum.roblox.com/buildthomas/{size}/1146835_2.png"},{"id":153142,"username":"Blokhampster34","avatar_template":"/user_avatar/devforum.roblox.com/blokhampster34/{size}/1170235_2.png"},{"id":86089,"username":"Vmena","avatar_template":"/user_avatar/devforum.roblox.com/vmena/{size}/1155786_2.png"},{"id":220864,"username":"rogeriodec_games","avatar_template":"/user_avatar/devforum.roblox.com/rogeriodec_games/{size}/957129_2.png"},{"id":186756,"username":"Dummy_Tested","avatar_template":"/user_avatar/devforum.roblox.com/dummy_tested/{size}/399575_2.png"},{"id":23710,"username":"DarthChadius","avatar_template":"/user_avatar/devforum.roblox.com/darthchadius/{size}/734631_2.png"},{"id":77150,"username":"CAP7A1N","avatar_template":"/user_avatar/devforum.roblox.com/cap7a1n/{size}/1428937_2.png"},{"id":306008,"username":"Stelth155_Dev","avatar_template":"/user_avatar/devforum.roblox.com/stelth155_dev/{size}/1127802_2.png"},{"id":103015,"username":"Cruizer_Snowman","avatar_template":"/user_avatar/devforum.roblox.com/cruizer_snowman/{size}/1441731_2.png"},{"id":210201,"username":"vrtblox","avatar_template":"/user_avatar/devforum.roblox.com/vrtblox/{size}/580542_2.png"},{"id":12817,"username":"anon66957764","avatar_template":"https://www.roblox.com/headshot-thumbnail/image?userId=463253&width=150&height=150"},{"id":380713,"username":"Vargogram","avatar_template":"/user_avatar/devforum.roblox.com/vargogram/{size}/1475193_2.png"},{"id":289807,"username":"Crazedbrick1","avatar_template":"/user_avatar/devforum.roblox.com/crazedbrick1/{size}/1571206_2.png"},{"id":10734,"username":"CycloneUprising","avatar_template":"/user_avatar/devforum.roblox.com/cycloneuprising/{size}/1327682_2.png"},{"id":363802,"username":"Kairomatic","avatar_template":"/user_avatar/devforum.roblox.com/kairomatic/{size}/1482469_2.png"},{"id":224243,"username":"Eternalove_fan32","avatar_template":"/user_avatar/devforum.roblox.com/eternalove_fan32/{size}/1426044_2.png"},{"id":84276,"username":"Phlegethon5778","avatar_template":"/user_avatar/devforum.roblox.com/phlegethon5778/{size}/1232567_2.png"},{"id":317063,"username":"umpireboy","avatar_template":"/user_avatar/devforum.roblox.com/umpireboy/{size}/1418322_2.png"},{"id":14154,"username":"Hadiisepic","avatar_template":"/user_avatar/devforum.roblox.com/hadiisepic/{size}/1472103_2.png"},{"id":202896,"username":"vrs2210","avatar_template":"/user_avatar/devforum.roblox.com/vrs2210/{size}/1570268_2.png"},{"id":201,"username":"Khanovich","avatar_template":"/user_avatar/devforum.roblox.com/khanovich/{size}/540780_2.png"},{"id":85229,"username":"Oficcer_F","avatar_template":"/user_avatar/devforum.roblox.com/oficcer_f/{size}/1545789_2.png"},{"id":186768,"username":"Cald_fan","avatar_template":"/user_avatar/devforum.roblox.com/cald_fan/{size}/1561054_2.png"},{"id":286481,"username":"TheGreat_Scott","avatar_template":"/user_avatar/devforum.roblox.com/thegreat_scott/{size}/1350329_2.png"}],"primary_groups":[{"id":41,"name":"Roblox_Staff","flair_url":"/uploads/default/original/4X/9/e/7/9e76ae2dd3aa25dc7a42e6443ec4cc57dd999ffe.png","flair_bg_color":"","flair_color":""},{"id":50,"name":"DevRelationsTeam","flair_url":"/uploads/default/original/4X/9/e/7/9e76ae2dd3aa25dc7a42e6443ec4cc57dd999ffe.png","flair_bg_color":"","flair_color":""}],"topic_list":{"can_create_topic":true,"more_topics_url":"/tags/c/updates/announcements/36/studio?match_all_tags=true&page=1&tags%5B%5D=studio","draft":null,"draft_key":"new_topic","draft_sequence":1681,"per_page":30,"top_tags":["studio","physics","scripting","maintenance","avatar","beta","accelerator","building","welds","gui","modeling","wiki","animation","humanoid","luau","terrain","api","events","intern","internship","motor6d","r15","smoothterrain","accessories","analytics","animation-editor","animations","incubator","rdc","rendering"],"tags":[{"id":68,"name":"studio","topic_count":7872,"staff":false}],"topics":[{"id":1038853,"title":"New Physics Stepping Method: Adaptive Timestepping","fancy_title":"New Physics Stepping Method: Adaptive Timestepping","slug":"new-physics-stepping-method-adaptive-timestepping","posts_count":65,"reply_count":33,"highest_post_number":68,"image_url":null,"created_at":"2021-02-10T22:51:55.427Z","last_posted_at":"2021-02-16T20:18:25.918Z","bumped":true,"bumped_at":"2021-02-18T03:52:19.710Z","archetype":"regular","unseen":false,"last_read_post_number":12,"unread":34,"new_posts":22,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"tags":["studio","beta"],"views":15049,"like_count":663,"has_summary":true,"last_poster_username":"iSyriux","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":306443,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":36263,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":120450,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":472489,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":44883,"primary_group_id":null}]},{"id":1025033,"title":"Heightmaps Go to New Altitudes!","fancy_title":"Heightmaps Go to New Altitudes!","slug":"heightmaps-go-to-new-altitudes","posts_count":108,"reply_count":69,"highest_post_number":141,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/optimized/4X/0/c/c/0cca114c25efbe61d257c9580c3cd7413278b84d_2_1024x779.jpeg","created_at":"2021-02-04T18:31:29.269Z","last_posted_at":"2021-02-17T09:20:13.946Z","bumped":true,"bumped_at":"2021-02-17T09:20:13.946Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":["studio","beta"],"views":16743,"like_count":1093,"has_summary":true,"last_poster_username":"Miles_1king","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":351893,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":376200,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":598293,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":249742,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":557246,"primary_group_id":null}]},{"id":1007452,"title":"Upcoming Potential Property Name Conflict: \"Pivot\"","fancy_title":"Upcoming Potential Property Name Conflict: “Pivot”","slug":"upcoming-potential-property-name-conflict-pivot","posts_count":74,"reply_count":51,"highest_post_number":76,"image_url":null,"created_at":"2021-01-26T17:37:55.868Z","last_posted_at":"2021-02-11T19:12:41.189Z","bumped":true,"bumped_at":"2021-02-11T19:12:41.189Z","archetype":"regular","unseen":false,"last_read_post_number":5,"unread":6,"new_posts":65,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"tags":["studio"],"views":16748,"like_count":490,"has_summary":true,"last_poster_username":"tnavarts","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":"latest","description":"Автор, Последний автор","user_id":341046,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":164536,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":300,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":27022,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":11348,"primary_group_id":null}]},{"id":993767,"title":"Changing the Mac Studio Command Keycode: Control vs Meta","fancy_title":"Changing the Mac Studio Command Keycode: Control vs Meta","slug":"changing-the-mac-studio-command-keycode-control-vs-meta","posts_count":16,"reply_count":5,"highest_post_number":17,"image_url":null,"created_at":"2021-01-19T22:05:17.218Z","last_posted_at":"2021-01-22T01:22:09.206Z","bumped":true,"bumped_at":"2021-01-22T01:22:09.206Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":["studio"],"views":14308,"like_count":166,"has_summary":false,"last_poster_username":"Optiplex3020SFF","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":350909,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":200305,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":176552,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":17304,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":461567,"primary_group_id":null}]},{"id":984141,"title":"New Studio Beta: Attributes!","fancy_title":"New Studio Beta: Attributes!","slug":"new-studio-beta-attributes","posts_count":353,"reply_count":140,"highest_post_number":372,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/f/0/4/f04ea572324df16f6eb86f657ab0765c3b7c4779.png","created_at":"2021-01-14T23:57:24.805Z","last_posted_at":"2021-02-17T21:39:05.229Z","bumped":true,"bumped_at":"2021-02-17T21:39:05.229Z","archetype":"regular","unseen":false,"last_read_post_number":30,"unread":314,"new_posts":28,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"tags":["studio","beta"],"views":36468,"like_count":1942,"has_summary":true,"last_poster_username":"Fire540Games","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":260389,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":11348,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":163116,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":396736,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":105134,"primary_group_id":null}]},{"id":932576,"title":"New Terrain, and Parts, and Built-In Materials, Oh my!","fancy_title":"New Terrain, and Parts, and Built-In Materials, Oh my!","slug":"new-terrain-and-parts-and-built-in-materials-oh-my","posts_count":1155,"reply_count":358,"highest_post_number":1341,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/optimized/4X/5/2/2/52240686713d0ec0b1b9ab802268030a8cb15627_2_1024x420.jpeg","created_at":"2020-12-19T00:22:20.801Z","last_posted_at":"2021-02-17T22:45:44.156Z","bumped":true,"bumped_at":"2021-02-17T22:45:44.156Z","archetype":"regular","unseen":false,"last_read_post_number":20,"unread":849,"new_posts":472,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"tags":["studio","beta"],"views":100027,"like_count":7467,"has_summary":true,"last_poster_username":"ittrgrey","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":17941,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":395244,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":351579,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":194130,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":7289,"primary_group_id":null}]},{"id":919991,"title":"Proximity Prompt Release","fancy_title":"Proximity Prompt Release","slug":"proximity-prompt-release","posts_count":161,"reply_count":96,"highest_post_number":228,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/5/a/8/5a8617595bc32d070053437b78e722f12f01e78a.gif","created_at":"2020-12-12T02:06:19.525Z","last_posted_at":"2021-02-16T02:45:15.238Z","bumped":true,"bumped_at":"2021-02-16T02:45:15.238Z","archetype":"regular","unseen":false,"last_read_post_number":205,"unread":22,"new_posts":1,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"tags":["studio"],"views":33224,"like_count":941,"has_summary":true,"last_poster_username":"Miles_1king","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":350909,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":451394,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":312723,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":51619,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":557246,"primary_group_id":null}]},{"id":904022,"title":"Asset Manager Phased Rollout","fancy_title":"Asset Manager Phased Rollout","slug":"asset-manager-phased-rollout","posts_count":75,"reply_count":42,"highest_post_number":82,"image_url":null,"created_at":"2020-12-03T19:15:44.962Z","last_posted_at":"2021-02-13T04:08:21.822Z","bumped":true,"bumped_at":"2021-02-13T04:08:21.822Z","archetype":"regular","unseen":false,"last_read_post_number":17,"unread":0,"new_posts":65,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"tags":["studio","beta"],"views":20262,"like_count":339,"has_summary":true,"last_poster_username":"ItzDaSniper_ALT","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":285060,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":417018,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":32451,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":45822,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":100697,"primary_group_id":null}]},{"id":898436,"title":"Expressive Output Window - Phased Rollout","fancy_title":"Expressive Output Window - Phased Rollout","slug":"expressive-output-window-phased-rollout","posts_count":35,"reply_count":9,"highest_post_number":38,"image_url":null,"created_at":"2020-11-30T21:14:57.519Z","last_posted_at":"2021-02-09T02:19:01.395Z","bumped":true,"bumped_at":"2021-02-09T02:19:01.395Z","archetype":"regular","unseen":false,"last_read_post_number":1,"unread":0,"new_posts":37,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"tags":["studio","beta","output-window","output"],"views":11811,"like_count":255,"has_summary":false,"last_poster_username":"overflowed","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":192817,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":3657,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":778,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":5316,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":230186,"primary_group_id":null}]},{"id":897999,"title":"[Activated!] New Part Physics API","fancy_title":"[Activated!] New Part Physics API","slug":"activated-new-part-physics-api","posts_count":80,"reply_count":43,"highest_post_number":83,"image_url":null,"created_at":"2020-11-30T18:30:16.161Z","last_posted_at":"2021-02-08T20:31:36.781Z","bumped":true,"bumped_at":"2021-02-08T20:31:36.781Z","archetype":"regular","unseen":false,"last_read_post_number":33,"unread":0,"new_posts":50,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"tags":["studio","physics"],"views":15373,"like_count":456,"has_summary":true,"last_poster_username":"Phoninian","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":true,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":119859,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":341046,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":222257,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":36263,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":96898,"primary_group_id":null}]},{"id":878947,"title":"Luau Type Checking Release","fancy_title":"Luau Type Checking Release","slug":"luau-type-checking-release","posts_count":130,"reply_count":51,"highest_post_number":135,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/1/0/b/10b42bc7cc1bef0f79f6a79415c8a87435edf0c1.png","created_at":"2020-11-19T18:21:13.701Z","last_posted_at":"2021-02-09T20:39:33.667Z","bumped":true,"bumped_at":"2021-02-09T20:39:33.667Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":["scripting","studio","luau"],"views":15216,"like_count":507,"has_summary":true,"last_poster_username":"zeuxcg","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":"latest","description":"Автор, Последний автор","user_id":130,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":346894,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":223,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":431,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":87089,"primary_group_id":null}]},{"id":877873,"title":"Introducing Bulk Audio Importing in Studio!","fancy_title":"Introducing Bulk Audio Importing in Studio!","slug":"introducing-bulk-audio-importing-in-studio","posts_count":55,"reply_count":19,"highest_post_number":60,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/e/f/b/efbc663dd66369ccc18459d2ec642cc45cff3414.png","created_at":"2020-11-19T00:00:47.997Z","last_posted_at":"2021-02-07T00:36:38.741Z","bumped":true,"bumped_at":"2021-02-07T00:36:38.741Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":["studio"],"views":13730,"like_count":562,"has_summary":true,"last_poster_username":"jacklollz2","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":134567,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":214043,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":451394,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":393053,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":9518,"primary_group_id":null}]},{"id":877312,"title":"Introducing Plugin Script Modification Permissions","fancy_title":"Introducing Plugin Script Modification Permissions","slug":"introducing-plugin-script-modification-permissions","posts_count":76,"reply_count":28,"highest_post_number":86,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/optimized/4X/5/a/6/5a645ea86f19c66297c1b763bf4e77541d5ed8ca_2_1024x401.png","created_at":"2020-11-18T18:26:04.109Z","last_posted_at":"2021-01-15T23:17:58.252Z","bumped":true,"bumped_at":"2021-01-15T23:17:58.252Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":["studio"],"views":11452,"like_count":422,"has_summary":true,"last_poster_username":"RuizuKun_Dev","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":134567,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":34253,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":32226,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":317122,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":33762,"primary_group_id":null}]},{"id":874260,"title":"Script Editor - Semantic Highlighting and Temporary Tabs are now in Beta!","fancy_title":"Script Editor - Semantic Highlighting and Temporary Tabs are now in Beta!","slug":"script-editor-semantic-highlighting-and-temporary-tabs-are-now-in-beta","posts_count":201,"reply_count":99,"highest_post_number":205,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/optimized/4X/5/d/c/5dce483b91353355e69c03ffd023388cfbbbeca2_2_1024x526.jpeg","created_at":"2020-11-16T21:18:47.223Z","last_posted_at":"2021-02-07T08:17:42.638Z","bumped":true,"bumped_at":"2021-02-07T08:17:42.638Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":["studio","beta"],"views":13036,"like_count":1056,"has_summary":true,"last_poster_username":"KrYn0MoRe","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":237547,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":1045,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":27530,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":47029,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":231587,"primary_group_id":null}]},{"id":744534,"title":"Studio is Ending Support for Mac OS X 10.10 (Yosemite)","fancy_title":"Studio is Ending Support for Mac OS X 10.10 (Yosemite)","slug":"studio-is-ending-support-for-mac-os-x-10-10-yosemite","posts_count":66,"reply_count":31,"highest_post_number":76,"image_url":null,"created_at":"2020-08-31T17:34:00.000Z","last_posted_at":"2021-01-26T22:14:45.165Z","bumped":true,"bumped_at":"2020-09-28T22:14:43.451Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"bookmarked":null,"liked":null,"tags":["studio"],"views":50641,"like_count":451,"has_summary":true,"last_poster_username":"system","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":285060,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":347486,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":416893,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":33422,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":-1,"primary_group_id":null}]},{"id":746146,"title":"Display All Permissions for Group Games","fancy_title":"Display All Permissions for Group Games","slug":"display-all-permissions-for-group-games","posts_count":12,"reply_count":8,"highest_post_number":20,"image_url":null,"created_at":"2020-08-28T17:31:49.301Z","last_posted_at":"2021-01-22T17:15:00.609Z","bumped":true,"bumped_at":"2020-09-24T17:15:00.254Z","archetype":"regular","unseen":false,"last_read_post_number":20,"unread":0,"new_posts":0,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"tags":["studio"],"views":43683,"like_count":251,"has_summary":false,"last_poster_username":"coefficients","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":"latest","description":"Автор, Последний автор","user_id":112950,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":419793,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":57718,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":3052,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":26244,"primary_group_id":null}]},{"id":722215,"title":"Finale of Part Surface Changes: No More Hinges","fancy_title":"Finale of Part Surface Changes: No More Hinges","slug":"finale-of-part-surface-changes-no-more-hinges","posts_count":133,"reply_count":67,"highest_post_number":143,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/d/9/b/d9bdfde1668446e0037867a9dcbd49dcc685b7eb.gif","created_at":"2020-08-13T18:09:27.690Z","last_posted_at":"2020-12-08T19:04:09.193Z","bumped":true,"bumped_at":"2020-12-08T19:04:09.193Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":["building","studio","physics"],"views":25124,"like_count":885,"has_summary":true,"last_poster_username":"TheSenorDuck","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":119859,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":2791,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":11348,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":341046,"primary_group_id":41},{"extras":"latest","description":"Последний автор","user_id":431740,"primary_group_id":null}]},{"id":705528,"title":"Skinned MeshPart Studio Beta","fancy_title":"Skinned MeshPart Studio Beta","slug":"skinned-meshpart-studio-beta","posts_count":345,"reply_count":207,"highest_post_number":358,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/a/8/7/a8786999b226cbb244060442b7e3fc04154267ae.png","created_at":"2020-08-03T22:59:46.002Z","last_posted_at":"2020-12-02T00:04:48.733Z","bumped":true,"bumped_at":"2020-12-01T21:30:40.306Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"bookmarked":null,"liked":null,"tags":["studio","modeling","rendering"],"views":49892,"like_count":2218,"has_summary":true,"last_poster_username":"mothmage","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":155602,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":6350,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":8849,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":241899,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":789,"primary_group_id":null}]},{"id":674209,"title":"Introducing Two Game Security Settings: Third Party Sales & Cross Game Teleports","fancy_title":"Introducing Two Game Security Settings: Third Party Sales & Cross Game Teleports","slug":"introducing-two-game-security-settings-third-party-sales-cross-game-teleports","posts_count":100,"reply_count":28,"highest_post_number":120,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/0/c/7/0c776e4648a634d0c17287869c13fbdb790f7f36.png","created_at":"2020-07-16T00:43:28.114Z","last_posted_at":"2020-11-11T21:06:01.454Z","bumped":true,"bumped_at":"2021-01-22T16:14:45.381Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":["studio"],"views":33642,"like_count":735,"has_summary":true,"last_poster_username":"LuukOriginal","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":134567,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":273497,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":120247,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":38549,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":139902,"primary_group_id":null}]},{"id":663449,"title":"SurfaceAppearance Studio Beta","fancy_title":"SurfaceAppearance Studio Beta","slug":"surfaceappearance-studio-beta","posts_count":415,"reply_count":186,"highest_post_number":437,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/5/f/c/5fca97d93e86876dbb3ee5bd2adfa3b5f699bcfd.png","created_at":"2020-07-09T18:58:00.000Z","last_posted_at":"2021-02-15T21:51:59.958Z","bumped":true,"bumped_at":"2021-02-15T21:51:59.958Z","archetype":"regular","unseen":false,"last_read_post_number":43,"unread":55,"new_posts":339,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"tags":["studio"],"views":68064,"like_count":4562,"has_summary":true,"last_poster_username":"Plutonem","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":38606,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":31496,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":326221,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":304229,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":357,"primary_group_id":null}]},{"id":662464,"title":"New Beta Feature: LevelOfDetail Property for Models (Enabled Globally)","fancy_title":"New Beta Feature: LevelOfDetail Property for Models (Enabled Globally)","slug":"new-beta-feature-levelofdetail-property-for-models-enabled-globally","posts_count":51,"reply_count":18,"highest_post_number":52,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/d/e/b/deb938a882c680f766fa49d5a3b8a16f2e56b39f.png","created_at":"2020-07-08T05:12:01.996Z","last_posted_at":"2021-01-06T09:49:20.839Z","bumped":true,"bumped_at":"2021-01-06T09:49:20.839Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":["studio","modeling","rendering","networking"],"views":11907,"like_count":502,"has_summary":true,"last_poster_username":"Vasilakious","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":281177,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":1227,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":439104,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":224996,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":92183,"primary_group_id":null}]},{"id":644467,"title":"New RaycastParams Property, Deprecating Old Raycast Functions","fancy_title":"New RaycastParams Property, Deprecating Old Raycast Functions","slug":"new-raycastparams-property-deprecating-old-raycast-functions","posts_count":91,"reply_count":53,"highest_post_number":95,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/d/3/2/d32b1ab64c2f0a4da24ffbe7450e8c6b251010f6.png","created_at":"2020-06-26T00:21:46.173Z","last_posted_at":"2021-01-01T22:29:39.110Z","bumped":true,"bumped_at":"2021-01-01T21:59:42.756Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"bookmarked":null,"liked":null,"tags":["studio","physics"],"views":13036,"like_count":396,"has_summary":true,"last_poster_username":"buildthomas","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":119859,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":431,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":9593,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":7351,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":643,"primary_group_id":null}]},{"id":642684,"title":"Expressive Output Window - Beta","fancy_title":"Expressive Output Window - Beta","slug":"expressive-output-window-beta","posts_count":153,"reply_count":44,"highest_post_number":170,"image_url":null,"created_at":"2020-06-25T19:30:00.000Z","last_posted_at":"2020-12-05T18:24:48.359Z","bumped":true,"bumped_at":"2020-12-05T18:32:03.488Z","archetype":"regular","unseen":false,"last_read_post_number":107,"unread":0,"new_posts":63,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"tags":["studio","output-window"],"views":23650,"like_count":1181,"has_summary":true,"last_poster_username":"Dummy_Tested","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":192817,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":153142,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":86089,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":220864,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":186756,"primary_group_id":null}]},{"id":643907,"title":"Universal Breakpoints Beta - One Breakpoint to Rule Them All","fancy_title":"Universal Breakpoints Beta - One Breakpoint to Rule Them All","slug":"universal-breakpoints-beta-one-breakpoint-to-rule-them-all","posts_count":18,"reply_count":3,"highest_post_number":21,"image_url":null,"created_at":"2020-06-25T18:28:25.069Z","last_posted_at":"2020-11-26T15:43:44.683Z","bumped":true,"bumped_at":"2020-07-29T15:43:43.770Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"bookmarked":null,"liked":null,"tags":["studio","debugger"],"views":11147,"like_count":140,"has_summary":false,"last_poster_username":"system","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":192817,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":112950,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":120247,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":23710,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":-1,"primary_group_id":null}]},{"id":642282,"title":"Additional Game Management in Roblox Studio","fancy_title":"Additional Game Management in Roblox Studio","slug":"additional-game-management-in-roblox-studio","posts_count":88,"reply_count":21,"highest_post_number":92,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/optimized/4X/e/2/4/e24da11e138f564733aabacad3558b95a720830c_2_1023x638.png","created_at":"2020-06-24T23:21:00.000Z","last_posted_at":"2020-12-22T12:36:54.093Z","bumped":true,"bumped_at":"2020-08-24T12:36:47.186Z","archetype":"regular","unseen":false,"last_read_post_number":82,"unread":2,"new_posts":8,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"tags":["studio"],"views":12540,"like_count":421,"has_summary":true,"last_poster_username":"system","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":true,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":33422,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":77150,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":306008,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":103015,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":-1,"primary_group_id":null}]},{"id":639903,"title":"Future Is Bright: Phase 3 - Studio Beta","fancy_title":"Future Is Bright: Phase 3 - Studio Beta","slug":"future-is-bright-phase-3-studio-beta","posts_count":1160,"reply_count":657,"highest_post_number":1233,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/e/6/4/e643cf506a8ac153c7720bab4af414a88eaf0a9a.png","created_at":"2020-06-23T09:13:23.197Z","last_posted_at":"2021-02-04T17:43:41.911Z","bumped":true,"bumped_at":"2021-02-04T17:43:41.911Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":["building","studio"],"views":97604,"like_count":12547,"has_summary":true,"last_poster_username":"DoctorNO2106","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":210201,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":12817,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":380713,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":289807,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":317122,"primary_group_id":null}]},{"id":623350,"title":"Plugin Debugging: New Beta Feature!","fancy_title":"Plugin Debugging: New Beta Feature!","slug":"plugin-debugging-new-beta-feature","posts_count":42,"reply_count":13,"highest_post_number":42,"image_url":null,"created_at":"2020-06-12T22:29:13.391Z","last_posted_at":"2020-12-18T17:38:25.942Z","bumped":true,"bumped_at":"2021-02-13T17:57:38.712Z","archetype":"regular","unseen":false,"last_read_post_number":6,"unread":36,"new_posts":0,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"tags":["studio"],"views":12535,"like_count":287,"has_summary":false,"last_poster_username":"Eternalove_fan32","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":10734,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":363802,"primary_group_id":50},{"extras":null,"description":"Частый автор","user_id":341046,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":223,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":224243,"primary_group_id":null}]},{"id":582921,"title":"Script Editor - New Foundation and First Features","fancy_title":"Script Editor - New Foundation and First Features","slug":"script-editor-new-foundation-and-first-features","posts_count":104,"reply_count":42,"highest_post_number":106,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/1/9/1/191215aedf29cd0902640dcd2faffcdcfe1faeda.jpeg","created_at":"2020-06-11T18:09:00.000Z","last_posted_at":"2020-11-18T13:40:56.854Z","bumped":true,"bumped_at":"2020-07-21T13:40:56.784Z","archetype":"regular","unseen":false,"last_read_post_number":6,"unread":94,"new_posts":6,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"tags":["studio","script-editor"],"views":23750,"like_count":602,"has_summary":true,"last_poster_username":"system","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":192817,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":778,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":12817,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":84276,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":-1,"primary_group_id":null}]},{"id":552810,"title":"Introducing SmoothingAngle property for PartOperation (Enabled Globally)","fancy_title":"Introducing SmoothingAngle property for PartOperation (Enabled Globally)","slug":"introducing-smoothingangle-property-for-partoperation-enabled-globally","posts_count":103,"reply_count":33,"highest_post_number":106,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/0/7/c/07c3ad00b386afbf9cc8924d69c86bceecfe003c.png","created_at":"2020-05-06T21:42:00.000Z","last_posted_at":"2020-09-09T11:12:18.309Z","bumped":true,"bumped_at":"2020-08-04T18:46:27.868Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"bookmarked":null,"liked":null,"tags":["studio","csg","csgv2"],"views":36298,"like_count":855,"has_summary":true,"last_poster_username":"system","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":281177,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":317063,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":14154,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":202896,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":-1,"primary_group_id":null}]},{"id":529077,"title":"New Studio Feature - CollisionFidelity.PreciseConvexDecomposition (Enabled Globally)","fancy_title":"New Studio Feature - CollisionFidelity.PreciseConvexDecomposition (Enabled Globally)","slug":"new-studio-feature-collisionfidelity-preciseconvexdecomposition-enabled-globally","posts_count":140,"reply_count":59,"highest_post_number":146,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/1/f/d/1fd823f35f415e8e12eee67d842f70f638f38c5a.png","created_at":"2020-04-17T14:59:53.209Z","last_posted_at":"2021-01-03T23:10:39.815Z","bumped":true,"bumped_at":"2021-01-03T23:14:21.658Z","archetype":"regular","unseen":false,"last_read_post_number":2,"unread":136,"new_posts":8,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"tags":["studio"],"views":50555,"like_count":862,"has_summary":true,"last_poster_username":"TheGreat_Scott","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":201,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":300,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":85229,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":186768,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":286481,"primary_group_id":null}]}]}}) + res.json({ + users: [ + { + id: 306443, + username: "Hajimalago", + avatar_template: + "/user_avatar/devforum.roblox.com/hajimalago/{size}/724795_2.png", + }, + { + id: 36263, + username: "rickje139", + avatar_template: + "/user_avatar/devforum.roblox.com/rickje139/{size}/1459648_2.png", + }, + { + id: 120450, + username: "GodSysAdmin", + avatar_template: + "/user_avatar/devforum.roblox.com/godsysadmin/{size}/1540208_2.png", + }, + { + id: 472489, + username: "ItsMeFelixAccept", + avatar_template: + "/user_avatar/devforum.roblox.com/itsmefelixaccept/{size}/1551006_2.png", + }, + { + id: 44883, + username: "iSyriux", + avatar_template: + "/user_avatar/devforum.roblox.com/isyriux/{size}/1464807_2.png", + }, + { + id: 351893, + username: "JoshSedai", + avatar_template: + "/user_avatar/devforum.roblox.com/joshsedai/{size}/842420_2.png", + }, + { + id: 376200, + username: "Logimite", + avatar_template: + "/user_avatar/devforum.roblox.com/logimite/{size}/1573532_2.png", + }, + { + id: 598293, + username: "jmkd3v", + avatar_template: + "/user_avatar/devforum.roblox.com/jmkd3v/{size}/1572236_2.png", + }, + { + id: 249742, + username: "zachary108181", + avatar_template: + "/user_avatar/devforum.roblox.com/zachary108181/{size}/1376998_2.png", + }, + { + id: 557246, + username: "Miles_1king", + avatar_template: + "/user_avatar/devforum.roblox.com/miles_1king/{size}/1558993_2.png", + }, + { + id: 341046, + username: "tnavarts", + avatar_template: + "/user_avatar/devforum.roblox.com/tnavarts/{size}/797168_2.png", + }, + { + id: 164536, + username: "LucasTutoriaisSaimo", + avatar_template: + "/user_avatar/devforum.roblox.com/lucastutoriaissaimo/{size}/1572474_2.png", + }, + { + id: 300, + username: "Tomarty", + avatar_template: + "/user_avatar/devforum.roblox.com/tomarty/{size}/1557837_2.png", + }, + { + id: 27022, + username: "nooneisback", + avatar_template: + "/user_avatar/devforum.roblox.com/nooneisback/{size}/1488960_2.png", + }, + { + id: 11348, + username: "Hexcede", + avatar_template: + "/user_avatar/devforum.roblox.com/hexcede/{size}/1152765_2.png", + }, + { + id: 350909, + username: "crypto_mancer", + avatar_template: + "/user_avatar/devforum.roblox.com/crypto_mancer/{size}/822643_2.png", + }, + { + id: 200305, + username: "Kyxino", + avatar_template: + "/user_avatar/devforum.roblox.com/kyxino/{size}/1526293_2.png", + }, + { + id: 176552, + username: "7z99", + avatar_template: + "/user_avatar/devforum.roblox.com/7z99/{size}/1375229_2.png", + }, + { + id: 17304, + username: "FilteredStudio", + avatar_template: + "/user_avatar/devforum.roblox.com/filteredstudio/{size}/1555102_2.png", + }, + { + id: 461567, + username: "Optiplex3020SFF", + avatar_template: + "/user_avatar/devforum.roblox.com/optiplex3020sff/{size}/1498767_2.png", + }, + { + id: 260389, + username: "WallsAreForClimbing", + avatar_template: + "/user_avatar/devforum.roblox.com/wallsareforclimbing/{size}/1041671_2.png", + }, + { + id: 163116, + username: "SillyMeTimbers", + avatar_template: + "/user_avatar/devforum.roblox.com/sillymetimbers/{size}/1395188_2.png", + }, + { + id: 396736, + username: "HugeCoolboy2007", + avatar_template: + "/user_avatar/devforum.roblox.com/hugecoolboy2007/{size}/1533064_2.png", + }, + { + id: 105134, + username: "Fire540Games", + avatar_template: + "/user_avatar/devforum.roblox.com/fire540games/{size}/1539762_2.png", + }, + { + id: 17941, + username: "RBLXImagineer", + avatar_template: + "/user_avatar/devforum.roblox.com/rblximagineer/{size}/1417349_2.png", + }, + { + id: 395244, + username: "IdontPlayz343", + avatar_template: + "/user_avatar/devforum.roblox.com/idontplayz343/{size}/1379043_2.png", + }, + { + id: 351579, + username: "SimonEnderB", + avatar_template: + "/user_avatar/devforum.roblox.com/simonenderb/{size}/1533230_2.png", + }, + { + id: 194130, + username: "cunpliy", + avatar_template: + "/user_avatar/devforum.roblox.com/cunpliy/{size}/1426008_2.png", + }, + { + id: 7289, + username: "ittrgrey", + avatar_template: + "/user_avatar/devforum.roblox.com/ittrgrey/{size}/1570588_2.png", + }, + { + id: 451394, + username: "parker02311", + avatar_template: + "/user_avatar/devforum.roblox.com/parker02311/{size}/1103926_2.png", + }, + { + id: 312723, + username: "ihavoc101", + avatar_template: + "/user_avatar/devforum.roblox.com/ihavoc101/{size}/1574065_2.png", + }, + { + id: 51619, + username: "G2_funny", + avatar_template: + "/user_avatar/devforum.roblox.com/g2_funny/{size}/1528742_2.png", + }, + { + id: 285060, + username: "RainingSwordFire", + avatar_template: + "/user_avatar/devforum.roblox.com/rainingswordfire/{size}/1311775_2.png", + }, + { + id: 417018, + username: "SoaringKeyy", + avatar_template: + "/user_avatar/devforum.roblox.com/soaringkeyy/{size}/1551178_2.png", + }, + { + id: 32451, + username: "Clueless_Brick", + avatar_template: + "/user_avatar/devforum.roblox.com/clueless_brick/{size}/1556141_2.png", + }, + { + id: 45822, + username: "Vulkarin", + avatar_template: + "/user_avatar/devforum.roblox.com/vulkarin/{size}/1533760_2.png", + }, + { + id: 100697, + username: "ItzDaSniper_ALT", + avatar_template: + "/user_avatar/devforum.roblox.com/itzdasniper_alt/{size}/1111052_2.png", + }, + { + id: 192817, + username: "GeneralRelish", + avatar_template: + "/user_avatar/devforum.roblox.com/generalrelish/{size}/882303_2.png", + }, + { + id: 3657, + username: "Maxx_J", + avatar_template: + "/user_avatar/devforum.roblox.com/maxx_j/{size}/1257582_2.png", + }, + { + id: 778, + username: "gillern", + avatar_template: + "/user_avatar/devforum.roblox.com/gillern/{size}/1063851_2.png", + }, + { + id: 5316, + username: "unmiss", + avatar_template: + "/user_avatar/devforum.roblox.com/unmiss/{size}/1275904_2.png", + }, + { + id: 230186, + username: "overflowed", + avatar_template: + "/user_avatar/devforum.roblox.com/overflowed/{size}/1518666_2.png", + }, + { + id: 119859, + username: "kleptonaut", + avatar_template: + "/user_avatar/devforum.roblox.com/kleptonaut/{size}/1534225_2.png", + }, + { + id: 222257, + username: "ko_ch4", + avatar_template: + "/user_avatar/devforum.roblox.com/ko_ch4/{size}/1277003_2.png", + }, + { + id: 96898, + username: "Phoninian", + avatar_template: + "/user_avatar/devforum.roblox.com/phoninian/{size}/1505728_2.png", + }, + { + id: 130, + username: "zeuxcg", + avatar_template: + "/user_avatar/devforum.roblox.com/zeuxcg/{size}/759527_2.png", + }, + { + id: 346894, + username: "XOLT1268", + avatar_template: + "/user_avatar/devforum.roblox.com/xolt1268/{size}/1081693_2.png", + }, + { + id: 223, + username: "Dekkonot", + avatar_template: + "/user_avatar/devforum.roblox.com/dekkonot/{size}/1268788_2.png", + }, + { + id: 431, + username: "DataBrain", + avatar_template: + "/user_avatar/devforum.roblox.com/databrain/{size}/1346532_2.png", + }, + { + id: 87089, + username: "ForgotenR4", + avatar_template: + "/user_avatar/devforum.roblox.com/forgotenr4/{size}/993976_2.png", + }, + { + id: 134567, + username: "RoxyBloxyy", + avatar_template: + "/user_avatar/devforum.roblox.com/roxybloxyy/{size}/1063572_2.png", + }, + { + id: 214043, + username: "DavidNet22", + avatar_template: + "/user_avatar/devforum.roblox.com/davidnet22/{size}/1561725_2.png", + }, + { + id: 393053, + username: "jumbopushpop112", + avatar_template: + "/user_avatar/devforum.roblox.com/jumbopushpop112/{size}/1448545_2.png", + }, + { + id: 9518, + username: "jacklollz2", + avatar_template: + "/user_avatar/devforum.roblox.com/jacklollz2/{size}/1453855_2.png", + }, + { + id: 34253, + username: "incapaz", + avatar_template: + "/user_avatar/devforum.roblox.com/incapaz/{size}/1097885_2.png", + }, + { + id: 32226, + username: "Optikk", + avatar_template: + "/user_avatar/devforum.roblox.com/optikk/{size}/1515061_2.png", + }, + { + id: 317122, + username: "DoctorNO2106", + avatar_template: + "/user_avatar/devforum.roblox.com/doctorno2106/{size}/1439049_2.png", + }, + { + id: 33762, + username: "RuizuKun_Dev", + avatar_template: + "/user_avatar/devforum.roblox.com/ruizukun_dev/{size}/1587315_2.png", + }, + { + id: 237547, + username: "darkmodeonn", + avatar_template: + "/user_avatar/devforum.roblox.com/darkmodeonn/{size}/975957_2.png", + }, + { + id: 1045, + username: "WingItMan", + avatar_template: + "/user_avatar/devforum.roblox.com/wingitman/{size}/1288630_2.png", + }, + { + id: 27530, + username: "swmaniac", + avatar_template: + "/user_avatar/devforum.roblox.com/swmaniac/{size}/1054812_2.png", + }, + { + id: 47029, + username: "PH_OENlX", + avatar_template: + "/user_avatar/devforum.roblox.com/ph_oenlx/{size}/1462687_2.png", + }, + { + id: 231587, + username: "KrYn0MoRe", + avatar_template: + "/user_avatar/devforum.roblox.com/kryn0more/{size}/1347965_2.png", + }, + { + id: 347486, + username: "CanadianCrepe", + avatar_template: + "/user_avatar/devforum.roblox.com/canadiancrepe/{size}/1544739_2.png", + }, + { + id: 416893, + username: "FirewolfYT_751Adult", + avatar_template: + "/user_avatar/devforum.roblox.com/firewolfyt_751adult/{size}/1002940_2.png", + }, + { + id: 33422, + username: "nsgriff", + avatar_template: + "/user_avatar/devforum.roblox.com/nsgriff/{size}/648586_2.png", + }, + { + id: -1, + username: "system", + avatar_template: + "/user_avatar/devforum.roblox.com/system/{size}/278369_2.png", + }, + { + id: 112950, + username: "coefficients", + avatar_template: + "/user_avatar/devforum.roblox.com/coefficients/{size}/1344844_2.png", + }, + { + id: 419793, + username: "ORLANDOMAGIC00", + avatar_template: + "/user_avatar/devforum.roblox.com/orlandomagic00/{size}/1583711_2.png", + }, + { + id: 57718, + username: "rogchamp", + avatar_template: + "/user_avatar/devforum.roblox.com/rogchamp/{size}/1359144_2.png", + }, + { + id: 3052, + username: "ziplocBag", + avatar_template: + "/user_avatar/devforum.roblox.com/ziplocbag/{size}/909305_2.png", + }, + { + id: 26244, + username: "mxdanger", + avatar_template: + "/user_avatar/devforum.roblox.com/mxdanger/{size}/1457829_2.png", + }, + { + id: 2791, + username: "Dogutsune", + avatar_template: + "/user_avatar/devforum.roblox.com/dogutsune/{size}/1053710_2.png", + }, + { + id: 431740, + username: "TheSenorDuck", + avatar_template: + "/user_avatar/devforum.roblox.com/thesenorduck/{size}/933266_2.png", + }, + { + id: 155602, + username: "RobieTheCat", + avatar_template: + "/user_avatar/devforum.roblox.com/robiethecat/{size}/1572265_2.png", + }, + { + id: 6350, + username: "The_Aliens", + avatar_template: + "/user_avatar/devforum.roblox.com/the_aliens/{size}/1369228_2.png", + }, + { + id: 8849, + username: "lateregistration", + avatar_template: + "/user_avatar/devforum.roblox.com/lateregistration/{size}/964581_2.png", + }, + { + id: 241899, + username: "CringeEngineer", + avatar_template: + "/user_avatar/devforum.roblox.com/cringeengineer/{size}/1141949_2.png", + }, + { + id: 789, + username: "mothmage", + avatar_template: + "/user_avatar/devforum.roblox.com/mothmage/{size}/1387000_2.png", + }, + { + id: 273497, + username: "Voxelinator", + avatar_template: + "/user_avatar/devforum.roblox.com/voxelinator/{size}/1083723_2.png", + }, + { + id: 120247, + username: "MeaxisDev", + avatar_template: + "/user_avatar/devforum.roblox.com/meaxisdev/{size}/1454273_2.png", + }, + { + id: 38549, + username: "NickoSCP", + avatar_template: + "/user_avatar/devforum.roblox.com/nickoscp/{size}/1128258_2.png", + }, + { + id: 139902, + username: "LuukOriginal", + avatar_template: + "/user_avatar/devforum.roblox.com/luukoriginal/{size}/1314121_2.png", + }, + { + id: 38606, + username: "Homeomorph", + avatar_template: + "/user_avatar/devforum.roblox.com/homeomorph/{size}/1521085_2.png", + }, + { + id: 31496, + username: "Sentross", + avatar_template: + "/user_avatar/devforum.roblox.com/sentross/{size}/1485711_2.png", + }, + { + id: 326221, + username: "so1ehee", + avatar_template: + "/user_avatar/devforum.roblox.com/so1ehee/{size}/1494050_2.png", + }, + { + id: 304229, + username: "RawEggTheGreatIX", + avatar_template: + "/user_avatar/devforum.roblox.com/raweggthegreatix/{size}/1534316_2.png", + }, + { + id: 357, + username: "Plutonem", + avatar_template: + "/user_avatar/devforum.roblox.com/plutonem/{size}/1214626_2.png", + }, + { + id: 281177, + username: "meshadapt", + avatar_template: + "/user_avatar/devforum.roblox.com/meshadapt/{size}/1024879_2.png", + }, + { + id: 1227, + username: "Rocky28447", + avatar_template: + "/user_avatar/devforum.roblox.com/rocky28447/{size}/1025963_2.png", + }, + { + id: 439104, + username: "meblec", + avatar_template: + "/user_avatar/devforum.roblox.com/meblec/{size}/1582125_2.png", + }, + { + id: 224996, + username: "TheCrypticRunner", + avatar_template: + "/user_avatar/devforum.roblox.com/thecrypticrunner/{size}/1457066_2.png", + }, + { + id: 92183, + username: "Vasilakious", + avatar_template: + "/user_avatar/devforum.roblox.com/vasilakious/{size}/1117302_2.png", + }, + { + id: 9593, + username: "BanTech", + avatar_template: + "/user_avatar/devforum.roblox.com/bantech/{size}/1534999_2.png", + }, + { + id: 7351, + username: "Sublivion", + avatar_template: + "/user_avatar/devforum.roblox.com/sublivion/{size}/629555_2.png", + }, + { + id: 643, + username: "buildthomas", + avatar_template: + "/user_avatar/devforum.roblox.com/buildthomas/{size}/1146835_2.png", + }, + { + id: 153142, + username: "Blokhampster34", + avatar_template: + "/user_avatar/devforum.roblox.com/blokhampster34/{size}/1170235_2.png", + }, + { + id: 86089, + username: "Vmena", + avatar_template: + "/user_avatar/devforum.roblox.com/vmena/{size}/1155786_2.png", + }, + { + id: 220864, + username: "rogeriodec_games", + avatar_template: + "/user_avatar/devforum.roblox.com/rogeriodec_games/{size}/957129_2.png", + }, + { + id: 186756, + username: "Dummy_Tested", + avatar_template: + "/user_avatar/devforum.roblox.com/dummy_tested/{size}/399575_2.png", + }, + { + id: 23710, + username: "DarthChadius", + avatar_template: + "/user_avatar/devforum.roblox.com/darthchadius/{size}/734631_2.png", + }, + { + id: 77150, + username: "CAP7A1N", + avatar_template: + "/user_avatar/devforum.roblox.com/cap7a1n/{size}/1428937_2.png", + }, + { + id: 306008, + username: "Stelth155_Dev", + avatar_template: + "/user_avatar/devforum.roblox.com/stelth155_dev/{size}/1127802_2.png", + }, + { + id: 103015, + username: "Cruizer_Snowman", + avatar_template: + "/user_avatar/devforum.roblox.com/cruizer_snowman/{size}/1441731_2.png", + }, + { + id: 210201, + username: "vrtblox", + avatar_template: + "/user_avatar/devforum.roblox.com/vrtblox/{size}/580542_2.png", + }, + { + id: 12817, + username: "anon66957764", + avatar_template: + "https://www.roblox.com/headshot-thumbnail/image?userId=463253&width=150&height=150", + }, + { + id: 380713, + username: "Vargogram", + avatar_template: + "/user_avatar/devforum.roblox.com/vargogram/{size}/1475193_2.png", + }, + { + id: 289807, + username: "Crazedbrick1", + avatar_template: + "/user_avatar/devforum.roblox.com/crazedbrick1/{size}/1571206_2.png", + }, + { + id: 10734, + username: "CycloneUprising", + avatar_template: + "/user_avatar/devforum.roblox.com/cycloneuprising/{size}/1327682_2.png", + }, + { + id: 363802, + username: "Kairomatic", + avatar_template: + "/user_avatar/devforum.roblox.com/kairomatic/{size}/1482469_2.png", + }, + { + id: 224243, + username: "Eternalove_fan32", + avatar_template: + "/user_avatar/devforum.roblox.com/eternalove_fan32/{size}/1426044_2.png", + }, + { + id: 84276, + username: "Phlegethon5778", + avatar_template: + "/user_avatar/devforum.roblox.com/phlegethon5778/{size}/1232567_2.png", + }, + { + id: 317063, + username: "umpireboy", + avatar_template: + "/user_avatar/devforum.roblox.com/umpireboy/{size}/1418322_2.png", + }, + { + id: 14154, + username: "Hadiisepic", + avatar_template: + "/user_avatar/devforum.roblox.com/hadiisepic/{size}/1472103_2.png", + }, + { + id: 202896, + username: "vrs2210", + avatar_template: + "/user_avatar/devforum.roblox.com/vrs2210/{size}/1570268_2.png", + }, + { + id: 201, + username: "Khanovich", + avatar_template: + "/user_avatar/devforum.roblox.com/khanovich/{size}/540780_2.png", + }, + { + id: 85229, + username: "Oficcer_F", + avatar_template: + "/user_avatar/devforum.roblox.com/oficcer_f/{size}/1545789_2.png", + }, + { + id: 186768, + username: "Cald_fan", + avatar_template: + "/user_avatar/devforum.roblox.com/cald_fan/{size}/1561054_2.png", + }, + { + id: 286481, + username: "TheGreat_Scott", + avatar_template: + "/user_avatar/devforum.roblox.com/thegreat_scott/{size}/1350329_2.png", + }, + ], + primary_groups: [ + { + id: 41, + name: "Roblox_Staff", + flair_url: + "/uploads/default/original/4X/9/e/7/9e76ae2dd3aa25dc7a42e6443ec4cc57dd999ffe.png", + flair_bg_color: "", + flair_color: "", + }, + { + id: 50, + name: "DevRelationsTeam", + flair_url: + "/uploads/default/original/4X/9/e/7/9e76ae2dd3aa25dc7a42e6443ec4cc57dd999ffe.png", + flair_bg_color: "", + flair_color: "", + }, + ], + topic_list: { + can_create_topic: true, + more_topics_url: + "/tags/c/updates/announcements/36/studio?match_all_tags=true&page=1&tags%5B%5D=studio", + draft: null, + draft_key: "new_topic", + draft_sequence: 1681, + per_page: 30, + top_tags: [ + "studio", + "physics", + "scripting", + "maintenance", + "avatar", + "beta", + "accelerator", + "building", + "welds", + "gui", + "modeling", + "wiki", + "animation", + "humanoid", + "luau", + "terrain", + "api", + "events", + "intern", + "internship", + "motor6d", + "r15", + "smoothterrain", + "accessories", + "analytics", + "animation-editor", + "animations", + "incubator", + "rdc", + "rendering", + ], + tags: [{ id: 68, name: "studio", topic_count: 7872, staff: false }], + topics: [ + { + id: 1038853, + title: "New Physics Stepping Method: Adaptive Timestepping", + fancy_title: + "New Physics Stepping Method: Adaptive Timestepping", + slug: "new-physics-stepping-method-adaptive-timestepping", + posts_count: 65, + reply_count: 33, + highest_post_number: 68, + image_url: null, + created_at: "2021-02-10T22:51:55.427Z", + last_posted_at: "2021-02-16T20:18:25.918Z", + bumped: true, + bumped_at: "2021-02-18T03:52:19.710Z", + archetype: "regular", + unseen: false, + last_read_post_number: 12, + unread: 34, + new_posts: 22, + pinned: false, + unpinned: null, + visible: true, + closed: false, + archived: false, + notification_level: 3, + bookmarked: false, + liked: false, + tags: ["studio", "beta"], + views: 15049, + like_count: 663, + has_summary: true, + last_poster_username: "iSyriux", + category_id: 36, + pinned_globally: false, + featured_link: null, + has_accepted_answer: false, + vote_count: 0, + can_vote: false, + user_voted: false, + posters: [ + { + extras: null, + description: "Автор", + user_id: 306443, + primary_group_id: 41, + }, + { + extras: null, + description: "Частый автор", + user_id: 36263, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 120450, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 472489, + primary_group_id: null, + }, + { + extras: "latest", + description: "Последний автор", + user_id: 44883, + primary_group_id: null, + }, + ], + }, + { + id: 1025033, + title: "Heightmaps Go to New Altitudes!", + fancy_title: "Heightmaps Go to New Altitudes!", + slug: "heightmaps-go-to-new-altitudes", + posts_count: 108, + reply_count: 69, + highest_post_number: 141, + image_url: + "https://doy2mn9upadnk.cloudfront.net/uploads/default/optimized/4X/0/c/c/0cca114c25efbe61d257c9580c3cd7413278b84d_2_1024x779.jpeg", + created_at: "2021-02-04T18:31:29.269Z", + last_posted_at: "2021-02-17T09:20:13.946Z", + bumped: true, + bumped_at: "2021-02-17T09:20:13.946Z", + archetype: "regular", + unseen: false, + pinned: false, + unpinned: null, + visible: true, + closed: false, + archived: false, + bookmarked: null, + liked: null, + tags: ["studio", "beta"], + views: 16743, + like_count: 1093, + has_summary: true, + last_poster_username: "Miles_1king", + category_id: 36, + pinned_globally: false, + featured_link: null, + has_accepted_answer: false, + vote_count: 0, + can_vote: false, + user_voted: false, + posters: [ + { + extras: null, + description: "Автор", + user_id: 351893, + primary_group_id: 41, + }, + { + extras: null, + description: "Частый автор", + user_id: 376200, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 598293, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 249742, + primary_group_id: null, + }, + { + extras: "latest", + description: "Последний автор", + user_id: 557246, + primary_group_id: null, + }, + ], + }, + { + id: 1007452, + title: 'Upcoming Potential Property Name Conflict: "Pivot"', + fancy_title: + "Upcoming Potential Property Name Conflict: “Pivot”", + slug: "upcoming-potential-property-name-conflict-pivot", + posts_count: 74, + reply_count: 51, + highest_post_number: 76, + image_url: null, + created_at: "2021-01-26T17:37:55.868Z", + last_posted_at: "2021-02-11T19:12:41.189Z", + bumped: true, + bumped_at: "2021-02-11T19:12:41.189Z", + archetype: "regular", + unseen: false, + last_read_post_number: 5, + unread: 6, + new_posts: 65, + pinned: false, + unpinned: null, + visible: true, + closed: false, + archived: false, + notification_level: 3, + bookmarked: false, + liked: false, + tags: ["studio"], + views: 16748, + like_count: 490, + has_summary: true, + last_poster_username: "tnavarts", + category_id: 36, + pinned_globally: false, + featured_link: null, + has_accepted_answer: false, + vote_count: 0, + can_vote: false, + user_voted: false, + posters: [ + { + extras: "latest", + description: "Автор, Последний автор", + user_id: 341046, + primary_group_id: 41, + }, + { + extras: null, + description: "Частый автор", + user_id: 164536, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 300, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 27022, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 11348, + primary_group_id: null, + }, + ], + }, + { + id: 993767, + title: "Changing the Mac Studio Command Keycode: Control vs Meta", + fancy_title: + "Changing the Mac Studio Command Keycode: Control vs Meta", + slug: "changing-the-mac-studio-command-keycode-control-vs-meta", + posts_count: 16, + reply_count: 5, + highest_post_number: 17, + image_url: null, + created_at: "2021-01-19T22:05:17.218Z", + last_posted_at: "2021-01-22T01:22:09.206Z", + bumped: true, + bumped_at: "2021-01-22T01:22:09.206Z", + archetype: "regular", + unseen: false, + pinned: false, + unpinned: null, + visible: true, + closed: false, + archived: false, + bookmarked: null, + liked: null, + tags: ["studio"], + views: 14308, + like_count: 166, + has_summary: false, + last_poster_username: "Optiplex3020SFF", + category_id: 36, + pinned_globally: false, + featured_link: null, + has_accepted_answer: false, + vote_count: 0, + can_vote: false, + user_voted: false, + posters: [ + { + extras: null, + description: "Автор", + user_id: 350909, + primary_group_id: 41, + }, + { + extras: null, + description: "Частый автор", + user_id: 200305, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 176552, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 17304, + primary_group_id: null, + }, + { + extras: "latest", + description: "Последний автор", + user_id: 461567, + primary_group_id: null, + }, + ], + }, + { + id: 984141, + title: "New Studio Beta: Attributes!", + fancy_title: "New Studio Beta: Attributes!", + slug: "new-studio-beta-attributes", + posts_count: 353, + reply_count: 140, + highest_post_number: 372, + image_url: + "https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/f/0/4/f04ea572324df16f6eb86f657ab0765c3b7c4779.png", + created_at: "2021-01-14T23:57:24.805Z", + last_posted_at: "2021-02-17T21:39:05.229Z", + bumped: true, + bumped_at: "2021-02-17T21:39:05.229Z", + archetype: "regular", + unseen: false, + last_read_post_number: 30, + unread: 314, + new_posts: 28, + pinned: false, + unpinned: null, + visible: true, + closed: false, + archived: false, + notification_level: 3, + bookmarked: false, + liked: false, + tags: ["studio", "beta"], + views: 36468, + like_count: 1942, + has_summary: true, + last_poster_username: "Fire540Games", + category_id: 36, + pinned_globally: false, + featured_link: null, + has_accepted_answer: false, + vote_count: 0, + can_vote: false, + user_voted: false, + posters: [ + { + extras: null, + description: "Автор", + user_id: 260389, + primary_group_id: 41, + }, + { + extras: null, + description: "Частый автор", + user_id: 11348, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 163116, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 396736, + primary_group_id: null, + }, + { + extras: "latest", + description: "Последний автор", + user_id: 105134, + primary_group_id: null, + }, + ], + }, + { + id: 932576, + title: "New Terrain, and Parts, and Built-In Materials, Oh my!", + fancy_title: + "New Terrain, and Parts, and Built-In Materials, Oh my!", + slug: "new-terrain-and-parts-and-built-in-materials-oh-my", + posts_count: 1155, + reply_count: 358, + highest_post_number: 1341, + image_url: + "https://doy2mn9upadnk.cloudfront.net/uploads/default/optimized/4X/5/2/2/52240686713d0ec0b1b9ab802268030a8cb15627_2_1024x420.jpeg", + created_at: "2020-12-19T00:22:20.801Z", + last_posted_at: "2021-02-17T22:45:44.156Z", + bumped: true, + bumped_at: "2021-02-17T22:45:44.156Z", + archetype: "regular", + unseen: false, + last_read_post_number: 20, + unread: 849, + new_posts: 472, + pinned: false, + unpinned: null, + visible: true, + closed: false, + archived: false, + notification_level: 3, + bookmarked: false, + liked: false, + tags: ["studio", "beta"], + views: 100027, + like_count: 7467, + has_summary: true, + last_poster_username: "ittrgrey", + category_id: 36, + pinned_globally: false, + featured_link: null, + has_accepted_answer: false, + vote_count: 0, + can_vote: false, + user_voted: false, + posters: [ + { + extras: null, + description: "Автор", + user_id: 17941, + primary_group_id: 41, + }, + { + extras: null, + description: "Частый автор", + user_id: 395244, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 351579, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 194130, + primary_group_id: null, + }, + { + extras: "latest", + description: "Последний автор", + user_id: 7289, + primary_group_id: null, + }, + ], + }, + { + id: 919991, + title: "Proximity Prompt Release", + fancy_title: "Proximity Prompt Release", + slug: "proximity-prompt-release", + posts_count: 161, + reply_count: 96, + highest_post_number: 228, + image_url: + "https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/5/a/8/5a8617595bc32d070053437b78e722f12f01e78a.gif", + created_at: "2020-12-12T02:06:19.525Z", + last_posted_at: "2021-02-16T02:45:15.238Z", + bumped: true, + bumped_at: "2021-02-16T02:45:15.238Z", + archetype: "regular", + unseen: false, + last_read_post_number: 205, + unread: 22, + new_posts: 1, + pinned: false, + unpinned: null, + visible: true, + closed: false, + archived: false, + notification_level: 3, + bookmarked: false, + liked: false, + tags: ["studio"], + views: 33224, + like_count: 941, + has_summary: true, + last_poster_username: "Miles_1king", + category_id: 36, + pinned_globally: false, + featured_link: null, + has_accepted_answer: false, + vote_count: 0, + can_vote: false, + user_voted: false, + posters: [ + { + extras: null, + description: "Автор", + user_id: 350909, + primary_group_id: 41, + }, + { + extras: null, + description: "Частый автор", + user_id: 451394, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 312723, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 51619, + primary_group_id: null, + }, + { + extras: "latest", + description: "Последний автор", + user_id: 557246, + primary_group_id: null, + }, + ], + }, + { + id: 904022, + title: "Asset Manager Phased Rollout", + fancy_title: "Asset Manager Phased Rollout", + slug: "asset-manager-phased-rollout", + posts_count: 75, + reply_count: 42, + highest_post_number: 82, + image_url: null, + created_at: "2020-12-03T19:15:44.962Z", + last_posted_at: "2021-02-13T04:08:21.822Z", + bumped: true, + bumped_at: "2021-02-13T04:08:21.822Z", + archetype: "regular", + unseen: false, + last_read_post_number: 17, + unread: 0, + new_posts: 65, + pinned: false, + unpinned: null, + visible: true, + closed: false, + archived: false, + notification_level: 3, + bookmarked: false, + liked: false, + tags: ["studio", "beta"], + views: 20262, + like_count: 339, + has_summary: true, + last_poster_username: "ItzDaSniper_ALT", + category_id: 36, + pinned_globally: false, + featured_link: null, + has_accepted_answer: false, + vote_count: 0, + can_vote: false, + user_voted: false, + posters: [ + { + extras: null, + description: "Автор", + user_id: 285060, + primary_group_id: 41, + }, + { + extras: null, + description: "Частый автор", + user_id: 417018, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 32451, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 45822, + primary_group_id: null, + }, + { + extras: "latest", + description: "Последний автор", + user_id: 100697, + primary_group_id: null, + }, + ], + }, + { + id: 898436, + title: "Expressive Output Window - Phased Rollout", + fancy_title: "Expressive Output Window - Phased Rollout", + slug: "expressive-output-window-phased-rollout", + posts_count: 35, + reply_count: 9, + highest_post_number: 38, + image_url: null, + created_at: "2020-11-30T21:14:57.519Z", + last_posted_at: "2021-02-09T02:19:01.395Z", + bumped: true, + bumped_at: "2021-02-09T02:19:01.395Z", + archetype: "regular", + unseen: false, + last_read_post_number: 1, + unread: 0, + new_posts: 37, + pinned: false, + unpinned: null, + visible: true, + closed: false, + archived: false, + notification_level: 3, + bookmarked: false, + liked: false, + tags: ["studio", "beta", "output-window", "output"], + views: 11811, + like_count: 255, + has_summary: false, + last_poster_username: "overflowed", + category_id: 36, + pinned_globally: false, + featured_link: null, + has_accepted_answer: false, + vote_count: 0, + can_vote: false, + user_voted: false, + posters: [ + { + extras: null, + description: "Автор", + user_id: 192817, + primary_group_id: 41, + }, + { + extras: null, + description: "Частый автор", + user_id: 3657, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 778, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 5316, + primary_group_id: null, + }, + { + extras: "latest", + description: "Последний автор", + user_id: 230186, + primary_group_id: null, + }, + ], + }, + { + id: 897999, + title: "[Activated!] New Part Physics API", + fancy_title: "[Activated!] New Part Physics API", + slug: "activated-new-part-physics-api", + posts_count: 80, + reply_count: 43, + highest_post_number: 83, + image_url: null, + created_at: "2020-11-30T18:30:16.161Z", + last_posted_at: "2021-02-08T20:31:36.781Z", + bumped: true, + bumped_at: "2021-02-08T20:31:36.781Z", + archetype: "regular", + unseen: false, + last_read_post_number: 33, + unread: 0, + new_posts: 50, + pinned: false, + unpinned: null, + visible: true, + closed: false, + archived: false, + notification_level: 3, + bookmarked: false, + liked: false, + tags: ["studio", "physics"], + views: 15373, + like_count: 456, + has_summary: true, + last_poster_username: "Phoninian", + category_id: 36, + pinned_globally: false, + featured_link: null, + has_accepted_answer: true, + vote_count: 0, + can_vote: false, + user_voted: false, + posters: [ + { + extras: null, + description: "Автор", + user_id: 119859, + primary_group_id: 41, + }, + { + extras: null, + description: "Частый автор", + user_id: 341046, + primary_group_id: 41, + }, + { + extras: null, + description: "Частый автор", + user_id: 222257, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 36263, + primary_group_id: null, + }, + { + extras: "latest", + description: "Последний автор", + user_id: 96898, + primary_group_id: null, + }, + ], + }, + { + id: 878947, + title: "Luau Type Checking Release", + fancy_title: "Luau Type Checking Release", + slug: "luau-type-checking-release", + posts_count: 130, + reply_count: 51, + highest_post_number: 135, + image_url: + "https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/1/0/b/10b42bc7cc1bef0f79f6a79415c8a87435edf0c1.png", + created_at: "2020-11-19T18:21:13.701Z", + last_posted_at: "2021-02-09T20:39:33.667Z", + bumped: true, + bumped_at: "2021-02-09T20:39:33.667Z", + archetype: "regular", + unseen: false, + pinned: false, + unpinned: null, + visible: true, + closed: false, + archived: false, + bookmarked: null, + liked: null, + tags: ["scripting", "studio", "luau"], + views: 15216, + like_count: 507, + has_summary: true, + last_poster_username: "zeuxcg", + category_id: 36, + pinned_globally: false, + featured_link: null, + has_accepted_answer: false, + vote_count: 0, + can_vote: false, + user_voted: false, + posters: [ + { + extras: "latest", + description: "Автор, Последний автор", + user_id: 130, + primary_group_id: 41, + }, + { + extras: null, + description: "Частый автор", + user_id: 346894, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 223, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 431, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 87089, + primary_group_id: null, + }, + ], + }, + { + id: 877873, + title: "Introducing Bulk Audio Importing in Studio!", + fancy_title: "Introducing Bulk Audio Importing in Studio!", + slug: "introducing-bulk-audio-importing-in-studio", + posts_count: 55, + reply_count: 19, + highest_post_number: 60, + image_url: + "https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/e/f/b/efbc663dd66369ccc18459d2ec642cc45cff3414.png", + created_at: "2020-11-19T00:00:47.997Z", + last_posted_at: "2021-02-07T00:36:38.741Z", + bumped: true, + bumped_at: "2021-02-07T00:36:38.741Z", + archetype: "regular", + unseen: false, + pinned: false, + unpinned: null, + visible: true, + closed: false, + archived: false, + bookmarked: null, + liked: null, + tags: ["studio"], + views: 13730, + like_count: 562, + has_summary: true, + last_poster_username: "jacklollz2", + category_id: 36, + pinned_globally: false, + featured_link: null, + has_accepted_answer: false, + vote_count: 0, + can_vote: false, + user_voted: false, + posters: [ + { + extras: null, + description: "Автор", + user_id: 134567, + primary_group_id: 41, + }, + { + extras: null, + description: "Частый автор", + user_id: 214043, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 451394, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 393053, + primary_group_id: null, + }, + { + extras: "latest", + description: "Последний автор", + user_id: 9518, + primary_group_id: null, + }, + ], + }, + { + id: 877312, + title: "Introducing Plugin Script Modification Permissions", + fancy_title: + "Introducing Plugin Script Modification Permissions", + slug: "introducing-plugin-script-modification-permissions", + posts_count: 76, + reply_count: 28, + highest_post_number: 86, + image_url: + "https://doy2mn9upadnk.cloudfront.net/uploads/default/optimized/4X/5/a/6/5a645ea86f19c66297c1b763bf4e77541d5ed8ca_2_1024x401.png", + created_at: "2020-11-18T18:26:04.109Z", + last_posted_at: "2021-01-15T23:17:58.252Z", + bumped: true, + bumped_at: "2021-01-15T23:17:58.252Z", + archetype: "regular", + unseen: false, + pinned: false, + unpinned: null, + visible: true, + closed: false, + archived: false, + bookmarked: null, + liked: null, + tags: ["studio"], + views: 11452, + like_count: 422, + has_summary: true, + last_poster_username: "RuizuKun_Dev", + category_id: 36, + pinned_globally: false, + featured_link: null, + has_accepted_answer: false, + vote_count: 0, + can_vote: false, + user_voted: false, + posters: [ + { + extras: null, + description: "Автор", + user_id: 134567, + primary_group_id: 41, + }, + { + extras: null, + description: "Частый автор", + user_id: 34253, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 32226, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 317122, + primary_group_id: null, + }, + { + extras: "latest", + description: "Последний автор", + user_id: 33762, + primary_group_id: null, + }, + ], + }, + { + id: 874260, + title: "Script Editor - Semantic Highlighting and Temporary Tabs are now in Beta!", + fancy_title: + "Script Editor - Semantic Highlighting and Temporary Tabs are now in Beta!", + slug: "script-editor-semantic-highlighting-and-temporary-tabs-are-now-in-beta", + posts_count: 201, + reply_count: 99, + highest_post_number: 205, + image_url: + "https://doy2mn9upadnk.cloudfront.net/uploads/default/optimized/4X/5/d/c/5dce483b91353355e69c03ffd023388cfbbbeca2_2_1024x526.jpeg", + created_at: "2020-11-16T21:18:47.223Z", + last_posted_at: "2021-02-07T08:17:42.638Z", + bumped: true, + bumped_at: "2021-02-07T08:17:42.638Z", + archetype: "regular", + unseen: false, + pinned: false, + unpinned: null, + visible: true, + closed: false, + archived: false, + bookmarked: null, + liked: null, + tags: ["studio", "beta"], + views: 13036, + like_count: 1056, + has_summary: true, + last_poster_username: "KrYn0MoRe", + category_id: 36, + pinned_globally: false, + featured_link: null, + has_accepted_answer: false, + vote_count: 0, + can_vote: false, + user_voted: false, + posters: [ + { + extras: null, + description: "Автор", + user_id: 237547, + primary_group_id: 41, + }, + { + extras: null, + description: "Частый автор", + user_id: 1045, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 27530, + primary_group_id: 41, + }, + { + extras: null, + description: "Частый автор", + user_id: 47029, + primary_group_id: null, + }, + { + extras: "latest", + description: "Последний автор", + user_id: 231587, + primary_group_id: null, + }, + ], + }, + { + id: 744534, + title: "Studio is Ending Support for Mac OS X 10.10 (Yosemite)", + fancy_title: + "Studio is Ending Support for Mac OS X 10.10 (Yosemite)", + slug: "studio-is-ending-support-for-mac-os-x-10-10-yosemite", + posts_count: 66, + reply_count: 31, + highest_post_number: 76, + image_url: null, + created_at: "2020-08-31T17:34:00.000Z", + last_posted_at: "2021-01-26T22:14:45.165Z", + bumped: true, + bumped_at: "2020-09-28T22:14:43.451Z", + archetype: "regular", + unseen: false, + pinned: false, + unpinned: null, + visible: true, + closed: true, + archived: false, + bookmarked: null, + liked: null, + tags: ["studio"], + views: 50641, + like_count: 451, + has_summary: true, + last_poster_username: "system", + category_id: 36, + pinned_globally: false, + featured_link: null, + has_accepted_answer: false, + vote_count: 0, + can_vote: false, + user_voted: false, + posters: [ + { + extras: null, + description: "Автор", + user_id: 285060, + primary_group_id: 41, + }, + { + extras: null, + description: "Частый автор", + user_id: 347486, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 416893, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 33422, + primary_group_id: null, + }, + { + extras: "latest", + description: "Последний автор", + user_id: -1, + primary_group_id: null, + }, + ], + }, + { + id: 746146, + title: "Display All Permissions for Group Games", + fancy_title: "Display All Permissions for Group Games", + slug: "display-all-permissions-for-group-games", + posts_count: 12, + reply_count: 8, + highest_post_number: 20, + image_url: null, + created_at: "2020-08-28T17:31:49.301Z", + last_posted_at: "2021-01-22T17:15:00.609Z", + bumped: true, + bumped_at: "2020-09-24T17:15:00.254Z", + archetype: "regular", + unseen: false, + last_read_post_number: 20, + unread: 0, + new_posts: 0, + pinned: false, + unpinned: null, + visible: true, + closed: true, + archived: false, + notification_level: 3, + bookmarked: false, + liked: false, + tags: ["studio"], + views: 43683, + like_count: 251, + has_summary: false, + last_poster_username: "coefficients", + category_id: 36, + pinned_globally: false, + featured_link: null, + has_accepted_answer: false, + vote_count: 0, + can_vote: false, + user_voted: false, + posters: [ + { + extras: "latest", + description: "Автор, Последний автор", + user_id: 112950, + primary_group_id: 41, + }, + { + extras: null, + description: "Частый автор", + user_id: 419793, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 57718, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 3052, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 26244, + primary_group_id: null, + }, + ], + }, + { + id: 722215, + title: "Finale of Part Surface Changes: No More Hinges", + fancy_title: + "Finale of Part Surface Changes: No More Hinges", + slug: "finale-of-part-surface-changes-no-more-hinges", + posts_count: 133, + reply_count: 67, + highest_post_number: 143, + image_url: + "https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/d/9/b/d9bdfde1668446e0037867a9dcbd49dcc685b7eb.gif", + created_at: "2020-08-13T18:09:27.690Z", + last_posted_at: "2020-12-08T19:04:09.193Z", + bumped: true, + bumped_at: "2020-12-08T19:04:09.193Z", + archetype: "regular", + unseen: false, + pinned: false, + unpinned: null, + visible: true, + closed: false, + archived: false, + bookmarked: null, + liked: null, + tags: ["building", "studio", "physics"], + views: 25124, + like_count: 885, + has_summary: true, + last_poster_username: "TheSenorDuck", + category_id: 36, + pinned_globally: false, + featured_link: null, + has_accepted_answer: false, + vote_count: 0, + can_vote: false, + user_voted: false, + posters: [ + { + extras: null, + description: "Автор", + user_id: 119859, + primary_group_id: 41, + }, + { + extras: null, + description: "Частый автор", + user_id: 2791, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 11348, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 341046, + primary_group_id: 41, + }, + { + extras: "latest", + description: "Последний автор", + user_id: 431740, + primary_group_id: null, + }, + ], + }, + { + id: 705528, + title: "Skinned MeshPart Studio Beta", + fancy_title: "Skinned MeshPart Studio Beta", + slug: "skinned-meshpart-studio-beta", + posts_count: 345, + reply_count: 207, + highest_post_number: 358, + image_url: + "https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/a/8/7/a8786999b226cbb244060442b7e3fc04154267ae.png", + created_at: "2020-08-03T22:59:46.002Z", + last_posted_at: "2020-12-02T00:04:48.733Z", + bumped: true, + bumped_at: "2020-12-01T21:30:40.306Z", + archetype: "regular", + unseen: false, + pinned: false, + unpinned: null, + visible: true, + closed: true, + archived: false, + bookmarked: null, + liked: null, + tags: ["studio", "modeling", "rendering"], + views: 49892, + like_count: 2218, + has_summary: true, + last_poster_username: "mothmage", + category_id: 36, + pinned_globally: false, + featured_link: null, + has_accepted_answer: false, + vote_count: 0, + can_vote: false, + user_voted: false, + posters: [ + { + extras: null, + description: "Автор", + user_id: 155602, + primary_group_id: 41, + }, + { + extras: null, + description: "Частый автор", + user_id: 6350, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 8849, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 241899, + primary_group_id: null, + }, + { + extras: "latest", + description: "Последний автор", + user_id: 789, + primary_group_id: null, + }, + ], + }, + { + id: 674209, + title: "Introducing Two Game Security Settings: Third Party Sales & Cross Game Teleports", + fancy_title: + "Introducing Two Game Security Settings: Third Party Sales & Cross Game Teleports", + slug: "introducing-two-game-security-settings-third-party-sales-cross-game-teleports", + posts_count: 100, + reply_count: 28, + highest_post_number: 120, + image_url: + "https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/0/c/7/0c776e4648a634d0c17287869c13fbdb790f7f36.png", + created_at: "2020-07-16T00:43:28.114Z", + last_posted_at: "2020-11-11T21:06:01.454Z", + bumped: true, + bumped_at: "2021-01-22T16:14:45.381Z", + archetype: "regular", + unseen: false, + pinned: false, + unpinned: null, + visible: true, + closed: false, + archived: false, + bookmarked: null, + liked: null, + tags: ["studio"], + views: 33642, + like_count: 735, + has_summary: true, + last_poster_username: "LuukOriginal", + category_id: 36, + pinned_globally: false, + featured_link: null, + has_accepted_answer: false, + vote_count: 0, + can_vote: false, + user_voted: false, + posters: [ + { + extras: null, + description: "Автор", + user_id: 134567, + primary_group_id: 41, + }, + { + extras: null, + description: "Частый автор", + user_id: 273497, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 120247, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 38549, + primary_group_id: null, + }, + { + extras: "latest", + description: "Последний автор", + user_id: 139902, + primary_group_id: null, + }, + ], + }, + { + id: 663449, + title: "SurfaceAppearance Studio Beta", + fancy_title: "SurfaceAppearance Studio Beta", + slug: "surfaceappearance-studio-beta", + posts_count: 415, + reply_count: 186, + highest_post_number: 437, + image_url: + "https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/5/f/c/5fca97d93e86876dbb3ee5bd2adfa3b5f699bcfd.png", + created_at: "2020-07-09T18:58:00.000Z", + last_posted_at: "2021-02-15T21:51:59.958Z", + bumped: true, + bumped_at: "2021-02-15T21:51:59.958Z", + archetype: "regular", + unseen: false, + last_read_post_number: 43, + unread: 55, + new_posts: 339, + pinned: false, + unpinned: null, + visible: true, + closed: false, + archived: false, + notification_level: 3, + bookmarked: false, + liked: false, + tags: ["studio"], + views: 68064, + like_count: 4562, + has_summary: true, + last_poster_username: "Plutonem", + category_id: 36, + pinned_globally: false, + featured_link: null, + has_accepted_answer: false, + vote_count: 0, + can_vote: false, + user_voted: false, + posters: [ + { + extras: null, + description: "Автор", + user_id: 38606, + primary_group_id: 41, + }, + { + extras: null, + description: "Частый автор", + user_id: 31496, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 326221, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 304229, + primary_group_id: null, + }, + { + extras: "latest", + description: "Последний автор", + user_id: 357, + primary_group_id: null, + }, + ], + }, + { + id: 662464, + title: "New Beta Feature: LevelOfDetail Property for Models (Enabled Globally)", + fancy_title: + "New Beta Feature: LevelOfDetail Property for Models (Enabled Globally)", + slug: "new-beta-feature-levelofdetail-property-for-models-enabled-globally", + posts_count: 51, + reply_count: 18, + highest_post_number: 52, + image_url: + "https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/d/e/b/deb938a882c680f766fa49d5a3b8a16f2e56b39f.png", + created_at: "2020-07-08T05:12:01.996Z", + last_posted_at: "2021-01-06T09:49:20.839Z", + bumped: true, + bumped_at: "2021-01-06T09:49:20.839Z", + archetype: "regular", + unseen: false, + pinned: false, + unpinned: null, + visible: true, + closed: false, + archived: false, + bookmarked: null, + liked: null, + tags: ["studio", "modeling", "rendering", "networking"], + views: 11907, + like_count: 502, + has_summary: true, + last_poster_username: "Vasilakious", + category_id: 36, + pinned_globally: false, + featured_link: null, + has_accepted_answer: false, + vote_count: 0, + can_vote: false, + user_voted: false, + posters: [ + { + extras: null, + description: "Автор", + user_id: 281177, + primary_group_id: 41, + }, + { + extras: null, + description: "Частый автор", + user_id: 1227, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 439104, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 224996, + primary_group_id: null, + }, + { + extras: "latest", + description: "Последний автор", + user_id: 92183, + primary_group_id: null, + }, + ], + }, + { + id: 644467, + title: "New RaycastParams Property, Deprecating Old Raycast Functions", + fancy_title: + "New RaycastParams Property, Deprecating Old Raycast Functions", + slug: "new-raycastparams-property-deprecating-old-raycast-functions", + posts_count: 91, + reply_count: 53, + highest_post_number: 95, + image_url: + "https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/d/3/2/d32b1ab64c2f0a4da24ffbe7450e8c6b251010f6.png", + created_at: "2020-06-26T00:21:46.173Z", + last_posted_at: "2021-01-01T22:29:39.110Z", + bumped: true, + bumped_at: "2021-01-01T21:59:42.756Z", + archetype: "regular", + unseen: false, + pinned: false, + unpinned: null, + visible: true, + closed: true, + archived: false, + bookmarked: null, + liked: null, + tags: ["studio", "physics"], + views: 13036, + like_count: 396, + has_summary: true, + last_poster_username: "buildthomas", + category_id: 36, + pinned_globally: false, + featured_link: null, + has_accepted_answer: false, + vote_count: 0, + can_vote: false, + user_voted: false, + posters: [ + { + extras: null, + description: "Автор", + user_id: 119859, + primary_group_id: 41, + }, + { + extras: null, + description: "Частый автор", + user_id: 431, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 9593, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 7351, + primary_group_id: null, + }, + { + extras: "latest", + description: "Последний автор", + user_id: 643, + primary_group_id: null, + }, + ], + }, + { + id: 642684, + title: "Expressive Output Window - Beta", + fancy_title: "Expressive Output Window - Beta", + slug: "expressive-output-window-beta", + posts_count: 153, + reply_count: 44, + highest_post_number: 170, + image_url: null, + created_at: "2020-06-25T19:30:00.000Z", + last_posted_at: "2020-12-05T18:24:48.359Z", + bumped: true, + bumped_at: "2020-12-05T18:32:03.488Z", + archetype: "regular", + unseen: false, + last_read_post_number: 107, + unread: 0, + new_posts: 63, + pinned: false, + unpinned: null, + visible: true, + closed: false, + archived: false, + notification_level: 3, + bookmarked: false, + liked: false, + tags: ["studio", "output-window"], + views: 23650, + like_count: 1181, + has_summary: true, + last_poster_username: "Dummy_Tested", + category_id: 36, + pinned_globally: false, + featured_link: null, + has_accepted_answer: false, + vote_count: 0, + can_vote: false, + user_voted: false, + posters: [ + { + extras: null, + description: "Автор", + user_id: 192817, + primary_group_id: 41, + }, + { + extras: null, + description: "Частый автор", + user_id: 153142, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 86089, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 220864, + primary_group_id: null, + }, + { + extras: "latest", + description: "Последний автор", + user_id: 186756, + primary_group_id: null, + }, + ], + }, + { + id: 643907, + title: "Universal Breakpoints Beta - One Breakpoint to Rule Them All", + fancy_title: + "Universal Breakpoints Beta - One Breakpoint to Rule Them All", + slug: "universal-breakpoints-beta-one-breakpoint-to-rule-them-all", + posts_count: 18, + reply_count: 3, + highest_post_number: 21, + image_url: null, + created_at: "2020-06-25T18:28:25.069Z", + last_posted_at: "2020-11-26T15:43:44.683Z", + bumped: true, + bumped_at: "2020-07-29T15:43:43.770Z", + archetype: "regular", + unseen: false, + pinned: false, + unpinned: null, + visible: true, + closed: true, + archived: false, + bookmarked: null, + liked: null, + tags: ["studio", "debugger"], + views: 11147, + like_count: 140, + has_summary: false, + last_poster_username: "system", + category_id: 36, + pinned_globally: false, + featured_link: null, + has_accepted_answer: false, + vote_count: 0, + can_vote: false, + user_voted: false, + posters: [ + { + extras: null, + description: "Автор", + user_id: 192817, + primary_group_id: 41, + }, + { + extras: null, + description: "Частый автор", + user_id: 112950, + primary_group_id: 41, + }, + { + extras: null, + description: "Частый автор", + user_id: 120247, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 23710, + primary_group_id: null, + }, + { + extras: "latest", + description: "Последний автор", + user_id: -1, + primary_group_id: null, + }, + ], + }, + { + id: 642282, + title: "Additional Game Management in Roblox Studio", + fancy_title: "Additional Game Management in Roblox Studio", + slug: "additional-game-management-in-roblox-studio", + posts_count: 88, + reply_count: 21, + highest_post_number: 92, + image_url: + "https://doy2mn9upadnk.cloudfront.net/uploads/default/optimized/4X/e/2/4/e24da11e138f564733aabacad3558b95a720830c_2_1023x638.png", + created_at: "2020-06-24T23:21:00.000Z", + last_posted_at: "2020-12-22T12:36:54.093Z", + bumped: true, + bumped_at: "2020-08-24T12:36:47.186Z", + archetype: "regular", + unseen: false, + last_read_post_number: 82, + unread: 2, + new_posts: 8, + pinned: false, + unpinned: null, + visible: true, + closed: true, + archived: false, + notification_level: 3, + bookmarked: false, + liked: false, + tags: ["studio"], + views: 12540, + like_count: 421, + has_summary: true, + last_poster_username: "system", + category_id: 36, + pinned_globally: false, + featured_link: null, + has_accepted_answer: true, + vote_count: 0, + can_vote: false, + user_voted: false, + posters: [ + { + extras: null, + description: "Автор", + user_id: 33422, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 77150, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 306008, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 103015, + primary_group_id: null, + }, + { + extras: "latest", + description: "Последний автор", + user_id: -1, + primary_group_id: null, + }, + ], + }, + { + id: 639903, + title: "Future Is Bright: Phase 3 - Studio Beta", + fancy_title: "Future Is Bright: Phase 3 - Studio Beta", + slug: "future-is-bright-phase-3-studio-beta", + posts_count: 1160, + reply_count: 657, + highest_post_number: 1233, + image_url: + "https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/e/6/4/e643cf506a8ac153c7720bab4af414a88eaf0a9a.png", + created_at: "2020-06-23T09:13:23.197Z", + last_posted_at: "2021-02-04T17:43:41.911Z", + bumped: true, + bumped_at: "2021-02-04T17:43:41.911Z", + archetype: "regular", + unseen: false, + pinned: false, + unpinned: null, + visible: true, + closed: false, + archived: false, + bookmarked: null, + liked: null, + tags: ["building", "studio"], + views: 97604, + like_count: 12547, + has_summary: true, + last_poster_username: "DoctorNO2106", + category_id: 36, + pinned_globally: false, + featured_link: null, + has_accepted_answer: false, + vote_count: 0, + can_vote: false, + user_voted: false, + posters: [ + { + extras: null, + description: "Автор", + user_id: 210201, + primary_group_id: 41, + }, + { + extras: null, + description: "Частый автор", + user_id: 12817, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 380713, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 289807, + primary_group_id: null, + }, + { + extras: "latest", + description: "Последний автор", + user_id: 317122, + primary_group_id: null, + }, + ], + }, + { + id: 623350, + title: "Plugin Debugging: New Beta Feature!", + fancy_title: "Plugin Debugging: New Beta Feature!", + slug: "plugin-debugging-new-beta-feature", + posts_count: 42, + reply_count: 13, + highest_post_number: 42, + image_url: null, + created_at: "2020-06-12T22:29:13.391Z", + last_posted_at: "2020-12-18T17:38:25.942Z", + bumped: true, + bumped_at: "2021-02-13T17:57:38.712Z", + archetype: "regular", + unseen: false, + last_read_post_number: 6, + unread: 36, + new_posts: 0, + pinned: false, + unpinned: null, + visible: true, + closed: false, + archived: false, + notification_level: 3, + bookmarked: false, + liked: false, + tags: ["studio"], + views: 12535, + like_count: 287, + has_summary: false, + last_poster_username: "Eternalove_fan32", + category_id: 36, + pinned_globally: false, + featured_link: null, + has_accepted_answer: false, + vote_count: 0, + can_vote: false, + user_voted: false, + posters: [ + { + extras: null, + description: "Автор", + user_id: 10734, + primary_group_id: 41, + }, + { + extras: null, + description: "Частый автор", + user_id: 363802, + primary_group_id: 50, + }, + { + extras: null, + description: "Частый автор", + user_id: 341046, + primary_group_id: 41, + }, + { + extras: null, + description: "Частый автор", + user_id: 223, + primary_group_id: null, + }, + { + extras: "latest", + description: "Последний автор", + user_id: 224243, + primary_group_id: null, + }, + ], + }, + { + id: 582921, + title: "Script Editor - New Foundation and First Features", + fancy_title: + "Script Editor - New Foundation and First Features", + slug: "script-editor-new-foundation-and-first-features", + posts_count: 104, + reply_count: 42, + highest_post_number: 106, + image_url: + "https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/1/9/1/191215aedf29cd0902640dcd2faffcdcfe1faeda.jpeg", + created_at: "2020-06-11T18:09:00.000Z", + last_posted_at: "2020-11-18T13:40:56.854Z", + bumped: true, + bumped_at: "2020-07-21T13:40:56.784Z", + archetype: "regular", + unseen: false, + last_read_post_number: 6, + unread: 94, + new_posts: 6, + pinned: false, + unpinned: null, + visible: true, + closed: true, + archived: false, + notification_level: 3, + bookmarked: false, + liked: false, + tags: ["studio", "script-editor"], + views: 23750, + like_count: 602, + has_summary: true, + last_poster_username: "system", + category_id: 36, + pinned_globally: false, + featured_link: null, + has_accepted_answer: false, + vote_count: 0, + can_vote: false, + user_voted: false, + posters: [ + { + extras: null, + description: "Автор", + user_id: 192817, + primary_group_id: 41, + }, + { + extras: null, + description: "Частый автор", + user_id: 778, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 12817, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 84276, + primary_group_id: null, + }, + { + extras: "latest", + description: "Последний автор", + user_id: -1, + primary_group_id: null, + }, + ], + }, + { + id: 552810, + title: "Introducing SmoothingAngle property for PartOperation (Enabled Globally)", + fancy_title: + "Introducing SmoothingAngle property for PartOperation (Enabled Globally)", + slug: "introducing-smoothingangle-property-for-partoperation-enabled-globally", + posts_count: 103, + reply_count: 33, + highest_post_number: 106, + image_url: + "https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/0/7/c/07c3ad00b386afbf9cc8924d69c86bceecfe003c.png", + created_at: "2020-05-06T21:42:00.000Z", + last_posted_at: "2020-09-09T11:12:18.309Z", + bumped: true, + bumped_at: "2020-08-04T18:46:27.868Z", + archetype: "regular", + unseen: false, + pinned: false, + unpinned: null, + visible: true, + closed: true, + archived: false, + bookmarked: null, + liked: null, + tags: ["studio", "csg", "csgv2"], + views: 36298, + like_count: 855, + has_summary: true, + last_poster_username: "system", + category_id: 36, + pinned_globally: false, + featured_link: null, + has_accepted_answer: false, + vote_count: 0, + can_vote: false, + user_voted: false, + posters: [ + { + extras: null, + description: "Автор", + user_id: 281177, + primary_group_id: 41, + }, + { + extras: null, + description: "Частый автор", + user_id: 317063, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 14154, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 202896, + primary_group_id: null, + }, + { + extras: "latest", + description: "Последний автор", + user_id: -1, + primary_group_id: null, + }, + ], + }, + { + id: 529077, + title: "New Studio Feature - CollisionFidelity.PreciseConvexDecomposition (Enabled Globally)", + fancy_title: + "New Studio Feature - CollisionFidelity.PreciseConvexDecomposition (Enabled Globally)", + slug: "new-studio-feature-collisionfidelity-preciseconvexdecomposition-enabled-globally", + posts_count: 140, + reply_count: 59, + highest_post_number: 146, + image_url: + "https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/1/f/d/1fd823f35f415e8e12eee67d842f70f638f38c5a.png", + created_at: "2020-04-17T14:59:53.209Z", + last_posted_at: "2021-01-03T23:10:39.815Z", + bumped: true, + bumped_at: "2021-01-03T23:14:21.658Z", + archetype: "regular", + unseen: false, + last_read_post_number: 2, + unread: 136, + new_posts: 8, + pinned: false, + unpinned: null, + visible: true, + closed: false, + archived: false, + notification_level: 3, + bookmarked: false, + liked: false, + tags: ["studio"], + views: 50555, + like_count: 862, + has_summary: true, + last_poster_username: "TheGreat_Scott", + category_id: 36, + pinned_globally: false, + featured_link: null, + has_accepted_answer: false, + vote_count: 0, + can_vote: false, + user_voted: false, + posters: [ + { + extras: null, + description: "Автор", + user_id: 201, + primary_group_id: 41, + }, + { + extras: null, + description: "Частый автор", + user_id: 300, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 85229, + primary_group_id: null, + }, + { + extras: null, + description: "Частый автор", + user_id: 186768, + primary_group_id: null, + }, + { + extras: "latest", + description: "Последний автор", + user_id: 286481, + primary_group_id: null, + }, + ], + }, + ], + }, + }) }) app.get("/my/settings/json", (req, res) => { - res.json({"PreviousUserNames":"","UserId":1,"Name":"df","UseSuperSafePrivacyMode":false,"IsSuperSafeModeEnabledForPrivacySetting":false,"UseSuperSafeChat":false,"IsAppChatSettingEnabled":true,"IsGameChatSettingEnabled":true,"IsAccountPrivacySettingsV2Enabled":true,"IsSetPasswordNotificationEnabled":false,"ChangePasswordRequiresTwoStepVerification":false,"ChangeEmailRequiresTwoStepVerification":false,"UserEmail":"","IsEmailOnFile":false,"UserEmailMasked":true,"IsEmailVerified":false,"UserEmailVerified":false,"CanHideInventory":false,"CanTrade":false,"MissingParentEmail":false,"IsUpdateEmailSectionShown":false,"IsUnder13UpdateEmailMessageSectionShown":false,"IsUserConnectedToFacebook":false,"IsTwoStepToggleEnabled":false,"AgeBracket":0,"UserAbove13":true,"ClientIpAddress":"123.123.123.123","AccountAgeInDays":0,"IsOBC":false,"IsTBC":false,"IsAnyBC":false,"IsPremium":false,"IsBcRenewalMembership":false,"BcExpireDate":"/Date(-0)/","BcRenewalPeriod":null,"BcLevel":null,"HasCurrencyOperationError":false,"CurrencyOperationErrorMessage":null,"BlockedUsersModel":{"BlockedUserIds":[],"BlockedUsers":[],"MaxBlockedUsers":50,"Total":1,"Page":1},"Tab":null,"ChangePassword":false,"IsAccountPinEnabled":false,"IsAccountRestrictionsFeatureEnabled":true,"IsAccountRestrictionsSettingEnabled":false,"IsAccountSettingsSocialNetworksV2Enabled":false,"IsUiBootstrapModalV2Enabled":true,"IsI18nBirthdayPickerInAccountSettingsEnabled":true,"InApp":false,"MyAccountSecurityModel":{"IsEmailSet":false,"IsEmailVerified":false,"IsTwoStepEnabled":false,"ShowSignOutFromAllSessions":true,"TwoStepVerificationViewModel":{"UserId":1,"IsEnabled":true,"CodeLength":0,"ValidCodeCharacters":null}},"ApiProxyDomain":"https://www.mete0r.xyz","AccountSettingsApiDomain":"https://www.mete0r.xyz","AuthDomain":"https://www.mete0r.xyz","IsDisconnectFbSocialSignOnEnabled":true,"IsDisconnectXboxEnabled":true,"NotificationSettingsDomain":"https://www.mete0r.xyz","AllowedNotificationSourceTypes":["Test","FriendRequestReceived","FriendRequestAccepted","PartyInviteReceived","PartyMemberJoined","ChatNewMessage","PrivateMessageReceived","UserAddedToPrivateServerWhiteList","ConversationUniverseChanged","TeamCreateInvite","GameUpdate","DeveloperMetricsAvailable"],"AllowedReceiverDestinationTypes":["DesktopPush","NotificationStream"],"BlacklistedNotificationSourceTypesForMobilePush":[],"MinimumChromeVersionForPushNotifications":50,"PushNotificationsEnabledOnFirefox":true,"LocaleApiDomain":"https://www.mete0r.xyz","HasValidPasswordSet":true,"IsUpdateEmailApiEndpointEnabled":true,"FastTrackMember":null,"IsFastTrackAccessible":false,"HasFreeNameChange":false,"IsAgeDownEnabled":true,"IsSendVerifyEmailApiEndpointEnabled":true,"IsPromotionChannelsEndpointEnabled":true,"ReceiveNewsletter":false,"SocialNetworksVisibilityPrivacy":6,"SocialNetworksVisibilityPrivacyValue":"AllUsers","Facebook":null,"Twitter":null,"YouTube":null,"Twitch":null}) + res.json({ + PreviousUserNames: "", + UserId: 1, + Name: "df", + UseSuperSafePrivacyMode: false, + IsSuperSafeModeEnabledForPrivacySetting: false, + UseSuperSafeChat: false, + IsAppChatSettingEnabled: true, + IsGameChatSettingEnabled: true, + IsAccountPrivacySettingsV2Enabled: true, + IsSetPasswordNotificationEnabled: false, + ChangePasswordRequiresTwoStepVerification: false, + ChangeEmailRequiresTwoStepVerification: false, + UserEmail: "", + IsEmailOnFile: false, + UserEmailMasked: true, + IsEmailVerified: false, + UserEmailVerified: false, + CanHideInventory: false, + CanTrade: false, + MissingParentEmail: false, + IsUpdateEmailSectionShown: false, + IsUnder13UpdateEmailMessageSectionShown: false, + IsUserConnectedToFacebook: false, + IsTwoStepToggleEnabled: false, + AgeBracket: 0, + UserAbove13: true, + ClientIpAddress: "123.123.123.123", + AccountAgeInDays: 0, + IsOBC: false, + IsTBC: false, + IsAnyBC: false, + IsPremium: false, + IsBcRenewalMembership: false, + BcExpireDate: "/Date(-0)/", + BcRenewalPeriod: null, + BcLevel: null, + HasCurrencyOperationError: false, + CurrencyOperationErrorMessage: null, + BlockedUsersModel: { + BlockedUserIds: [], + BlockedUsers: [], + MaxBlockedUsers: 50, + Total: 1, + Page: 1, + }, + Tab: null, + ChangePassword: false, + IsAccountPinEnabled: false, + IsAccountRestrictionsFeatureEnabled: true, + IsAccountRestrictionsSettingEnabled: false, + IsAccountSettingsSocialNetworksV2Enabled: false, + IsUiBootstrapModalV2Enabled: true, + IsI18nBirthdayPickerInAccountSettingsEnabled: true, + InApp: false, + MyAccountSecurityModel: { + IsEmailSet: false, + IsEmailVerified: false, + IsTwoStepEnabled: false, + ShowSignOutFromAllSessions: true, + TwoStepVerificationViewModel: { + UserId: 1, + IsEnabled: true, + CodeLength: 0, + ValidCodeCharacters: null, + }, + }, + ApiProxyDomain: "https://www.mete0r.xyz", + AccountSettingsApiDomain: "https://www.mete0r.xyz", + AuthDomain: "https://www.mete0r.xyz", + IsDisconnectFbSocialSignOnEnabled: true, + IsDisconnectXboxEnabled: true, + NotificationSettingsDomain: "https://www.mete0r.xyz", + AllowedNotificationSourceTypes: [ + "Test", + "FriendRequestReceived", + "FriendRequestAccepted", + "PartyInviteReceived", + "PartyMemberJoined", + "ChatNewMessage", + "PrivateMessageReceived", + "UserAddedToPrivateServerWhiteList", + "ConversationUniverseChanged", + "TeamCreateInvite", + "GameUpdate", + "DeveloperMetricsAvailable", + ], + AllowedReceiverDestinationTypes: ["DesktopPush", "NotificationStream"], + BlacklistedNotificationSourceTypesForMobilePush: [], + MinimumChromeVersionForPushNotifications: 50, + PushNotificationsEnabledOnFirefox: true, + LocaleApiDomain: "https://www.mete0r.xyz", + HasValidPasswordSet: true, + IsUpdateEmailApiEndpointEnabled: true, + FastTrackMember: null, + IsFastTrackAccessible: false, + HasFreeNameChange: false, + IsAgeDownEnabled: true, + IsSendVerifyEmailApiEndpointEnabled: true, + IsPromotionChannelsEndpointEnabled: true, + ReceiveNewsletter: false, + SocialNetworksVisibilityPrivacy: 6, + SocialNetworksVisibilityPrivacyValue: "AllUsers", + Facebook: null, + Twitter: null, + YouTube: null, + Twitch: null, + }) }) -const userinfoClient = require('./routes/userinfoclient.js'); +const userinfoClient = require("./routes/userinfoclient.js") -app.use('/',userinfoClient) +app.use("/", userinfoClient) -app.get('/metrics',async (req, res) => { - res.set('Content-Type', client.register.contentType) - res.end(await client.register.metrics()) - }) - -app.disable('etag'); - -app.get('/currency/balance',requireAuth, (req, res) => { - return res.json({ - "robux": req.userdocument.coins, - "tickets": 0 - }) +app.get("/metrics", async (req, res) => { + res.set("Content-Type", client.register.contentType) + res.end(await client.register.metrics()) }) -app.post('/device/initialize', (req, res) => { - return res.json({"browserTrackerId":1,"appDeviceIdentifier":null}) -}) -app.post('/login/v1/', (req, res) => { - return res.json({ - "userId": "12345" - }) -}) -app.get('/my/account/json', (req, res) => { - return res.json({ - AgeBracket : 0, - Email : { - IsVerified : 1, - Value : "kmulherin@roblox.com", - }, - HasPasswordSet : 1, - Username : "iMightBeLying" - }) -}) -app.get('/ab/v1/enroll', (req, res) => { - return res.json({"baller":"baller"}) +app.disable("etag") + +app.get("/currency/balance", requireAuth, (req, res) => { + return res.json({ + robux: req.userdocument.coins, + tickets: 0, + }) }) -app.get('/GetAllowedMD5Hashes', (req, res) => { - return res.json({"data":["7ede9e9841e46b0538c3b684d979f759","268b4bb9ffcc0586cc13fbbb3e4de16f"]}) +app.post("/device/initialize", (req, res) => { + return res.json({ browserTrackerId: 1, appDeviceIdentifier: null }) +}) +app.post("/login/v1/", (req, res) => { + return res.json({ + userId: "12345", + }) +}) +app.get("/my/account/json", (req, res) => { + return res.json({ + AgeBracket: 0, + Email: { + IsVerified: 1, + Value: "kmulherin@roblox.com", + }, + HasPasswordSet: 1, + Username: "iMightBeLying", + }) +}) +app.get("/ab/v1/enroll", (req, res) => { + return res.json({ baller: "baller" }) }) -app.get('/GetAllowedSecurityVersions', (req, res) => { - return res.json({"data":["0.347.0pcplayer"]}) +app.get("/GetAllowedMD5Hashes", (req, res) => { + return res.json({ + data: [ + "7ede9e9841e46b0538c3b684d979f759", + "268b4bb9ffcc0586cc13fbbb3e4de16f", + ], + }) }) -app.get('/asset-thumbnail/json', (req, res) => { - return res.json({"Url":"https://mete0r.xyz/assets/images/lol.png","Final":true,"SubstitutionType":0}) +app.get("/GetAllowedSecurityVersions", (req, res) => { + return res.json({ data: ["0.347.0pcplayer"] }) }) -app.get('/avatar-thumbnail/json', (req, res) => { - return res.json({"Url":"https://mete0r.xyz/api/thumbnailrender/?id="+req.query.userId,"Final":true,"SubstitutionType":0}) +app.get("/asset-thumbnail/json", (req, res) => { + return res.json({ + Url: "https://mete0r.xyz/assets/images/lol.png", + Final: true, + SubstitutionType: 0, + }) }) -app.get('/v1.1/avatar-fetch',async (req, res) => { // 2018 charapp - //console.log(req.headers) - const userid = req.query?.userId - const placeId = req.query?.placeId??0 - const doc = await user.findOne({userid: userid}) - const placedoc = await games.findOne({idofgame: placeId}) - if (!doc){ - return res.json({status:"error",error:"User not found."}) - } - if (!placedoc){ - return res.json({status:"error",error:"Place not found."}) - } - //console.log(doc.colors) - let json = {"resolvedAvatarType":doc.avatartype??"R6","accessoryVersionIds":[],"equippedGearVersionIds":[],"backpackGearVersionIds":[],"bodyColors":{"HeadColor":parseFloat(doc.colors.find(x => x.name === 'Head').value),"LeftArmColor":parseFloat(doc.colors.find(x => x.name === 'Left Arm').value),"LeftLegColor":parseFloat(doc.colors.find(x => x.name === 'Left Leg').value),"RightArmColor":parseFloat(doc.colors.find(x => x.name === 'Right Arm').value),"RightLegColor":parseFloat(doc.colors.find(x => x.name === 'Right Leg').value),"TorsoColor":parseFloat(doc.colors.find(x => x.name === 'Torso').value)},"animations":{},"scales":{"Width":1.0000,"Height":1.0000,"Head":1.0000,"Depth":1.00,"Proportion":0.0000,"BodyType":0.0000}} - if (!doc.inventory){ - return res.json(json) - } - for (var key of doc.inventory) { - if (key.Equipped === true){ - if (placedoc.gearallowed??false === true){ - json.accessoryVersionIds.push(parseFloat(key.ItemId)) - }else{ - if (key.Type != "Gears"){ - json.accessoryVersionIds.push(parseFloat(key.ItemId)) - } - } - } - } - //console.log(json.accessoryVersionIds) - return res.json(json) +app.get("/avatar-thumbnail/json", (req, res) => { + return res.json({ + Url: "https://mete0r.xyz/api/thumbnailrender/?id=" + req.query.userId, + Final: true, + SubstitutionType: 0, + }) }) -app.get('/v1/avatar-fetch',async (req, res) => { // 2020 charapp - //console.log(req.headers) - const userid = req.query?.userId - const placeId = req.query?.placeId??0 - const doc = await user.findOne({userid: userid}) - const placedoc = await games.findOne({idofgame: placeId}) - if (!doc){ - return res.json({status:"error",error:"User not found."}) - } - if (!placedoc){ - return res.json({status:"error",error:"Place not found."}) - } - if (req.headers?.['roblox-game-id'] === "render"){ - // 2020 render needs v1.1 colors - let json = {"resolvedAvatarType":doc.avatartype??"R6","accessoryVersionIds":[],"equippedGearVersionIds":[],"backpackGearVersionIds":[],"bodyColors":{"HeadColor":parseFloat(doc.colors.find(x => x.name === 'Head').value),"LeftArmColor":parseFloat(doc.colors.find(x => x.name === 'Left Arm').value),"LeftLegColor":parseFloat(doc.colors.find(x => x.name === 'Left Leg').value),"RightArmColor":parseFloat(doc.colors.find(x => x.name === 'Right Arm').value),"RightLegColor":parseFloat(doc.colors.find(x => x.name === 'Right Leg').value),"TorsoColor":parseFloat(doc.colors.find(x => x.name === 'Torso').value)},"animations":{},"scales":{"Width":1.0000,"Height":1.0000,"Head":1.0000,"Depth":1.00,"Proportion":0.0000,"BodyType":0.0000}} - if (!doc.inventory){ - return res.json(json) - } - for (var key of doc.inventory) { - if (key.Equipped === true){ - json.accessoryVersionIds.push(parseFloat(key.ItemId)) - } - } - //console.log(json.accessoryVersionIds) - return res.json(json) - } - //console.log(doc.colors) - let json = {"resolvedAvatarType":doc.avatartype??"R6","assetAndAssetTypeIds":[],"equippedGearVersionIds":[],"backpackGearVersionIds":[],"bodyColors":{"headColorId":parseFloat(doc.colors.find(x => x.name === 'Head').value),"leftArmColorId":parseFloat(doc.colors.find(x => x.name === 'Left Arm').value),"leftLegColorId":parseFloat(doc.colors.find(x => x.name === 'Left Leg').value),"rightArmColorId":parseFloat(doc.colors.find(x => x.name === 'Right Arm').value),"rightLegColorId":parseFloat(doc.colors.find(x => x.name === 'Right Leg').value),"torsoColorId":parseFloat(doc.colors.find(x => x.name === 'Torso').value)},"animations":{},"scales":{"Width":1.0000,"Height":1.0000,"Head":1.0000,"Depth":1.00,"Proportion":0.0000,"BodyType":0.0000}, "emotes":[]} - if (!doc.inventory){ - return res.json(json) - } - let currentEmotePosition = 1 - for (var key of doc.inventory) { - if (key.Equipped === true){ - - if (key.Type === "Emotes" && currentEmotePosition <= 8){ - json.emotes.push({"assetId":parseFloat(key.ItemId),"assetName":key.ItemName,"position": currentEmotePosition}) - currentEmotePosition += 1 - } - let gearallowed = placedoc.gearallowed??false - - if ((gearallowed === true) && key.Type != "Emotes"){ - json.assetAndAssetTypeIds.push({"assetId":parseFloat(key.ItemId),"assetTypeId":8}) - }else if ((gearallowed === false) && key.Type != "Emotes"){ - if (key.Type != "Gears"){ - json.assetAndAssetTypeIds.push({"assetId":parseFloat(key.ItemId),"assetTypeId":8}) - } - } - } - } - //console.log(json.accessoryVersionIds) - return res.json(json) +app.get("/v1.1/avatar-fetch", async (req, res) => { + // 2018 charapp + //console.log(req.headers) + const userid = req.query?.userId + const placeId = req.query?.placeId ?? 0 + const doc = await user.findOne({ userid: userid }) + const placedoc = await games.findOne({ idofgame: placeId }) + if (!doc) { + return res.json({ status: "error", error: "User not found." }) + } + if (!placedoc) { + return res.json({ status: "error", error: "Place not found." }) + } + //console.log(doc.colors) + let json = { + resolvedAvatarType: doc.avatartype ?? "R6", + accessoryVersionIds: [], + equippedGearVersionIds: [], + backpackGearVersionIds: [], + bodyColors: { + HeadColor: parseFloat( + doc.colors.find(x => x.name === "Head").value, + ), + LeftArmColor: parseFloat( + doc.colors.find(x => x.name === "Left Arm").value, + ), + LeftLegColor: parseFloat( + doc.colors.find(x => x.name === "Left Leg").value, + ), + RightArmColor: parseFloat( + doc.colors.find(x => x.name === "Right Arm").value, + ), + RightLegColor: parseFloat( + doc.colors.find(x => x.name === "Right Leg").value, + ), + TorsoColor: parseFloat( + doc.colors.find(x => x.name === "Torso").value, + ), + }, + animations: {}, + scales: { + Width: 1.0, + Height: 1.0, + Head: 1.0, + Depth: 1.0, + Proportion: 0.0, + BodyType: 0.0, + }, + } + if (!doc.inventory) { + return res.json(json) + } + for (var key of doc.inventory) { + if (key.Equipped === true) { + if (placedoc.gearallowed ?? false === true) { + json.accessoryVersionIds.push(parseFloat(key.ItemId)) + } else { + if (key.Type != "Gears") { + json.accessoryVersionIds.push(parseFloat(key.ItemId)) + } + } + } + } + //console.log(json.accessoryVersionIds) + return res.json(json) }) -app.get('/v2/users/:id/groups/roles',async (req, res) => { // 2020 admin badge - - const userid = req.params?.id - const doc = await user.findOne({userid: userid}) - if (!doc){ - return res.json({status:"error",error:"User not found."}) - } - if (doc.admin === true){ - return res.json({ - "data": [ - { - "group": { - "id": 1200769, - "name": "Official Group of Roblox", - "memberCount": 1976, - "hasVerifiedBadge": false - }, - "role": { - "id": 41221804, - "name": "Team Member", - "rank": 20 - } - } - ] - }) - } - return res.json({ - "data": [] - }) - - +app.get("/v1/avatar-fetch", async (req, res) => { + // 2020 charapp + //console.log(req.headers) + const userid = req.query?.userId + const placeId = req.query?.placeId ?? 0 + const doc = await user.findOne({ userid: userid }) + const placedoc = await games.findOne({ idofgame: placeId }) + if (!doc) { + return res.json({ status: "error", error: "User not found." }) + } + if (!placedoc) { + return res.json({ status: "error", error: "Place not found." }) + } + if (req.headers?.["roblox-game-id"] === "render") { + // 2020 render needs v1.1 colors + let json = { + resolvedAvatarType: doc.avatartype ?? "R6", + accessoryVersionIds: [], + equippedGearVersionIds: [], + backpackGearVersionIds: [], + bodyColors: { + HeadColor: parseFloat( + doc.colors.find(x => x.name === "Head").value, + ), + LeftArmColor: parseFloat( + doc.colors.find(x => x.name === "Left Arm").value, + ), + LeftLegColor: parseFloat( + doc.colors.find(x => x.name === "Left Leg").value, + ), + RightArmColor: parseFloat( + doc.colors.find(x => x.name === "Right Arm").value, + ), + RightLegColor: parseFloat( + doc.colors.find(x => x.name === "Right Leg").value, + ), + TorsoColor: parseFloat( + doc.colors.find(x => x.name === "Torso").value, + ), + }, + animations: {}, + scales: { + Width: 1.0, + Height: 1.0, + Head: 1.0, + Depth: 1.0, + Proportion: 0.0, + BodyType: 0.0, + }, + } + if (!doc.inventory) { + return res.json(json) + } + for (var key of doc.inventory) { + if (key.Equipped === true) { + json.accessoryVersionIds.push(parseFloat(key.ItemId)) + } + } + //console.log(json.accessoryVersionIds) + return res.json(json) + } + //console.log(doc.colors) + let json = { + resolvedAvatarType: doc.avatartype ?? "R6", + assetAndAssetTypeIds: [], + equippedGearVersionIds: [], + backpackGearVersionIds: [], + bodyColors: { + headColorId: parseFloat( + doc.colors.find(x => x.name === "Head").value, + ), + leftArmColorId: parseFloat( + doc.colors.find(x => x.name === "Left Arm").value, + ), + leftLegColorId: parseFloat( + doc.colors.find(x => x.name === "Left Leg").value, + ), + rightArmColorId: parseFloat( + doc.colors.find(x => x.name === "Right Arm").value, + ), + rightLegColorId: parseFloat( + doc.colors.find(x => x.name === "Right Leg").value, + ), + torsoColorId: parseFloat( + doc.colors.find(x => x.name === "Torso").value, + ), + }, + animations: {}, + scales: { + Width: 1.0, + Height: 1.0, + Head: 1.0, + Depth: 1.0, + Proportion: 0.0, + BodyType: 0.0, + }, + emotes: [], + } + if (!doc.inventory) { + return res.json(json) + } + let currentEmotePosition = 1 + for (var key of doc.inventory) { + if (key.Equipped === true) { + if (key.Type === "Emotes" && currentEmotePosition <= 8) { + json.emotes.push({ + assetId: parseFloat(key.ItemId), + assetName: key.ItemName, + position: currentEmotePosition, + }) + currentEmotePosition += 1 + } + let gearallowed = placedoc.gearallowed ?? false + if (gearallowed === true && key.Type != "Emotes") { + json.assetAndAssetTypeIds.push({ + assetId: parseFloat(key.ItemId), + assetTypeId: 8, + }) + } else if (gearallowed === false && key.Type != "Emotes") { + if (key.Type != "Gears") { + json.assetAndAssetTypeIds.push({ + assetId: parseFloat(key.ItemId), + assetTypeId: 8, + }) + } + } + } + } + //console.log(json.accessoryVersionIds) + return res.json(json) }) -app.all('/v1.1/game-start-info/',async (req, res) => { // 2020 game settings - const placeid = req.query.universeId??0 - const doc = await games.findOne({idofgame: placeid}) - if (!doc){ - return res.json({status:"error",error:"Game not found."}) - } - const json = {"gameAvatarType":"PlayerChoice","allowCustomAnimations":"True","universeAvatarCollisionType":"OuterBox","universeAvatarBodyType":"Standard","jointPositioningType":"ArtistIntent","message":"","universeAvatarMinScales":{"height":0.90,"width":0.70,"head":0.95,"depth":0.0,"proportion":0.00,"bodyType":0.00},"universeAvatarMaxScales":{"height":1.05,"width":1.00,"head":1.00,"depth":0.0,"proportion":0.00,"bodyType":0.00},"universeAvatarAssetOverrides":[],"moderationStatus":null} +app.get("/v2/users/:id/groups/roles", async (req, res) => { + // 2020 admin badge - json.gameAvatarType = doc.avatartype??"PlayerChoice" - if (doc.avatartype){ - json.gameAvatarType = "MorphTo"+json.gameAvatarType - } - return res.json(json) + const userid = req.params?.id + const doc = await user.findOne({ userid: userid }) + if (!doc) { + return res.json({ status: "error", error: "User not found." }) + } + if (doc.admin === true) { + return res.json({ + data: [ + { + group: { + id: 1200769, + name: "Official Group of Roblox", + memberCount: 1976, + hasVerifiedBadge: false, + }, + role: { + id: 41221804, + name: "Team Member", + rank: 20, + }, + }, + ], + }) + } + return res.json({ + data: [], + }) }) -app.all(['//moderation/v2/filtertext','/moderation/v2/filtertext'], (req, res) => { - const filtered = [ - 'faggot', - 'nigger', - 'nigga', - 'sex' - ] - let filteredtext = req.body?.text - if (filtered.includes(filteredtext) === true || filtered.some(substr => filteredtext.toLowerCase().startsWith(substr.toLowerCase())) === true){ - //filteredtext = '#'.repeat(req.body?.text?.length) - //filteredtext = filteredtext.replaceAll(filtered,"#") - let regex - for (var i = 0; i < filtered.length; i++) { - regex = new RegExp(filtered[i], "g"); - filteredtext = filteredtext.replace(regex, "#".repeat(filtered[i].length)); - } - } - //console.log(req.body) - return res.json({ - "data": { - "AgeUnder13": filteredtext, - "Age13OrOver": filteredtext - }, - "success": true - }) +app.all("/v1.1/game-start-info/", async (req, res) => { + // 2020 game settings + const placeid = req.query.universeId ?? 0 + const doc = await games.findOne({ idofgame: placeid }) + if (!doc) { + return res.json({ status: "error", error: "Game not found." }) + } + const json = { + gameAvatarType: "PlayerChoice", + allowCustomAnimations: "True", + universeAvatarCollisionType: "OuterBox", + universeAvatarBodyType: "Standard", + jointPositioningType: "ArtistIntent", + message: "", + universeAvatarMinScales: { + height: 0.9, + width: 0.7, + head: 0.95, + depth: 0.0, + proportion: 0.0, + bodyType: 0.0, + }, + universeAvatarMaxScales: { + height: 1.05, + width: 1.0, + head: 1.0, + depth: 0.0, + proportion: 0.0, + bodyType: 0.0, + }, + universeAvatarAssetOverrides: [], + moderationStatus: null, + } + + json.gameAvatarType = doc.avatartype ?? "PlayerChoice" + if (doc.avatartype) { + json.gameAvatarType = "MorphTo" + json.gameAvatarType + } + return res.json(json) }) +app.all( + ["//moderation/v2/filtertext", "/moderation/v2/filtertext"], + (req, res) => { + const filtered = ["faggot", "nigger", "nigga", "sex"] + let filteredtext = req.body?.text + if ( + filtered.includes(filteredtext) === true || + filtered.some(substr => + filteredtext.toLowerCase().startsWith(substr.toLowerCase()), + ) === true + ) { + //filteredtext = '#'.repeat(req.body?.text?.length) + //filteredtext = filteredtext.replaceAll(filtered,"#") + let regex + for (var i = 0; i < filtered.length; i++) { + regex = new RegExp(filtered[i], "g") + filteredtext = filteredtext.replace( + regex, + "#".repeat(filtered[i].length), + ) + } + } + //console.log(req.body) + return res.json({ + data: { + AgeUnder13: filteredtext, + Age13OrOver: filteredtext, + }, + success: true, + }) + }, +) + app.post("/v2/login", (req, res) => { - //console.log(req.body) - return res.json({ - "user": { - "id": 1, - "name": "bruh" - }, - "isBanned": false - }) + //console.log(req.body) + return res.json({ + user: { + id: 1, + name: "bruh", + }, + isBanned: false, + }) }) -app.all('/v1/login', (req, res) => { - //console.log(req.body) - res.cookie('.ROBLOSECURITY','_|WARNING:-DO-NOT-SHARE-THIS.--Sharing-this-will-allow-someone-to-log-in-as-you-and-to-steal-your-ROBUX-and-items.|_DGJJD464646464dfgdgdgdCUdgjneth4iht4ih64uh4uihy4y4yuhi4yhuiyhui4yhui4uihy4huiyhu4iyhuihu4hhdghdgihdigdhuigdhuigidhugihugdgidojgijodijogdijogdjoigdjoidijogijodgijdgiojdgijodgijoF') - res.cookie('.RBXID','_|WARNING:-DO-NOT-SHARE-THIS.--Sharing-this-will-allow-someone-to-log-in-as-you-and-to-steal-your-ROBUX-and-items.|_eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI2NDA3MGQyNC0zYWR4LTQ5NzMtODAxYy0yOWNhNzUyNTA5NjIiLCJzdWfdijogdoijdijogijodcB6YExhM') - return res.json({ "user":{ "id":1, "name":"Shit", "displayName":"Shitter" } }) +app.all("/v1/login", (req, res) => { + //console.log(req.body) + res.cookie( + ".ROBLOSECURITY", + "_|WARNING:-DO-NOT-SHARE-THIS.--Sharing-this-will-allow-someone-to-log-in-as-you-and-to-steal-your-ROBUX-and-items.|_DGJJD464646464dfgdgdgdCUdgjneth4iht4ih64uh4uihy4y4yuhi4yhuiyhui4yhui4uihy4huiyhu4iyhuihu4hhdghdgihdigdhuigdhuigidhugihugdgidojgijodijogdijogdjoigdjoidijogijodgijdgiojdgijodgijoF", + ) + res.cookie( + ".RBXID", + "_|WARNING:-DO-NOT-SHARE-THIS.--Sharing-this-will-allow-someone-to-log-in-as-you-and-to-steal-your-ROBUX-and-items.|_eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI2NDA3MGQyNC0zYWR4LTQ5NzMtODAxYy0yOWNhNzUyNTA5NjIiLCJzdWfdijogdoijdijogijodcB6YExhM", + ) + return res.json({ user: { id: 1, name: "Shit", displayName: "Shitter" } }) }) -app.get('/initialize',async (req, res) => { - var ip = req.headers['cf-connecting-ip'] || req.socket.remoteAddress - ip = ip.toString() - await ipWhiteListRepository.save(ip, { - ip: ip - }) - //await ipWhiteListRepository.expire(ip, 24 * 60 * 60 * 7 * 4) - return res.redirect("/") +app.get("/initialize", async (req, res) => { + var ip = req.headers["cf-connecting-ip"] || req.socket.remoteAddress + ip = ip.toString() + await ipWhiteListRepository.save(ip, { + ip: ip, + }) + //await ipWhiteListRepository.expire(ip, 24 * 60 * 60 * 7 * 4) + return res.redirect("/") }) -app.get('/Usapi/:id', async (req,res) => { - const userid = req.params?.id - const doc = await user.findOne({userid: userid}) - if (!doc){ - return res.json({status:"error",error:"User not found."}) - } - - return res.json({"Id":doc.userid,"Username":doc.username,"AvatarUri":null,"AvatarFinal":false,"IsOnline":false}) +app.get("/Usapi/:id", async (req, res) => { + const userid = req.params?.id + const doc = await user.findOne({ userid: userid }) + if (!doc) { + return res.json({ status: "error", error: "User not found." }) + } + + return res.json({ + Id: doc.userid, + Username: doc.username, + AvatarUri: null, + AvatarFinal: false, + IsOnline: false, + }) }) // TODO remove this -app.get('/assets/ugc/*', async (req,res) => { - return res.status(404).end() +app.get("/assets/ugc/*", async (req, res) => { + return res.status(404).end() }) // protect this route -app.use('/assets', express.static('assets')) +app.use("/assets", express.static("assets")) app.use(handler) -console.log('here') -if (PROD === "true"){ - app.listen(9000,'localhost') -}else{ - app.listen(80) // don't forget to change to 9000 for production - const localPrivateKeyPath = process.env.PRIVATEKEYLOCAL - const localCertificatePath = process.env.LOCALCERTIFICATEPATH - var privateKey = require('fs').readFileSync( localPrivateKeyPath ); - var certificate = require('fs').readFileSync( localCertificatePath ); - https.createServer({ - key: privateKey, - cert: certificate - }, app).listen(443); // remove this for prod +console.log("here") +if (PROD === "true") { + app.listen(9000, "localhost") +} else { + app.listen(80) // don't forget to change to 9000 for production + const localPrivateKeyPath = process.env.PRIVATEKEYLOCAL + const localCertificatePath = process.env.LOCALCERTIFICATEPATH + var privateKey = require("fs").readFileSync(localPrivateKeyPath) + var certificate = require("fs").readFileSync(localCertificatePath) + https + .createServer( + { + key: privateKey, + cert: certificate, + }, + app, + ) + .listen(443) // remove this for prod } const f = { - "Mode":"Thumbnail", - "Settings": { - "Type":"Avatar_R15_Action", - "PlaceId":1818, - "UserId":0, - "BaseUrl":"mete0r.xyz", - "MatchmakingContextId":1, - "Arguments": ["https://www.mete0r.xyz","https://api.mete0r.xyz/v1.1/avatar-fetch?userId=0","PNG",420,420] - }, - "Arguments":{ - "PrefferedPort":53640, - "MachineAddress":"localhost" - } - } \ No newline at end of file + Mode: "Thumbnail", + Settings: { + Type: "Avatar_R15_Action", + PlaceId: 1818, + UserId: 0, + BaseUrl: "mete0r.xyz", + MatchmakingContextId: 1, + Arguments: [ + "https://www.mete0r.xyz", + "https://api.mete0r.xyz/v1.1/avatar-fetch?userId=0", + "PNG", + 420, + 420, + ], + }, + Arguments: { + PrefferedPort: 53640, + MachineAddress: "localhost", + }, +} diff --git a/Back/thumbnailrcctalk.js b/Back/thumbnailrcctalk.js index 9e4a8f3..5331019 100644 --- a/Back/thumbnailrcctalk.js +++ b/Back/thumbnailrcctalk.js @@ -1,319 +1,372 @@ -const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args)); -let controller = new AbortController(); -require('dotenv').config() +const fetch = (...args) => + import("node-fetch").then(({ default: fetch }) => fetch(...args)) +let controller = new AbortController() +require("dotenv").config() const RCC_HOST = process.env.RCC_HOST - const url = 'http://'+RCC_HOST+':64990'; // change this to rcc soap -var convert = require('xml-js'); +const url = "http://" + RCC_HOST + ":64990" // change this to rcc soap +var convert = require("xml-js") const sampleHeaders = { - 'Content-Type': 'text/xml;charset=UTF-8', -}; - - - -async function OpenJob(jobid,script,expiration){ - return new Promise(async (resolve, reject) => { - // this is all boilerplate because soap sucks -var xml = { - _declaration: { _attributes: { version: '1.0', encoding: 'UTF-8' } }, - 'SOAP-ENV:Envelope': { - _attributes: { - 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', - 'xmlns:ns1': 'http://roblox.com/' - }, - 'SOAP-ENV:Body': { - 'ns1:OpenJobEx': { - 'ns1:job': { - 'ns1:id': { _text: 'StringTest11' }, - 'ns1:expirationInSeconds': { _text: '10' }, - 'ns1:category': { _text: '0' }, - 'ns1:cores': { _text: '1' } - }, - 'ns1:script': { - 'ns1:name': { _text: 'StringTest11-Script' }, - 'ns1:script': { - _text: 'print("Recieved job with ID " .. game.JobId)\r\n' - }, - 'ns1:arguments': {} - } - } - } - } - } -xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:OpenJobEx']['ns1:job']['ns1:id']._text = jobid -xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:OpenJobEx']['ns1:job']['ns1:expirationInSeconds']._text = expiration -if (!expiration) { - xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:OpenJobEx']['ns1:job']['ns1:expirationInSeconds']._text = "60" -} -xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:OpenJobEx']['ns1:script']['ns1:script']._text = script -const body = convert.js2xml(xml, { compact: true, spaces: 4 }) - - try { - const result = await fetch(url, { method: 'POST', body }) - const data = await result.text() - const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) - return resolve( - convertedData - ) - } catch (error) { - return reject(error) - } - }) + "Content-Type": "text/xml;charset=UTF-8", } +async function OpenJob(jobid, script, expiration) { + return new Promise(async (resolve, reject) => { + // this is all boilerplate because soap sucks + var xml = { + _declaration: { + _attributes: { version: "1.0", encoding: "UTF-8" }, + }, + "SOAP-ENV:Envelope": { + _attributes: { + "xmlns:SOAP-ENV": + "http://schemas.xmlsoap.org/soap/envelope/", + "xmlns:ns1": "http://roblox.com/", + }, + "SOAP-ENV:Body": { + "ns1:OpenJobEx": { + "ns1:job": { + "ns1:id": { _text: "StringTest11" }, + "ns1:expirationInSeconds": { _text: "10" }, + "ns1:category": { _text: "0" }, + "ns1:cores": { _text: "1" }, + }, + "ns1:script": { + "ns1:name": { _text: "StringTest11-Script" }, + "ns1:script": { + _text: 'print("Recieved job with ID " .. game.JobId)\r\n', + }, + "ns1:arguments": {}, + }, + }, + }, + }, + } + xml["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:OpenJobEx"]["ns1:job"][ + "ns1:id" + ]._text = jobid + xml["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:OpenJobEx"]["ns1:job"][ + "ns1:expirationInSeconds" + ]._text = expiration + if (!expiration) { + xml["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:OpenJobEx"][ + "ns1:job" + ]["ns1:expirationInSeconds"]._text = "60" + } + xml["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:OpenJobEx"][ + "ns1:script" + ]["ns1:script"]._text = script + const body = convert.js2xml(xml, { compact: true, spaces: 4 }) + try { + const result = await fetch(url, { method: "POST", body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { + compact: true, + spaces: 4, + }) + return resolve(convertedData) + } catch (error) { + return reject(error) + } + }) +} async function GetAllJobs() { - return new Promise(async (resolve, reject) => { - const xmlData = (xml = { - _declaration: { - _attributes: { version: '1.0', encoding: 'UTF - 8' }, - }, - 'SOAP-ENV:Envelope': { - _attributes: { - 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', - 'xmlns:SOAP-ENC': 'http://schemas.xmlsoap.org/soap/encoding/', - 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance', - 'xmlns:xsd': 'http://www.w3.org/2001/XMLSchema', - 'xmlns:ns2': 'http://roblox.com/RCCServiceSoap', - 'xmlns:ns1': 'http://roblox.com/', - 'xmlns:ns3': 'http://roblox.com/RCCServiceSoap12', - }, - 'SOAP-ENV:Body': { 'ns1:GetAllJobsEx': {} }, - }, - }) - - const body = convert.js2xml(xmlData, { compact: true, spaces: 4 }) - - try { - const result = await fetch(url, { method: 'POST', body }) - const data = await result.text() - const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) - return resolve( - convertedData['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:GetAllJobsExResponse']['ns1:GetAllJobsExResult'] - ) - } catch (error) { - return reject(error) - } - }) + return new Promise(async (resolve, reject) => { + const xmlData = (xml = { + _declaration: { + _attributes: { version: "1.0", encoding: "UTF - 8" }, + }, + "SOAP-ENV:Envelope": { + _attributes: { + "xmlns:SOAP-ENV": + "http://schemas.xmlsoap.org/soap/envelope/", + "xmlns:SOAP-ENC": + "http://schemas.xmlsoap.org/soap/encoding/", + "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", + "xmlns:xsd": "http://www.w3.org/2001/XMLSchema", + "xmlns:ns2": "http://roblox.com/RCCServiceSoap", + "xmlns:ns1": "http://roblox.com/", + "xmlns:ns3": "http://roblox.com/RCCServiceSoap12", + }, + "SOAP-ENV:Body": { "ns1:GetAllJobsEx": {} }, + }, + }) + + const body = convert.js2xml(xmlData, { compact: true, spaces: 4 }) + + try { + const result = await fetch(url, { method: "POST", body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { + compact: true, + spaces: 4, + }) + return resolve( + convertedData["SOAP-ENV:Envelope"]["SOAP-ENV:Body"][ + "ns1:GetAllJobsExResponse" + ]["ns1:GetAllJobsExResult"], + ) + } catch (error) { + return reject(error) + } + }) } -async function Execute(jobid,script) { - return new Promise(async (resolve, reject) => { - var xml = { - _declaration: { _attributes: { version: '1.0', encoding: 'UTF - 8' } }, - 'SOAP-ENV:Envelope': { - _attributes: { - 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', - 'xmlns:SOAP-ENC': 'http://schemas.xmlsoap.org/soap/encoding/', - 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance', - 'xmlns:xsd': 'http://www.w3.org/2001/XMLSchema', - 'xmlns:ns2': 'http://roblox.com/RCCServiceSoap', - 'xmlns:ns1': 'http://roblox.com/', - 'xmlns:ns3': 'http://roblox.com/RCCServiceSoap12' - }, - 'SOAP-ENV:Body': { - 'ns1:ExecuteEx': { - 'ns1:jobID': { _text: 'Test' }, - 'ns1:script': { - 'ns1:name': { _text: 'Script' }, - 'ns1:script': { _text: 'print("no")' }, - 'ns1:arguments': { _text: '' } - } - } - } - } - } -xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:ExecuteEx']['ns1:jobID']._text = jobid -xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:ExecuteEx']['ns1:script']['ns1:script']._text = script - const body = convert.js2xml(xml, { compact: true, spaces: 4 }) - - try { - const result = await fetch(url, { method: 'POST', body }) - const data = await result.text() - const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) - return resolve( - convertedData - ) - } catch (error) { - return reject(error) - } - }) +async function Execute(jobid, script) { + return new Promise(async (resolve, reject) => { + var xml = { + _declaration: { + _attributes: { version: "1.0", encoding: "UTF - 8" }, + }, + "SOAP-ENV:Envelope": { + _attributes: { + "xmlns:SOAP-ENV": + "http://schemas.xmlsoap.org/soap/envelope/", + "xmlns:SOAP-ENC": + "http://schemas.xmlsoap.org/soap/encoding/", + "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", + "xmlns:xsd": "http://www.w3.org/2001/XMLSchema", + "xmlns:ns2": "http://roblox.com/RCCServiceSoap", + "xmlns:ns1": "http://roblox.com/", + "xmlns:ns3": "http://roblox.com/RCCServiceSoap12", + }, + "SOAP-ENV:Body": { + "ns1:ExecuteEx": { + "ns1:jobID": { _text: "Test" }, + "ns1:script": { + "ns1:name": { _text: "Script" }, + "ns1:script": { _text: 'print("no")' }, + "ns1:arguments": { _text: "" }, + }, + }, + }, + }, + } + xml["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:ExecuteEx"][ + "ns1:jobID" + ]._text = jobid + xml["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:ExecuteEx"][ + "ns1:script" + ]["ns1:script"]._text = script + const body = convert.js2xml(xml, { compact: true, spaces: 4 }) + try { + const result = await fetch(url, { method: "POST", body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { + compact: true, + spaces: 4, + }) + return resolve(convertedData) + } catch (error) { + return reject(error) + } + }) } async function CloseJob(jobid) { - return new Promise(async (resolve, reject) => { - var xml = { - _declaration: { _attributes: { version: '1.0', encoding: 'UTF - 8' } }, - 'SOAP-ENV:Envelope': { - _attributes: { - 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', - 'xmlns:SOAP-ENC': 'http://schemas.xmlsoap.org/soap/encoding/', - 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance', - 'xmlns:xsd': 'http://www.w3.org/2001/XMLSchema', - 'xmlns:ns2': 'http://roblox.com/RCCServiceSoap', - 'xmlns:ns1': 'http://roblox.com/', - 'xmlns:ns3': 'http://roblox.com/RCCServiceSoap12' - }, - 'SOAP-ENV:Body': { - 'ns1:CloseJob': { - 'ns1:jobID': { _text: 'Test' } - } - } - } - } - xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:CloseJob']['ns1:jobID']._text = jobid - const body = convert.js2xml(xml, { compact: true, spaces: 4 }) - - try { - const result = await fetch(url, { method: 'POST', body }) - const data = await result.text() - const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) - return resolve( - convertedData - ) - } catch (error) { - return reject(error) - } - }) + return new Promise(async (resolve, reject) => { + var xml = { + _declaration: { + _attributes: { version: "1.0", encoding: "UTF - 8" }, + }, + "SOAP-ENV:Envelope": { + _attributes: { + "xmlns:SOAP-ENV": + "http://schemas.xmlsoap.org/soap/envelope/", + "xmlns:SOAP-ENC": + "http://schemas.xmlsoap.org/soap/encoding/", + "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", + "xmlns:xsd": "http://www.w3.org/2001/XMLSchema", + "xmlns:ns2": "http://roblox.com/RCCServiceSoap", + "xmlns:ns1": "http://roblox.com/", + "xmlns:ns3": "http://roblox.com/RCCServiceSoap12", + }, + "SOAP-ENV:Body": { + "ns1:CloseJob": { + "ns1:jobID": { _text: "Test" }, + }, + }, + }, + } + xml["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:CloseJob"][ + "ns1:jobID" + ]._text = jobid + const body = convert.js2xml(xml, { compact: true, spaces: 4 }) + + try { + const result = await fetch(url, { method: "POST", body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { + compact: true, + spaces: 4, + }) + return resolve(convertedData) + } catch (error) { + return reject(error) + } + }) } +async function RenewLease(jobid, expiration) { + return new Promise(async (resolve, reject) => { + var xml = { + _declaration: { + _attributes: { version: "1.0", encoding: "UTF-8" }, + }, + "SOAP-ENV:Envelope": { + _attributes: { + "xmlns:SOAP-ENV": + "http://schemas.xmlsoap.org/soap/envelope/", + "xmlns:ns1": "http://roblox.com/", + "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", + }, + "SOAP-ENV:Body": { + "ns1:RenewLease": { + "ns1:jobID": { + _attributes: { "xsi:type": "ns1:Job" }, + "ns1:id": { _text: "StringTest11" }, + "ns1:expirationInSeconds": { _text: "10" }, + "ns1:category": { _text: "0" }, + "ns1:cores": { _text: "1" }, + }, + "ns1:expirationInSeconds": { _text: "100" }, + }, + }, + }, + } + xml["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:RenewLease"][ + "ns1:jobID" + ]["ns1:id"]._text = jobid + xml["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:RenewLease"][ + "ns1:expirationInSeconds" + ]._text = expiration + const body = convert.js2xml(xml, { compact: true, spaces: 4 }) -async function RenewLease(jobid,expiration) { - return new Promise(async (resolve, reject) => { - var xml = { - _declaration: { _attributes: { version: '1.0', encoding: 'UTF-8' } }, - 'SOAP-ENV:Envelope': { - _attributes: { - 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', - 'xmlns:ns1': 'http://roblox.com/', - 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance' - }, - 'SOAP-ENV:Body': { - 'ns1:RenewLease': { - 'ns1:jobID': { - _attributes: { 'xsi:type': 'ns1:Job' }, - 'ns1:id': { _text: 'StringTest11' }, - 'ns1:expirationInSeconds': { _text: '10' }, - 'ns1:category': { _text: '0' }, - 'ns1:cores': { _text: '1' } - }, - 'ns1:expirationInSeconds': { _text: '100' } - } - } - } - } - xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:RenewLease']['ns1:jobID']['ns1:id']._text = jobid - xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:RenewLease']['ns1:expirationInSeconds']._text = expiration - const body = convert.js2xml(xml, { compact: true, spaces: 4 }) - - try { - const result = await fetch(url, { method: 'POST', body }) - const data = await result.text() - const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) - return resolve( - convertedData - ) - } catch (error) { - return reject(error) - } - }) + try { + const result = await fetch(url, { method: "POST", body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { + compact: true, + spaces: 4, + }) + return resolve(convertedData) + } catch (error) { + return reject(error) + } + }) } -async function GetExpiration(jobid){ - return new Promise(async (resolve, reject) => { - var xml = { - _declaration: { _attributes: { version: '1.0', encoding: 'UTF-8' } }, - 'SOAP-ENV:Envelope': { - _attributes: { - 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', - 'xmlns:ns1': 'http://roblox.com/' - }, - 'SOAP-ENV:Body': { 'ns1:GetExpiration': { 'ns1:jobID': { _text: 'Test' } } } - } - } - xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:GetExpiration']['ns1:jobID']._text = jobid - const body = convert.js2xml(xml, { compact: true, spaces: 4 }) - - try { - const result = await fetch(url, { method: 'POST', body }) - const data = await result.text() - const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) - return resolve( - convertedData - ) - } catch (error) { - return reject(error) - } - }) +async function GetExpiration(jobid) { + return new Promise(async (resolve, reject) => { + var xml = { + _declaration: { + _attributes: { version: "1.0", encoding: "UTF-8" }, + }, + "SOAP-ENV:Envelope": { + _attributes: { + "xmlns:SOAP-ENV": + "http://schemas.xmlsoap.org/soap/envelope/", + "xmlns:ns1": "http://roblox.com/", + }, + "SOAP-ENV:Body": { + "ns1:GetExpiration": { "ns1:jobID": { _text: "Test" } }, + }, + }, + } + xml["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:GetExpiration"][ + "ns1:jobID" + ]._text = jobid + const body = convert.js2xml(xml, { compact: true, spaces: 4 }) + + try { + const result = await fetch(url, { method: "POST", body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { + compact: true, + spaces: 4, + }) + return resolve(convertedData) + } catch (error) { + return reject(error) + } + }) } //var gameservertxt = fs.readFileSync('actualgameserver.txt','utf-8') //gameservertxt = gameservertxt.replace('function start(placeId, port, url)','function start(1111, port)') -async function CloseExpiredJobs(){ - return new Promise(async (resolve, reject) => { - var xml = xml = { - _declaration: { _attributes: { version: '1.0', encoding: 'UTF-8' } }, - 'SOAP-ENV:Envelope': { - _attributes: { - 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', - 'xmlns:ns1': 'http://roblox.com/' - }, - 'SOAP-ENV:Body': { 'ns1:CloseExpiredJobs': {} } - } - } - - const body = convert.js2xml(xml, { compact: true, spaces: 4 }) - - try { - const result = await fetch(url, { method: 'POST', body }) - const data = await result.text() - const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) - return resolve( - convertedData - ) - } catch (error) { - return reject(error) - } - }) +async function CloseExpiredJobs() { + return new Promise(async (resolve, reject) => { + var xml = (xml = { + _declaration: { + _attributes: { version: "1.0", encoding: "UTF-8" }, + }, + "SOAP-ENV:Envelope": { + _attributes: { + "xmlns:SOAP-ENV": + "http://schemas.xmlsoap.org/soap/envelope/", + "xmlns:ns1": "http://roblox.com/", + }, + "SOAP-ENV:Body": { "ns1:CloseExpiredJobs": {} }, + }, + }) + + const body = convert.js2xml(xml, { compact: true, spaces: 4 }) + + try { + const result = await fetch(url, { method: "POST", body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { + compact: true, + spaces: 4, + }) + return resolve(convertedData) + } catch (error) { + return reject(error) + } + }) } -async function CloseAllJobs(){ - return new Promise(async (resolve, reject) => { - var xml = xml = { - _declaration: { _attributes: { version: '1.0', encoding: 'UTF-8' } }, - 'SOAP-ENV:Envelope': { - _attributes: { - 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', - 'xmlns:ns1': 'http://roblox.com/' - }, - 'SOAP-ENV:Body': { 'ns1:CloseAllJobs': {} } - } - } - - const body = convert.js2xml(xml, { compact: true, spaces: 4 }) - - try { - const result = await fetch(url, { method: 'POST', body }) - const data = await result.text() - const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) - return resolve( - convertedData - ) - } catch (error) { - return reject(error) - } - }) +async function CloseAllJobs() { + return new Promise(async (resolve, reject) => { + var xml = (xml = { + _declaration: { + _attributes: { version: "1.0", encoding: "UTF-8" }, + }, + "SOAP-ENV:Envelope": { + _attributes: { + "xmlns:SOAP-ENV": + "http://schemas.xmlsoap.org/soap/envelope/", + "xmlns:ns1": "http://roblox.com/", + }, + "SOAP-ENV:Body": { "ns1:CloseAllJobs": {} }, + }, + }) + + const body = convert.js2xml(xml, { compact: true, spaces: 4 }) + + try { + const result = await fetch(url, { method: "POST", body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { + compact: true, + spaces: 4, + }) + return resolve(convertedData) + } catch (error) { + return reject(error) + } + }) } - -module.exports = {OpenJob, GetAllJobs,Execute,CloseJob,RenewLease,GetExpiration,CloseExpiredJobs,CloseAllJobs} - - - - - - - - - +module.exports = { + OpenJob, + GetAllJobs, + Execute, + CloseJob, + RenewLease, + GetExpiration, + CloseExpiredJobs, + CloseAllJobs, +} diff --git a/Back/under_maintenance.html b/Back/under_maintenance.html index 0973e38..16bd6e9 100644 --- a/Back/under_maintenance.html +++ b/Back/under_maintenance.html @@ -1,93 +1,121 @@ + + + document.body.onclick = () => { + if (isAudioPlayed) return + playAudio() + } +
-

What happened to Meteorite?

-

In short I had lost motivation to keep it open. Now let me give you some reasons why.

-
-
    -
  • it was a massive money bleed ranging $60-400 a month to run.
  • -
    -
  • The staff I hired didn't do the best job which is partially my fault. I didn't do enough to keep them doing their best. This resulted in some accidents over the course of Meteorite's 1 year life which I don't condone and infighting. I didn't tell my staff to censor or hide any criticism though I should of been more proactive about what my staff were doing.
  • -
    -
  • I wanted a break which is why updates slowed down but obviously the website/discord was not in a state to leave. This also upset some staff members which I apologize for.
  • -
+

What happened to Meteorite?

+

+ In short I had lost motivation to keep it open. Now let me give you some + reasons why. +

+
+
    +
  • it was a massive money bleed ranging $60-400 a month to run.
  • +
    +
  • + The staff I hired didn't do the best job which is partially my + fault. I didn't do enough to keep them doing their best. This + resulted in some accidents over the course of Meteorite's 1 year + life which I don't condone and infighting. I didn't tell my staff to + censor or hide any criticism though I should of been more proactive + about what my staff were doing. +
  • +
    +
  • + I wanted a break which is why updates slowed down but obviously the + website/discord was not in a state to leave. This also upset some + staff members which I apologize for. +
  • +
-
+
-

To clear some things up of accusations against me since I know there is a lot of noise.

-
-
First of all, I had already decided to shut down before the document even came out. It didn't influence this decision in any way. Now, we will skip over criticisms of the website itself as that doesn't matter. Two problematic individuals in the community were a result of my bad management and staff favoritism over members. Security of Meteorite was compromised from a lazy config error but I did my best to minimize the damage and as far as I'm aware only around 70 places leaked on the internet.
-
-
Thanks, sushi. it's been fun. Maybe we meet again 2020 RCC
+

+ To clear some things up of accusations against me since I know there is + a lot of noise. +

+
+
+ First of all, I had already decided to shut down before the + + document + + even came out. It didn't influence this decision in any way. Now, we + will skip over criticisms of the website itself as that doesn't matter. + Two problematic individuals in the community were a result of my bad + management and staff favoritism over members. Security of Meteorite was + compromised from a lazy config error but I did my best to minimize the + damage and as far as I'm aware only around 70 places leaked on the + internet. +
+
+
+ Thanks, sushi. it's been fun. Maybe we meet again + 2020 RCC +
- - - - - - - - - - - - - - - - -
\ No newline at end of file + + + + + + + + + + + + + + + + diff --git a/Front/package.json b/Front/package.json index 331631c..181689e 100644 --- a/Front/package.json +++ b/Front/package.json @@ -18,6 +18,8 @@ "@tailwindcss/typography": "^0.5.8", "autoprefixer": "^10.4.13", "postcss": "^8.4.21", + "prettier": "^3.0.3", + "prettier-plugin-svelte": "^3.0.3", "svelte": "^3.56.0", "svelte-check": "^3.0.3", "svelte-feather-icons": "^4.0.0", diff --git a/Front/pnpm-lock.yaml b/Front/pnpm-lock.yaml new file mode 100644 index 0000000..3eddc3d --- /dev/null +++ b/Front/pnpm-lock.yaml @@ -0,0 +1,1674 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@yaireo/relative-time': + specifier: ^1.0.3 + version: 1.0.4 + dotenv: + specifier: ^16.0.3 + version: 16.3.1 + lucide-svelte: + specifier: ^0.216.0 + version: 0.216.0(svelte@3.59.2) + +devDependencies: + '@skeletonlabs/skeleton': + specifier: ^0.124.2 + version: 0.124.2 + '@sveltejs/adapter-auto': + specifier: ^2.0.0 + version: 2.1.0(@sveltejs/kit@1.24.1) + '@sveltejs/adapter-node': + specifier: ^1.1.4 + version: 1.3.1(@sveltejs/kit@1.24.1) + '@sveltejs/kit': + specifier: ^1.5.0 + version: 1.24.1(svelte@3.59.2)(vite@4.4.9) + '@tailwindcss/forms': + specifier: ^0.5.3 + version: 0.5.6(tailwindcss@3.3.3) + '@tailwindcss/typography': + specifier: ^0.5.8 + version: 0.5.10(tailwindcss@3.3.3) + autoprefixer: + specifier: ^10.4.13 + version: 10.4.15(postcss@8.4.29) + postcss: + specifier: ^8.4.21 + version: 8.4.29 + prettier: + specifier: ^3.0.3 + version: 3.0.3 + prettier-plugin-svelte: + specifier: ^3.0.3 + version: 3.0.3(prettier@3.0.3)(svelte@3.59.2) + svelte: + specifier: ^3.56.0 + version: 3.59.2 + svelte-check: + specifier: ^3.0.3 + version: 3.5.1(postcss@8.4.29)(svelte@3.59.2) + svelte-feather-icons: + specifier: ^4.0.0 + version: 4.0.1 + svelte-hcaptcha: + specifier: ^0.1.1 + version: 0.1.1 + svelte-preprocess: + specifier: ^5.0.1 + version: 5.0.4(postcss@8.4.29)(svelte@3.59.2)(typescript@4.9.5) + tailwindcss: + specifier: ^3.2.4 + version: 3.3.3 + tslib: + specifier: ^2.4.1 + version: 2.6.2 + typescript: + specifier: ^4.9.3 + version: 4.9.5 + vite: + specifier: ^4.0.0 + version: 4.4.9 + +packages: + + /@alloc/quick-lru@5.2.0: + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + dev: true + + /@esbuild/android-arm64@0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.19 + dev: true + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@jridgewell/trace-mapping@0.3.19: + resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: true + + /@polka/url@1.0.0-next.23: + resolution: {integrity: sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==} + dev: true + + /@rollup/plugin-commonjs@25.0.4(rollup@3.29.0): + resolution: {integrity: sha512-L92Vz9WUZXDnlQQl3EwbypJR4+DM2EbsO+/KOcEkP4Mc6Ct453EeDB2uH9lgRwj4w5yflgNpq9pHOiY8aoUXBQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.68.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.0.4(rollup@3.29.0) + commondir: 1.0.1 + estree-walker: 2.0.2 + glob: 8.1.0 + is-reference: 1.2.1 + magic-string: 0.27.0 + rollup: 3.29.0 + dev: true + + /@rollup/plugin-json@6.0.0(rollup@3.29.0): + resolution: {integrity: sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.0.4(rollup@3.29.0) + rollup: 3.29.0 + dev: true + + /@rollup/plugin-node-resolve@15.2.1(rollup@3.29.0): + resolution: {integrity: sha512-nsbUg588+GDSu8/NS8T4UAshO6xeaOfINNuXeVHcKV02LJtoRaM1SiOacClw4kws1SFiNhdLGxlbMY9ga/zs/w==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.0.4(rollup@3.29.0) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-builtin-module: 3.2.1 + is-module: 1.0.0 + resolve: 1.22.4 + rollup: 3.29.0 + dev: true + + /@rollup/pluginutils@5.0.4(rollup@3.29.0): + resolution: {integrity: sha512-0KJnIoRI8A+a1dqOYLxH8vBf8bphDmty5QvIm2hqm7oFCFYKCAZWWd2hXgMibaPsNDhI0AtpYfQZJG47pt/k4g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.1 + estree-walker: 2.0.2 + picomatch: 2.3.1 + rollup: 3.29.0 + dev: true + + /@skeletonlabs/skeleton@0.124.2: + resolution: {integrity: sha512-SQ0tgXXEj/QJ5BSA+UwKdSMADW5Xt+5iNpks1y94YnX2iwAY80MlffEfip+//VXYayeGvzx4xiU4//MpK9+Zgg==} + dependencies: + svelte: 3.59.2 + dev: true + + /@sveltejs/adapter-auto@2.1.0(@sveltejs/kit@1.24.1): + resolution: {integrity: sha512-o2pZCfATFtA/Gw/BB0Xm7k4EYaekXxaPGER3xGSY3FvzFJGTlJlZjBseaXwYSM94lZ0HniOjTokN3cWaLX6fow==} + peerDependencies: + '@sveltejs/kit': ^1.0.0 + dependencies: + '@sveltejs/kit': 1.24.1(svelte@3.59.2)(vite@4.4.9) + import-meta-resolve: 3.0.0 + dev: true + + /@sveltejs/adapter-node@1.3.1(@sveltejs/kit@1.24.1): + resolution: {integrity: sha512-A0VgRQDCDPzdLNoiAbcOxGw4zT1Mc+n1LwT1OmO350R7WxrEqdMUChPPOd1iMfIDWlP4ie6E2d/WQf5es2d4Zw==} + peerDependencies: + '@sveltejs/kit': ^1.0.0 + dependencies: + '@rollup/plugin-commonjs': 25.0.4(rollup@3.29.0) + '@rollup/plugin-json': 6.0.0(rollup@3.29.0) + '@rollup/plugin-node-resolve': 15.2.1(rollup@3.29.0) + '@sveltejs/kit': 1.24.1(svelte@3.59.2)(vite@4.4.9) + rollup: 3.29.0 + dev: true + + /@sveltejs/kit@1.24.1(svelte@3.59.2)(vite@4.4.9): + resolution: {integrity: sha512-u2FO0q62Se9UZ0g9kXaWYi+54vTK70BKaPScOcx6jLMRou4CUZgDTNKnRhsbJgPMgaLkOH0j3o/fKlZ6jBfgSg==} + engines: {node: ^16.14 || >=18} + hasBin: true + requiresBuild: true + peerDependencies: + svelte: ^3.54.0 || ^4.0.0-next.0 + vite: ^4.0.0 + dependencies: + '@sveltejs/vite-plugin-svelte': 2.4.5(svelte@3.59.2)(vite@4.4.9) + '@types/cookie': 0.5.2 + cookie: 0.5.0 + devalue: 4.3.2 + esm-env: 1.0.0 + kleur: 4.1.5 + magic-string: 0.30.3 + mime: 3.0.0 + sade: 1.8.1 + set-cookie-parser: 2.6.0 + sirv: 2.0.3 + svelte: 3.59.2 + tiny-glob: 0.2.9 + undici: 5.23.0 + vite: 4.4.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@sveltejs/vite-plugin-svelte-inspector@1.0.4(@sveltejs/vite-plugin-svelte@2.4.5)(svelte@3.59.2)(vite@4.4.9): + resolution: {integrity: sha512-zjiuZ3yydBtwpF3bj0kQNV0YXe+iKE545QGZVTaylW3eAzFr+pJ/cwK8lZEaRp4JtaJXhD5DyWAV4AxLh6DgaQ==} + engines: {node: ^14.18.0 || >= 16} + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^2.2.0 + svelte: ^3.54.0 || ^4.0.0 + vite: ^4.0.0 + dependencies: + '@sveltejs/vite-plugin-svelte': 2.4.5(svelte@3.59.2)(vite@4.4.9) + debug: 4.3.4 + svelte: 3.59.2 + vite: 4.4.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@sveltejs/vite-plugin-svelte@2.4.5(svelte@3.59.2)(vite@4.4.9): + resolution: {integrity: sha512-UJKsFNwhzCVuiZd06jM/psscyNJNDwjQC+qIeb7GBJK9iWeQCcIyfcPWDvbCudfcJggY9jtxJeeaZH7uny93FQ==} + engines: {node: ^14.18.0 || >= 16} + peerDependencies: + svelte: ^3.54.0 || ^4.0.0 + vite: ^4.0.0 + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 1.0.4(@sveltejs/vite-plugin-svelte@2.4.5)(svelte@3.59.2)(vite@4.4.9) + debug: 4.3.4 + deepmerge: 4.3.1 + kleur: 4.1.5 + magic-string: 0.30.3 + svelte: 3.59.2 + svelte-hmr: 0.15.3(svelte@3.59.2) + vite: 4.4.9 + vitefu: 0.2.4(vite@4.4.9) + transitivePeerDependencies: + - supports-color + dev: true + + /@tailwindcss/forms@0.5.6(tailwindcss@3.3.3): + resolution: {integrity: sha512-Fw+2BJ0tmAwK/w01tEFL5TiaJBX1NLT1/YbWgvm7ws3Qcn11kiXxzNTEQDMs5V3mQemhB56l3u0i9dwdzSQldA==} + peerDependencies: + tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1' + dependencies: + mini-svg-data-uri: 1.4.4 + tailwindcss: 3.3.3 + dev: true + + /@tailwindcss/typography@0.5.10(tailwindcss@3.3.3): + resolution: {integrity: sha512-Pe8BuPJQJd3FfRnm6H0ulKIGoMEQS+Vq01R6M5aCrFB/ccR/shT+0kXLjouGC1gFLm9hopTFN+DMP0pfwRWzPw==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + dependencies: + lodash.castarray: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + postcss-selector-parser: 6.0.10 + tailwindcss: 3.3.3 + dev: true + + /@types/cookie@0.5.2: + resolution: {integrity: sha512-DBpRoJGKJZn7RY92dPrgoMew8xCWc2P71beqsjyhEI/Ds9mOyVmBwtekyfhpwFIVt1WrxTonFifiOZ62V8CnNA==} + dev: true + + /@types/estree@1.0.1: + resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} + dev: true + + /@types/pug@2.0.6: + resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==} + dev: true + + /@types/resolve@1.20.2: + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + dev: true + + /@yaireo/relative-time@1.0.4: + resolution: {integrity: sha512-ILW0k/xtOsnnzLZg+3tk+A9HtTOYu4GI4bG1epBxJ/borIZgGDRMD8kVjzitGyKbV0LOsOchIMZdsAaQxRgImA==} + engines: {node: '>=12.0.0'} + dev: false + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: true + + /autoprefixer@10.4.15(postcss@8.4.29): + resolution: {integrity: sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.21.10 + caniuse-lite: 1.0.30001532 + fraction.js: 4.3.6 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.29 + postcss-value-parser: 4.2.0 + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /browserslist@4.21.10: + resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001532 + electron-to-chromium: 1.4.513 + node-releases: 2.0.13 + update-browserslist-db: 1.0.11(browserslist@4.21.10) + dev: true + + /buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + dev: true + + /builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + dev: true + + /busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + dependencies: + streamsearch: 1.1.0 + dev: true + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + dev: true + + /caniuse-lite@1.0.30001532: + resolution: {integrity: sha512-FbDFnNat3nMnrROzqrsg314zhqN5LGQ1kyyMk2opcrwGbVGpHRhgCWtAgD5YJUqNAiQ+dklreil/c3Qf1dfCTw==} + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: true + + /commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: true + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dev: true + + /detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + dev: true + + /devalue@4.3.2: + resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==} + dev: true + + /didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dev: true + + /dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: true + + /dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + engines: {node: '>=12'} + dev: false + + /electron-to-chromium@1.4.513: + resolution: {integrity: sha512-cOB0xcInjm+E5qIssHeXJ29BaUyWpMyFKT5RB3bsLENDheCja0wMkHJyiPl0NBE/VzDI7JDuNEQWhe6RitEUcw==} + dev: true + + /es6-promise@3.3.1: + resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} + dev: true + + /esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /esm-env@1.0.0: + resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} + dev: true + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: true + + /fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /fraction.js@4.3.6: + resolution: {integrity: sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==} + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.1.6: + resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + dev: true + + /globalyzer@0.1.0: + resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} + dev: true + + /globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /import-meta-resolve@3.0.0: + resolution: {integrity: sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + dependencies: + builtin-modules: 3.3.0 + dev: true + + /is-core-module@2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + dependencies: + has: 1.0.3 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + dependencies: + '@types/estree': 1.0.1 + dev: true + + /jiti@1.20.0: + resolution: {integrity: sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==} + hasBin: true + dev: true + + /kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + dev: true + + /lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + dev: true + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /lodash.castarray@4.4.0: + resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} + dev: true + + /lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lucide-svelte@0.216.0(svelte@3.59.2): + resolution: {integrity: sha512-e7uFIf3H1Tpoq+RRvAXLBCEe1YgZwOu1LEZY8lkdja3djJBHNsk2/Pgkec/ptT9nzU9oLK/D5lrVxtyvMua0BQ==} + peerDependencies: + svelte: ^3.49.0 + dependencies: + svelte: 3.59.2 + dev: false + + /magic-string@0.27.0: + resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /magic-string@0.30.3: + resolution: {integrity: sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + dev: true + + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /mini-svg-data-uri@1.4.4: + resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} + hasBin: true + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + dev: true + + /mrmime@1.0.1: + resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} + engines: {node: '>=10'} + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: true + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: true + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: true + + /postcss-import@15.1.0(postcss@8.4.29): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.29 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.4 + dev: true + + /postcss-js@4.0.1(postcss@8.4.29): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.29 + dev: true + + /postcss-load-config@4.0.1(postcss@8.4.29): + resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 2.1.0 + postcss: 8.4.29 + yaml: 2.3.2 + dev: true + + /postcss-nested@6.0.1(postcss@8.4.29): + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.29 + postcss-selector-parser: 6.0.13 + dev: true + + /postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-selector-parser@6.0.13: + resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: true + + /postcss@8.4.29: + resolution: {integrity: sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /prettier-plugin-svelte@3.0.3(prettier@3.0.3)(svelte@3.59.2): + resolution: {integrity: sha512-dLhieh4obJEK1hnZ6koxF+tMUrZbV5YGvRpf2+OADyanjya5j0z1Llo8iGwiHmFWZVG/hLEw/AJD5chXd9r3XA==} + peerDependencies: + prettier: ^3.0.0 + svelte: ^3.2.0 || ^4.0.0-next.0 + dependencies: + prettier: 3.0.3 + svelte: 3.59.2 + dev: true + + /prettier@3.0.3: + resolution: {integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + dev: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve@1.22.4: + resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} + hasBin: true + dependencies: + is-core-module: 2.13.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup@3.29.0: + resolution: {integrity: sha512-nszM8DINnx1vSS+TpbWKMkxem0CDWk3cSit/WWCBVs9/JZ1I/XLwOsiUglYuYReaeWWSsW9kge5zE5NZtf/a4w==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + dependencies: + mri: 1.2.0 + dev: true + + /sander@0.5.1: + resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} + dependencies: + es6-promise: 3.3.1 + graceful-fs: 4.2.11 + mkdirp: 0.5.6 + rimraf: 2.7.1 + dev: true + + /set-cookie-parser@2.6.0: + resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} + dev: true + + /sirv@2.0.3: + resolution: {integrity: sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==} + engines: {node: '>= 10'} + dependencies: + '@polka/url': 1.0.0-next.23 + mrmime: 1.0.1 + totalist: 3.0.1 + dev: true + + /sorcery@0.11.0: + resolution: {integrity: sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==} + hasBin: true + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + buffer-crc32: 0.2.13 + minimist: 1.2.8 + sander: 0.5.1 + dev: true + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + dev: true + + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /sucrase@3.34.0: + resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} + engines: {node: '>=8'} + hasBin: true + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + commander: 4.1.1 + glob: 7.1.6 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /svelte-check@3.5.1(postcss@8.4.29)(svelte@3.59.2): + resolution: {integrity: sha512-+Zb4iHxAhdUtcUg/WJPRjlS1RJalIsWAe9Mz6G1zyznSs7dDkT7VUBdXc3q7Iwg49O/VrZgyJRvOJkjuBfKjFA==} + hasBin: true + peerDependencies: + svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 + dependencies: + '@jridgewell/trace-mapping': 0.3.19 + chokidar: 3.5.3 + fast-glob: 3.3.1 + import-fresh: 3.3.0 + picocolors: 1.0.0 + sade: 1.8.1 + svelte: 3.59.2 + svelte-preprocess: 5.0.4(postcss@8.4.29)(svelte@3.59.2)(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - '@babel/core' + - coffeescript + - less + - postcss + - postcss-load-config + - pug + - sass + - stylus + - sugarss + dev: true + + /svelte-feather-icons@4.0.1: + resolution: {integrity: sha512-DMDrlbblaRUHLcTFtKHE4GWQ/Fk/kneGIZrrI75EmTxCu1hgHe8uq8e80ONrmdjL/i3f1d8fkcx73SWng2X6Gg==} + dependencies: + svelte: 3.59.2 + dev: true + + /svelte-hcaptcha@0.1.1: + resolution: {integrity: sha512-iFF3HwfrCRciJnDs4Y9/rpP/BM2U/5zt+vh+9d4tALPAHVkcANiJIKqYuS835pIaTm6gt+xOzjfFI3cgiRI29A==} + dev: true + + /svelte-hmr@0.15.3(svelte@3.59.2): + resolution: {integrity: sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==} + engines: {node: ^12.20 || ^14.13.1 || >= 16} + peerDependencies: + svelte: ^3.19.0 || ^4.0.0 + dependencies: + svelte: 3.59.2 + dev: true + + /svelte-preprocess@5.0.4(postcss@8.4.29)(svelte@3.59.2)(typescript@4.9.5): + resolution: {integrity: sha512-ABia2QegosxOGsVlsSBJvoWeXy1wUKSfF7SWJdTjLAbx/Y3SrVevvvbFNQqrSJw89+lNSsM58SipmZJ5SRi5iw==} + engines: {node: '>= 14.10.0'} + requiresBuild: true + peerDependencies: + '@babel/core': ^7.10.2 + coffeescript: ^2.5.1 + less: ^3.11.3 || ^4.0.0 + postcss: ^7 || ^8 + postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 + pug: ^3.0.0 + sass: ^1.26.8 + stylus: ^0.55.0 + sugarss: ^2.0.0 || ^3.0.0 || ^4.0.0 + svelte: ^3.23.0 || ^4.0.0-next.0 || ^4.0.0 + typescript: '>=3.9.5 || ^4.0.0 || ^5.0.0' + peerDependenciesMeta: + '@babel/core': + optional: true + coffeescript: + optional: true + less: + optional: true + postcss: + optional: true + postcss-load-config: + optional: true + pug: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + typescript: + optional: true + dependencies: + '@types/pug': 2.0.6 + detect-indent: 6.1.0 + magic-string: 0.27.0 + postcss: 8.4.29 + sorcery: 0.11.0 + strip-indent: 3.0.0 + svelte: 3.59.2 + typescript: 4.9.5 + dev: true + + /svelte-preprocess@5.0.4(postcss@8.4.29)(svelte@3.59.2)(typescript@5.2.2): + resolution: {integrity: sha512-ABia2QegosxOGsVlsSBJvoWeXy1wUKSfF7SWJdTjLAbx/Y3SrVevvvbFNQqrSJw89+lNSsM58SipmZJ5SRi5iw==} + engines: {node: '>= 14.10.0'} + requiresBuild: true + peerDependencies: + '@babel/core': ^7.10.2 + coffeescript: ^2.5.1 + less: ^3.11.3 || ^4.0.0 + postcss: ^7 || ^8 + postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 + pug: ^3.0.0 + sass: ^1.26.8 + stylus: ^0.55.0 + sugarss: ^2.0.0 || ^3.0.0 || ^4.0.0 + svelte: ^3.23.0 || ^4.0.0-next.0 || ^4.0.0 + typescript: '>=3.9.5 || ^4.0.0 || ^5.0.0' + peerDependenciesMeta: + '@babel/core': + optional: true + coffeescript: + optional: true + less: + optional: true + postcss: + optional: true + postcss-load-config: + optional: true + pug: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + typescript: + optional: true + dependencies: + '@types/pug': 2.0.6 + detect-indent: 6.1.0 + magic-string: 0.27.0 + postcss: 8.4.29 + sorcery: 0.11.0 + strip-indent: 3.0.0 + svelte: 3.59.2 + typescript: 5.2.2 + dev: true + + /svelte@3.59.2: + resolution: {integrity: sha512-vzSyuGr3eEoAtT/A6bmajosJZIUWySzY2CzB3w2pgPvnkUjGqlDnsNnA0PMO+mMAhuyMul6C2uuZzY6ELSkzyA==} + engines: {node: '>= 8'} + + /tailwindcss@3.3.3: + resolution: {integrity: sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.5.3 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.1 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.20.0 + lilconfig: 2.1.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.29 + postcss-import: 15.1.0(postcss@8.4.29) + postcss-js: 4.0.1(postcss@8.4.29) + postcss-load-config: 4.0.1(postcss@8.4.29) + postcss-nested: 6.0.1(postcss@8.4.29) + postcss-selector-parser: 6.0.13 + resolve: 1.22.4 + sucrase: 3.34.0 + transitivePeerDependencies: + - ts-node + dev: true + + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: true + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: true + + /tiny-glob@0.2.9: + resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} + dependencies: + globalyzer: 0.1.0 + globrex: 0.1.2 + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + dev: true + + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + dev: true + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: true + + /typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /undici@5.23.0: + resolution: {integrity: sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==} + engines: {node: '>=14.0'} + dependencies: + busboy: 1.6.0 + dev: true + + /update-browserslist-db@1.0.11(browserslist@4.21.10): + resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.10 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /vite@4.4.9: + resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.18.20 + postcss: 8.4.29 + rollup: 3.29.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vitefu@0.2.4(vite@4.4.9): + resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 + peerDependenciesMeta: + vite: + optional: true + dependencies: + vite: 4.4.9 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /yaml@2.3.2: + resolution: {integrity: sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==} + engines: {node: '>= 14'} + dev: true diff --git a/Front/src/app.d.ts b/Front/src/app.d.ts index cb2e5fa..f5c2a45 100644 --- a/Front/src/app.d.ts +++ b/Front/src/app.d.ts @@ -2,7 +2,6 @@ // for information about these interfaces // and what to do when importing types declare namespace App { - interface Locals { user: User | null jwt: cookie | null diff --git a/Front/src/app.html b/Front/src/app.html index 53e9133..7dd693c 100644 --- a/Front/src/app.html +++ b/Front/src/app.html @@ -1,4 +1,4 @@ - + @@ -7,6 +7,8 @@ %sveltekit.head% -
%sveltekit.body%
+
+ %sveltekit.body% +
diff --git a/Front/src/app.postcss b/Front/src/app.postcss index 95b488c..ce15868 100644 --- a/Front/src/app.postcss +++ b/Front/src/app.postcss @@ -1,2 +1,5 @@ /*place global styles here */ -html, body { @apply h-full overflow-hidden; } \ No newline at end of file +html, +body { + @apply h-full overflow-hidden; +} diff --git a/Front/src/components/admin/assetqueue.svelte b/Front/src/components/admin/assetqueue.svelte index 7e1e6b3..1911d09 100644 --- a/Front/src/components/admin/assetqueue.svelte +++ b/Front/src/components/admin/assetqueue.svelte @@ -1,78 +1,93 @@
-

Queue Count: {queuecount}

-
- {#if items} - {#each items as {Name, ItemId, Creator, Type}} - - {/each} - {/if} +

Queue Count: {queuecount}

+
+ {#if items} + {#each items as { Name, ItemId, Creator, Type }} + + {/each} + {/if} +
+
+ +
{currentPage} / {maxiumumPage}
+ +
-
- -
{currentPage} / {maxiumumPage}
- -
- - -
\ No newline at end of file diff --git a/Front/src/components/admin/lookup.svelte b/Front/src/components/admin/lookup.svelte index 0e2b98a..4578f44 100644 --- a/Front/src/components/admin/lookup.svelte +++ b/Front/src/components/admin/lookup.svelte @@ -1,58 +1,71 @@
- - -
or
- -
{message.message??""}
- - -
\ No newline at end of file + +
or
+ +
+ {message.message ?? ""} +
+ + diff --git a/Front/src/components/admin/lookupdone.svelte b/Front/src/components/admin/lookupdone.svelte index cf9650f..e370a49 100644 --- a/Front/src/components/admin/lookupdone.svelte +++ b/Front/src/components/admin/lookupdone.svelte @@ -1,144 +1,198 @@ +
+
+
Action:
-
+ -
Action:
+ - + - + {#if lookupaction === "Banned"} + + {/if} +
- - - {#if lookupaction === "Banned"} - - {/if} - -
- -
- -
Auto Fill:
- - -
- -
-
Moderator Note:
- -
{message.message??""}
-
- - -
- -
+
+
Auto Fill:
+ + +
+
+
Moderator Note:
+ +
+ {message.message ?? ""} +
+
+ + +
+
-
-
-
{lookupdata.username}
-
+
+
+
{lookupdata.username}
+
-
- +
+ + + -
- - {#if JSON.parse(lookupdata.moderation).status.toUpperCase() != "OK"} -
Moderation Status:
{JSON.parse(lookupdata.moderation).status}
- {:else} -
Moderation Status:
{JSON.parse(lookupdata.moderation).status}
- {/if} -
Rocks: {lookupdata.coins}
-
Discord ID: {lookupdata.discordid??"Not Linked"}
-
View Screenshots
-
View Identity
+
+ {#if JSON.parse(lookupdata.moderation).status.toUpperCase() != "OK"} +
+ Moderation Status:
+ {JSON.parse(lookupdata.moderation).status} +
+ + {:else} +
+ Moderation Status:
+ {JSON.parse(lookupdata.moderation).status} +
+ + {/if} +
Rocks: {lookupdata.coins}
+
+ Discord ID: {lookupdata.discordid ?? "Not Linked"} +
+
View Screenshots
+
View Identity
+
+
+
+
+
Moderation History
+ + + + + + + + + + + {#if lookupdata.moderationhistory} + {#each lookupdata.moderationhistory as { status, Reason, BannedBy, Date }} + + + + + + + {/each} + {/if} + +
TypeReasonBannedByDate
{status} + {Reason} + {BannedBy}{Date}
+
- -
- - -
-
-
Moderation History
- - - - - - - - - - - {#if lookupdata.moderationhistory} - {#each lookupdata.moderationhistory as {status, Reason, BannedBy, Date}} - - - - - - - {/each} - {/if} - -
TypeReasonBannedByDate
{status}{Reason}{BannedBy}{Date}
-
-
\ No newline at end of file diff --git a/Front/src/components/assets/advertisemodal.svelte b/Front/src/components/assets/advertisemodal.svelte index c8b42ce..a46a883 100644 --- a/Front/src/components/assets/advertisemodal.svelte +++ b/Front/src/components/assets/advertisemodal.svelte @@ -1,58 +1,69 @@ +
Advertise
- - -
- -
{message.message??""}
- + +
+
+ {message.message ?? ""} +
+ +
-
\ No newline at end of file diff --git a/Front/src/components/colorpicker.svelte b/Front/src/components/colorpicker.svelte index 8134e92..e1eb2ee 100644 --- a/Front/src/components/colorpicker.svelte +++ b/Front/src/components/colorpicker.svelte @@ -1,298 +1,1333 @@ +
Skin Tone by Body Parts
- -
+
+ - + - + - + - + - + - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
\ No newline at end of file + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ diff --git a/Front/src/components/commentcard.svelte b/Front/src/components/commentcard.svelte index 36e5ec8..0287b43 100644 --- a/Front/src/components/commentcard.svelte +++ b/Front/src/components/commentcard.svelte @@ -1,110 +1,141 @@ -
-
- - + - + -
{message.message??""}
+
+ {message.message ?? ""} +
- + -
-

Games

+
+

Games

-{#each creations as {nameofgame, idofgame, Description, avatartype, gearallowed}} - -{/each} + {#each creations as { nameofgame, idofgame, Description, avatartype, gearallowed }} + + {/each} +
- -
\ No newline at end of file diff --git a/Front/src/components/develop/modals/editgamemodal.svelte b/Front/src/components/develop/modals/editgamemodal.svelte index 8205544..4c73802 100644 --- a/Front/src/components/develop/modals/editgamemodal.svelte +++ b/Front/src/components/develop/modals/editgamemodal.svelte @@ -1,192 +1,239 @@ - async function updateGearStatus(newgearstatus: boolean){ - if (allowmeshes != newgearstatus){ - allowmeshes = newgearstatus - const updateGearStatus = await fetch("/develop/editgearstatus", { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': jwt, - }, - body: JSON.stringify({ - newgearstatus, - gameid: gameid.toString() - }) - }) - const updateGearStatusjson = await updateGearStatus.json() - console.log(updateGearStatusjson) - } - } - - - -
- +
+
+
+
Edit Game
+ + + + + + +
+ {message.message ?? ""} +
+
+
+
Edit File
+ + +
+ {messageupload.message ?? ""} +
+
+
-
- -
-
Edit Game
- - - - - - -
{message.message??""}
-
+
+ -
-
Edit File
- - -
{messageupload.message??""}
-
- -
- -
- - - + +
- - - - - -
- \ No newline at end of file diff --git a/Front/src/components/gamecard.svelte b/Front/src/components/gamecard.svelte index 3b59919..ca1331f 100644 --- a/Front/src/components/gamecard.svelte +++ b/Front/src/components/gamecard.svelte @@ -1,61 +1,109 @@ - {#if useragent.includes("Android") === true || useragent.includes("iPhone") === true} - -
{document.location.href="/games/"+idofgame+"/"+gamename.replace(/[^a-zA-Z ]/g, "").replaceAll(' ', '-')}}> -
- {#if imageloading} -
- {/if} - imageloading=false} src="/assets/gameassets/thumbnail-{idofgame}.png#" /> -

{gamename}

-
{playercount} Playing
-
{version}
- -
-
- {:else} - -
- {#if imageloading} -
- {/if} - imageloading=false} src="/assets/gameassets/thumbnail-{idofgame}.png#" /> -

{gamename}

-
{playercount} Playing
-
{version}
- {#if username}{/if} -
-
- {/if} + return { + destroy() { + node.removeEventListener("load", callback) + }, + } + } + } + + +{#if useragent.includes("Android") === true || useragent.includes("iPhone") === true} + +
{ + document.location.href = + "/games/" + + idofgame + + "/" + + gamename.replace(/[^a-zA-Z ]/g, "").replaceAll(" ", "-") + }}> +
+ {#if imageloading} +
+
+ {/if} + (imageloading = false)} + src="/assets/gameassets/thumbnail-{idofgame}.png#" /> +

{gamename}

+
{playercount} Playing
+
+ {version} +
+ +
+
+{:else} + +
+ {#if imageloading} +
+
+ {/if} + (imageloading = false)} + src="/assets/gameassets/thumbnail-{idofgame}.png#" /> +

{gamename}

+
{playercount} Playing
+
+ {version} +
+ {#if username}{/if} +
+
+{/if} diff --git a/Front/src/components/games/launchmodal.svelte b/Front/src/components/games/launchmodal.svelte index e34b5a4..9caef03 100644 --- a/Front/src/components/games/launchmodal.svelte +++ b/Front/src/components/games/launchmodal.svelte @@ -1,9 +1,21 @@ +
-
meteorite
-
Do you have Meteorite Installed? If not install now!
- - Download +
+ meteorite +
+
+ Do you have Meteorite Installed? If not install now! +
+ + + Download +
diff --git a/Front/src/components/games/linkdiscordmodal.svelte b/Front/src/components/games/linkdiscordmodal.svelte index d0fecca..b791279 100644 --- a/Front/src/components/games/linkdiscordmodal.svelte +++ b/Front/src/components/games/linkdiscordmodal.svelte @@ -1,6 +1,29 @@
- -
Hi! In order to play games here at Meteorite you must link your discord account.
-
Thank you...
- Link -
\ No newline at end of file + + + + + + +
+ Hi! In order to play games here at Meteorite you must link your discord + account. +
+
Thank you...
+ + Link + +
diff --git a/Front/src/components/groups/groupbar.svelte b/Front/src/components/groups/groupbar.svelte index 113d769..b3bfaf1 100644 --- a/Front/src/components/groups/groupbar.svelte +++ b/Front/src/components/groups/groupbar.svelte @@ -1,27 +1,35 @@ + +
diff --git a/Front/src/components/itemcard.svelte b/Front/src/components/itemcard.svelte index 3aeff05..0707920 100644 --- a/Front/src/components/itemcard.svelte +++ b/Front/src/components/itemcard.svelte @@ -1,92 +1,134 @@ - + diff --git a/Front/src/components/login/2famodal.svelte b/Front/src/components/login/2famodal.svelte index 4d879e2..9ab0e80 100644 --- a/Front/src/components/login/2famodal.svelte +++ b/Front/src/components/login/2famodal.svelte @@ -1,82 +1,101 @@
- -
Confirm 2FA
+
Confirm 2FA
- - + + + + -
Enter the code generated by your authenticator app.
+
+ Enter the code generated by your authenticator app. +
-
- -
{message.message??""}
-
- - - - +
+ +
+ {message.message ?? ""} +
+
+
diff --git a/Front/src/components/progressbar.svelte b/Front/src/components/progressbar.svelte index 098d143..7b1618d 100644 --- a/Front/src/components/progressbar.svelte +++ b/Front/src/components/progressbar.svelte @@ -1,72 +1,89 @@ {#if $p > 0 && $p < 1 && isVisible} - + {/if} \ No newline at end of file + /* value: */ + progress::-webkit-progress-value { + background-color: var(--val-color) !important; + } + progress::-moz-progress-bar { + background-color: var(--val-color) !important; + } + progress { + color: var(--val-color); + } + diff --git a/Front/src/components/rocks.svelte b/Front/src/components/rocks.svelte index e2091c7..7a15381 100644 --- a/Front/src/components/rocks.svelte +++ b/Front/src/components/rocks.svelte @@ -1,4 +1,23 @@ - \ No newline at end of file + export let width = "w-6" + + + + + + + + diff --git a/Front/src/components/scrollbutton.svelte b/Front/src/components/scrollbutton.svelte index 7c98c3f..ee70a97 100644 --- a/Front/src/components/scrollbutton.svelte +++ b/Front/src/components/scrollbutton.svelte @@ -1,27 +1,28 @@ - \ No newline at end of file + diff --git a/Front/src/components/settingsmodals/_2fa.svelte b/Front/src/components/settingsmodals/_2fa.svelte index a80ba52..211382c 100644 --- a/Front/src/components/settingsmodals/_2fa.svelte +++ b/Front/src/components/settingsmodals/_2fa.svelte @@ -1,60 +1,66 @@ - } +
+
Confirm 2FA
- - -
- -
Confirm 2FA
+ {qrcode} - {qrcode} - -
- -
{message.message??""}
-
- - - - - -
- \ No newline at end of file +
+ +
+ {message.message ?? ""} +
+
+ + +
diff --git a/Front/src/components/settingsmodals/changepassword.svelte b/Front/src/components/settingsmodals/changepassword.svelte index faab9b3..21db493 100644 --- a/Front/src/components/settingsmodals/changepassword.svelte +++ b/Front/src/components/settingsmodals/changepassword.svelte @@ -1,60 +1,78 @@
+
Change Password
-
Change Password
- -
- - - -
{message.message??""}
-
- - - - +
+ + + +
+ {message.message ?? ""} +
+
+
diff --git a/Front/src/components/skybanner.svelte b/Front/src/components/skybanner.svelte index a90729f..f5807e2 100644 --- a/Front/src/components/skybanner.svelte +++ b/Front/src/components/skybanner.svelte @@ -1,28 +1,35 @@ {#if loading} - + {/if} - {loading = false}} alt="Ad" src={imageUrl}/> \ No newline at end of file + + { + loading = false + }} + alt="Ad" + src={imageUrl} /> + diff --git a/Front/src/components/statusbubble.svelte b/Front/src/components/statusbubble.svelte index 1278e9b..f2c7ae4 100644 --- a/Front/src/components/statusbubble.svelte +++ b/Front/src/components/statusbubble.svelte @@ -1,22 +1,29 @@ - export let size: string; - export let status = "Offline" - export let userid = "0" - export let gameid = "0" - export let offline = false - export let customclass = "" -$:if (status === "Offline"){ - offline = true -} - - {#if status === "Offline"} -
- +{#if status === "Offline"} +
+
{:else if status === "Online"} -
-{:else if status.includes('Playing') === true} -
-{/if} \ No newline at end of file +
+
+{:else if status.includes("Playing") === true} + +
+
+
+{/if} diff --git a/Front/src/components/usercard.svelte b/Front/src/components/usercard.svelte index e1e2d88..7d2ae8d 100644 --- a/Front/src/components/usercard.svelte +++ b/Front/src/components/usercard.svelte @@ -1,69 +1,68 @@ -
- -
- -
{username}
-
-
- {#if friendRequest === true} - -
- - +
+ +
+ +
{username}
+
+
+ {#if friendRequest === true} +
+ - - -
- - {/if} - - -
\ No newline at end of file + +
+ {/if} +
diff --git a/Front/src/hooks.server.ts b/Front/src/hooks.server.ts index f1d00dd..6a232c1 100644 --- a/Front/src/hooks.server.ts +++ b/Front/src/hooks.server.ts @@ -1,36 +1,45 @@ import { authenticateUser } from "$lib/auth" import { redirect, type Handle } from "@sveltejs/kit" const protectedroutes = [ - '/home', - '/catalog', - '/develop', - '/users', - '/avatar', - '/settings', - '/admin' + "/home", + "/catalog", + "/develop", + "/users", + "/avatar", + "/settings", + "/admin", ] export const handle: Handle = async ({ event, resolve }) => { // Stage 1 event.locals.user = await authenticateUser(event) - event.locals.jwt = event.cookies.get('jwt')??"" - event.locals.useragent = event.request.headers.get('user-agent') + event.locals.jwt = event.cookies.get("jwt") ?? "" + event.locals.useragent = event.request.headers.get("user-agent") //console.log(event.locals.user) - if (protectedroutes.includes(event.url.pathname) === true || protectedroutes.some(substr => event.url.pathname.toLowerCase().startsWith(substr.toLowerCase())) === true) { + if ( + protectedroutes.includes(event.url.pathname) === true || + protectedroutes.some(substr => + event.url.pathname.toLowerCase().startsWith(substr.toLowerCase()), + ) === true + ) { if (!event.locals.user) { throw redirect(303, "/") } - if (event.locals.user?.moderationstatus && event.locals.user.moderationstatus?.status.toUpperCase() != "OK" && event.url.pathname != "moderated"){ - throw redirect(303, '/moderated') + if ( + event.locals.user?.moderationstatus && + event.locals.user.moderationstatus?.status.toUpperCase() != "OK" && + event.url.pathname != "moderated" + ) { + throw redirect(303, "/moderated") } } - if (event.url.pathname.toLowerCase().startsWith('/admin') === true){ + if (event.url.pathname.toLowerCase().startsWith("/admin") === true) { // admin route if (!event.locals.user) { throw redirect(303, "/") } - if (event.locals.user.admin === false){ + if (event.locals.user.admin === false) { throw redirect(303, "/") } } @@ -39,11 +48,17 @@ export const handle: Handle = async ({ event, resolve }) => { // Stage 3 //console.log(event.url.protocol) - if (event.url.protocol === 'https:'){ - response.headers.append("Content-Security-Policy","img-src 'self' data: wsrv.nl images.weserv.nl;upgrade-insecure-requests;") - }else{ - response.headers.append("Content-Security-Policy","img-src 'self' data: wsrv.nl images.weserv.nl;") + if (event.url.protocol === "https:") { + response.headers.append( + "Content-Security-Policy", + "img-src 'self' data: wsrv.nl images.weserv.nl;upgrade-insecure-requests;", + ) + } else { + response.headers.append( + "Content-Security-Policy", + "img-src 'self' data: wsrv.nl images.weserv.nl;", + ) } return response -} \ No newline at end of file +} diff --git a/Front/src/lib/auth.ts b/Front/src/lib/auth.ts index 43defed..fb2bbd9 100644 --- a/Front/src/lib/auth.ts +++ b/Front/src/lib/auth.ts @@ -7,19 +7,22 @@ export const authenticateUser = async (event: RequestEvent) => { // get the user token from the cookie const userToken = cookies.get("jwt") - if (!userToken){ + if (!userToken) { return null } // if the user token is not valid, return null // this is where you would check the user token against your database // to see if it is valid and return the user object - const res = await fetch("http://mete0r.xyz/api/auth",{credentials: 'include', headers: {cookie: "jwt="+userToken,route: route.id as string}}) - const data = await res.json() - if (!data.error){ - return data - }else if (data.moderationstatus){ + const res = await fetch("http://mete0r.xyz/api/auth", { + credentials: "include", + headers: { cookie: "jwt=" + userToken, route: route.id as string }, + }) + const data = await res.json() + if (!data.error) { + return data + } else if (data.moderationstatus) { return data } - + return null -} \ No newline at end of file +} diff --git a/Front/src/lib/avatarstore.ts b/Front/src/lib/avatarstore.ts index 5c7f377..52cc1a5 100644 --- a/Front/src/lib/avatarstore.ts +++ b/Front/src/lib/avatarstore.ts @@ -1,3 +1,3 @@ -import { writable } from 'svelte/store'; +import { writable } from "svelte/store" -export const avatarstore = writable(""); \ No newline at end of file +export const avatarstore = writable("") diff --git a/Front/src/lib/coinstore.ts b/Front/src/lib/coinstore.ts index 9ff71d2..13ca76f 100644 --- a/Front/src/lib/coinstore.ts +++ b/Front/src/lib/coinstore.ts @@ -1,3 +1,3 @@ -import { writable } from 'svelte/store'; +import { writable } from "svelte/store" -export const coinstore = writable(0); \ No newline at end of file +export const coinstore = writable(0) diff --git a/Front/src/lib/url.ts b/Front/src/lib/url.ts index 5a61e38..a4fbd93 100644 --- a/Front/src/lib/url.ts +++ b/Front/src/lib/url.ts @@ -1,3 +1,3 @@ -import { browser } from '$app/environment'; +import { browser } from "$app/environment" -export const url = !browser ? "http://mete0r.xyz": "" // if no browser return "http://mete0r.xyz" otherwise nothing \ No newline at end of file +export const url = !browser ? "http://mete0r.xyz" : "" // if no browser return "http://mete0r.xyz" otherwise nothing diff --git a/Front/src/routes/+error.svelte b/Front/src/routes/+error.svelte index ac93e1f..76ecbab 100644 --- a/Front/src/routes/+error.svelte +++ b/Front/src/routes/+error.svelte @@ -1,15 +1,18 @@ - + import { page } from "$app/stores" +
-
-

{$page.status} :(

-
Oops!
-
{$page?.error?.message}
- - - -
-
\ No newline at end of file +
+

{$page.status} :(

+
Oops!
+
{$page?.error?.message}
+ +
+ diff --git a/Front/src/routes/+layout.server.ts b/Front/src/routes/+layout.server.ts index 63efa3a..cd8db61 100644 --- a/Front/src/routes/+layout.server.ts +++ b/Front/src/routes/+layout.server.ts @@ -1,47 +1,55 @@ -import { redirect } from '@sveltejs/kit'; -import type { LayoutServerLoad } from './$types'; +import { redirect } from "@sveltejs/kit" +import type { LayoutServerLoad } from "./$types" const protectedroutes = [ - '/home', - '/catalog', - '/develop', - '/users', - '/avatar', - '/settings', - '/admin' + "/home", + "/catalog", + "/develop", + "/users", + "/avatar", + "/settings", + "/admin", ] - -export const load: LayoutServerLoad = (async ({ url, locals }) => { - //console.log(locals) - //await parent; - if (!locals.user){ - if (protectedroutes.includes(url.pathname) === true || protectedroutes.some(substr => url.pathname.toLowerCase().startsWith(substr.toLowerCase())) === true){ - throw redirect(303, "/") - } - } - if (locals.user?.moderationstatus && locals?.user?.moderationstatus?.status.toUpperCase() != "OK" && url.pathname != '/moderated'){ - throw redirect(303, '/moderated') - } - if (url.pathname.toLowerCase().startsWith('/admin') === true){ +export const load: LayoutServerLoad = (async ({ url, locals }) => { + //console.log(locals) + //await parent; + if (!locals.user) { + if ( + protectedroutes.includes(url.pathname) === true || + protectedroutes.some(substr => + url.pathname.toLowerCase().startsWith(substr.toLowerCase()), + ) === true + ) { + throw redirect(303, "/") + } + } + + if ( + locals.user?.moderationstatus && + locals?.user?.moderationstatus?.status.toUpperCase() != "OK" && + url.pathname != "/moderated" + ) { + throw redirect(303, "/moderated") + } + if (url.pathname.toLowerCase().startsWith("/admin") === true) { // admin route if (!locals.user) { throw redirect(303, "/") } - if (locals.user.admin === false){ + if (locals.user.admin === false) { throw redirect(303, "/") } } - if (url.pathname === "/" && locals.user){ + if (url.pathname === "/" && locals.user) { throw redirect(303, "/home") } - return { - user: locals.user, - jwt : locals.jwt, + return { + user: locals.user, + jwt: locals.jwt, useragent: locals.useragent, protocol: url.protocol, - url: url.pathname - } -}) satisfies LayoutServerLoad; - + url: url.pathname, + } +}) satisfies LayoutServerLoad diff --git a/Front/src/routes/+layout.svelte b/Front/src/routes/+layout.svelte index 3812886..8360c25 100644 --- a/Front/src/routes/+layout.svelte +++ b/Front/src/routes/+layout.svelte @@ -1,18 +1,28 @@ + - Meteorite - { ( (data?.url?.replace("/",""))?.[0]?.toUpperCase() + data?.url?.slice(2) )?.split("/")?.[0] } - - - + + gtag("config", "G-Z3QGF9XQM4") + - - + +
-
+
- -
- -
-
- -
- -
-
- -
- -
-
-
- {search = previousearch}} placeholder="Search" class="input input-bordered input-primary pr-8 w-full rounded-none" maxlength=50 required> - {#if search} - {search=""}} class="w-8 h-8 absolute inset-y-0 right-0 pt-2 pr-3" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> - {:else} - - {/if} -
-{#if search} - - -{/if} + +
+ +
+
+ +
+ +
+
+ +
+ +
+
+
+ { + search = previousearch + }} + placeholder="Search" + class="input input-bordered input-primary pr-8 w-full rounded-none" + maxlength="50" + required /> + {#if search} + { + search = "" + }} + class="w-8 h-8 absolute inset-y-0 right-0 pt-2 pr-3" + xmlns="http://www.w3.org/2000/svg" + width="24" + height="24" + viewBox="0 0 24 24" + fill="none" + stroke="currentColor" + stroke-width="2" + stroke-linecap="round" + stroke-linejoin="round"> + + + + {:else} + + + + + {/if} +
+ {#if search} + + {/if}
@@ -165,92 +255,220 @@ listenCookieChange(async ()=> { - - - meteorite - - - + + + + + + meteorite + + + - {#if data.user} - - {coins??"0"} + {#if data.user} + + {coins ?? "0"} - -