diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..5981e49
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+node_modules
+.prettierignore
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..d61f7c0
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2022 Harry
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..6054a9d
--- /dev/null
+++ b/README.md
@@ -0,0 +1,24 @@
+# GTA V OPT-X
+
+Optimize/Boost your GTA V FPS according to your PC configuration! You just need NodeJS preinstalled. This works with GTA V online/offline on **Steam, EpicGames, Rockstar** and any other version!
+
+![OPTX](./screenshot.jpg)
+
+# Usage
+
+After installing NodeJS, just run the below command to get started. After that proceed with your prefered configuration.
+
+```npm
+npx goptx
+```
+
+# Support
+
+If you found this useful, consider buying me a coffee and starring this repo ⭐
+
+
+
+
+
+
+This was inspired by ▶️ [GTA V: Dramatically increase performance / FPS with any setup! / Best Settings! GTA 5 Ceyo Perico by Panjno](https://www.youtube.com/watch?v=XvAueyGJTt0)
diff --git a/bin/index.js b/bin/index.js
new file mode 100644
index 0000000..fd7b13c
--- /dev/null
+++ b/bin/index.js
@@ -0,0 +1,146 @@
+#! /usr/bin/env node
+
+import dialog from "node-file-dialog";
+import chalk from "chalk";
+import boxen from "boxen";
+
+import {
+ createSettings,
+ createValues,
+ setHPET,
+ writeCommandFile,
+} from "../lib/index.js";
+
+import inquirer from "inquirer";
+import "./intro.js";
+
+const config = { type: "directory" };
+
+var optimizationConfig = {
+ opt: ["Settings", "Registry", "Disable HPET"],
+ tier: 2,
+ level: 1,
+};
+var gameFolder = "";
+var procCount = false;
+var procCountDone = 0;
+
+inquirer
+ .prompt([
+ {
+ type: "checkbox",
+ name: "opt-list",
+ message: "Check all the optimization you want to do right now",
+ choices: ["Settings", "Registry", "Disable HPET"],
+ checked: true,
+ },
+ {
+ type: "rawlist",
+ name: "pc-tier",
+ message: "What's your PC configuration?",
+ choices: ["Ultra-Low-End", "Low-End", "Mid-End", "High-End"],
+ },
+ {
+ type: "rawlist",
+ name: "config-level",
+ message: "Which optimization would you use?",
+ choices: [
+ "Recomended for Most PCs",
+ "Good PC but shutters",
+ "Best FPS with low visual",
+ ],
+ },
+ ])
+
+ .then(
+ (answers) => {
+ var pc_tier = answers["pc-tier"];
+ var pc_opt = answers["opt-list"];
+ var pc_level = answers["config-level"];
+
+ if (pc_opt.length) {
+ optimizationConfig.opt = pc_opt;
+ }
+
+ if (pc_tier === "Low-End") {
+ optimizationConfig.tier = 2;
+ } else if (pc_tier === "Ultra-Low-End") {
+ optimizationConfig.tier = 1;
+ } else if (pc_tier === "High-End") {
+ optimizationConfig.tier = 4;
+ } else {
+ optimizationConfig.tier = 3;
+ }
+
+ if (pc_level === "Good PC but shutters") {
+ optimizationConfig.level = 2;
+ } else if (pc_level === "Best FPS with low visual") {
+ optimizationConfig.level = 3;
+ } else {
+ optimizationConfig.level = 1;
+ }
+
+ console.log(
+ "\nNow, you have to choose your game directory to continue. Press any key to go on!"
+ );
+
+ process.stdin.setRawMode(true);
+ process.stdin.resume();
+ process.stdin.once("data", function () {
+ dialog(config)
+ .then(async (dir) => {
+ gameFolder = dir[0];
+
+ procCount = optimizationConfig.opt.length + 1;
+
+ writeCommandFile(gameFolder, optimizationConfig.level, (t) => {
+ logStatus(t, "Creating commndline file ");
+ });
+
+ if (optimizationConfig.opt.includes("Settings")) {
+ createSettings(optimizationConfig.tier, (t) => {
+ logStatus(t, "Editing Settings Configuration");
+ });
+ }
+ if (optimizationConfig.opt.includes("Registry")) {
+ await createValues(optimizationConfig, (t) => {
+ logStatus(t, "Creating Registry Values");
+ });
+ }
+ if (optimizationConfig.opt.includes("Disable HPET")) {
+ setHPET((t) => {
+ logStatus(t, "Disabling HPET");
+ });
+ }
+ })
+ .catch((err) => {
+ console.log("No directory was selected! Aborting..");
+ process.exit();
+ });
+ });
+ },
+ function (err) {
+ console.log("we died! %s", err);
+ }
+ );
+
+function logStatus(s, t) {
+ procCountDone = procCountDone + 1;
+ s ? (s = chalk.green("Success")) : chalk.red("Failed!");
+ console.log(chalk.gray(procCountDone + "/" + procCount) + " " + t + ": " + s);
+ checkProcCount();
+}
+
+function checkProcCount() {
+ if (procCountDone === procCount) {
+ console.log(
+ "\n" +
+ chalk.yellow(
+ boxen(
+ "If this really helped you, please consider buying me a coffee :) https://buymeacoffee.com/harrytom"
+ )
+ )
+ );
+ process.exit();
+ }
+}
diff --git a/bin/intro.js b/bin/intro.js
new file mode 100644
index 0000000..5201e76
--- /dev/null
+++ b/bin/intro.js
@@ -0,0 +1,19 @@
+import chalk from "chalk";
+import boxen from "boxen";
+
+const introText = ` ) ( )
+ ( * ) ( ( /( )\\ ) * ) ( /(
+ )\\ ) ' ) /( )\\ ( ( )\\()) (()/(' ) /( )\\())
+(()/( ( )(_))((((_)( )\\ )\\ ((_)\\ /(_))( )(_))((_)\
+ /(_))_ (_(_()) )\\ _ )\\ ((_)((_) ((_) (_)) (_(_()) __((_)
+(_)) __||_ _| (_)_\\(_) \\ \\ / / / _ \\ | _ \\|_ _| \\ \\/ /
+ | (_ | | | / _ \\ \\ V / | (_) || _/ | | > <
+ \\___| |_| /_/ \\_\\ \\_/ \\___/ |_| |_| /_/\\_\\`;
+
+const caption = `Optimize/Boost your GTA V FPS according to your PC configuration!\nMade by ${chalk.blue(
+ "Harry"
+)} (https://github.com/Harry260)`;
+
+console.log(chalk.green(introText));
+console.log("\r\n");
+console.log(boxen(caption), "\r\n");
diff --git a/lib/HPET.js b/lib/HPET.js
new file mode 100644
index 0000000..2a68e83
--- /dev/null
+++ b/lib/HPET.js
@@ -0,0 +1,11 @@
+import { execSync } from "child_process";
+
+export default function setHPET(callback = console.log) {
+ try {
+ execSync("bcdedit /deletevalue useplatformclock", {
+ encoding: "utf-8",
+ });
+ } catch {
+ callback(true);
+ }
+}
diff --git a/lib/commands.js b/lib/commands.js
new file mode 100644
index 0000000..cb54e18
--- /dev/null
+++ b/lib/commands.js
@@ -0,0 +1,40 @@
+import fs from "fs";
+import chalk from "chalk";
+
+var commands = {
+ 1: `-borderless
+-FrameQueueLimit 0
+-DX11`,
+ 2: `-noquanttransform
+-borderless
+-FrameQueueLimit 1
+-DX11
+-disableHyperthreading`,
+ 3: `-noquanttransform
+-fullscreen
+-FrameQueueLimit 1
+-DX10
+-cityDensity 0.3
+-anisotropicQualityLevel 0
+-grassQuality 0
+-hdr
+-lodScale 0.0
+-noInGameDOF
+-particalQuality 0
+-pedLodBias 0.0
+-postFX 0
+-reflectionQuality 0
+-shaderQuality 0
+-vehicleLodBias 0.0`,
+};
+
+export default function writeCommandFile(gf, level, callback = console.log) {
+ console.log("Set Game directory to: ", chalk.gray(gf), "\n");
+ fs.writeFile(gf + "/commandline.txt", commands[level], function (err) {
+ if (err) {
+ callback(false);
+ } else {
+ callback(true);
+ }
+ });
+}
diff --git a/lib/index.js b/lib/index.js
new file mode 100644
index 0000000..352efcc
--- /dev/null
+++ b/lib/index.js
@@ -0,0 +1,4 @@
+export { default as createValues } from "../lib/registry.js";
+export { default as setHPET } from "../lib/HPET.js";
+export { default as createSettings } from "../lib/settings.js";
+export { default as writeCommandFile } from "../lib/commands.js";
diff --git a/lib/registry.js b/lib/registry.js
new file mode 100644
index 0000000..047bd4e
--- /dev/null
+++ b/lib/registry.js
@@ -0,0 +1,99 @@
+import regedit from "regedit";
+
+export default async function createValues(
+ config = {
+ opt: ["Settings", "Registry", "Disable HPET"],
+ tier: 2,
+ level: 1,
+ },
+ callback = console.log
+) {
+ try {
+ await regedit.putValue(
+ {
+ "HKCU\\System\\GameConfigStore": {
+ GameDVR_Enabled: {
+ value: "00000000",
+ type: "REG_DWORD",
+ },
+ GameDVR_HonorUserFSEBehaviorMode: {
+ value: "00000001",
+ type: "REG_DWORD",
+ },
+ GameDVR_DXGIHonorFSEWindowsCompatible: {
+ value: "00000001",
+ type: "REG_DWORD",
+ },
+ GameDVR_FSEBehaviorMode: {
+ value: "00000002",
+ type: "REG_DWORD",
+ },
+ GameDVR_FSEBehavior: {
+ value: "00000002",
+ type: "REG_DWORD",
+ },
+ },
+
+ "HKLM\\SOFTWARE\\Microsoft\\PolicyManager\\default\\ApplicationManagement\\AllowGameDVR":
+ {
+ value: {
+ value: "00000000",
+ type: "REG_DWORD",
+ },
+ },
+ "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Multimedia\\SystemProfile\\Tasks\\Games":
+ {
+ "GPU Priority": {
+ value: "00000008",
+ type: "REG_DWORD",
+ },
+ Priority: {
+ value: "00000006",
+ type: "REG_DWORD",
+ },
+ "Scheduling Category": {
+ value: "High",
+ type: "REG_SZ",
+ },
+ "SFIO Priority": {
+ value: "High",
+ type: "REG_SZ",
+ },
+ },
+ },
+ () => {}
+ );
+
+ if (config.tier === 1 || config.tier === 2 || config.tier === 3) {
+ await regedit.putValue(
+ {
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Multimedia\\SystemProfile":
+ {
+ SystemResponsiveness: {
+ value: "00000001",
+ type: "REG_DWORD",
+ },
+ },
+ },
+ () => {}
+ );
+ } else {
+ await regedit.putValue(
+ {
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Multimedia\\SystemProfile":
+ {
+ SystemResponsiveness: {
+ value: "00000000",
+ type: "REG_DWORD",
+ },
+ },
+ },
+ () => {}
+ );
+ }
+
+ callback(true);
+ } catch (error) {
+ callback(false);
+ }
+}
diff --git a/lib/settings-xml.js b/lib/settings-xml.js
new file mode 100644
index 0000000..6f8dc13
--- /dev/null
+++ b/lib/settings-xml.js
@@ -0,0 +1,6 @@
+export default {
+ 4: `SMC_AUTO `,
+ 3: `SMC_AUTO `,
+ 2: `SMC_AUTO `,
+ 1: `SMC_AUTO `,
+};
diff --git a/lib/settings.js b/lib/settings.js
new file mode 100644
index 0000000..b79c9f9
--- /dev/null
+++ b/lib/settings.js
@@ -0,0 +1,86 @@
+import os, { type } from "os";
+import fs from "fs";
+import inquirer from "inquirer";
+import chalk from "chalk";
+import { XMLParser, XMLBuilder } from "fast-xml-parser";
+import settingsXml from "./settings-xml.js";
+
+var config = {
+ tier: 3,
+ callback: console.log,
+ filepath: "",
+};
+
+const options = {
+ ignoreAttributes: false,
+ format: true,
+};
+
+function createSettingsFile() {
+ fs.readFile(config.filepath, "utf8", function (err, xmlDataStr) {
+ if (err) {
+ config.callback(false);
+ }
+
+ const parser = new XMLParser(options);
+ let SettingObj = parser.parse(xmlDataStr);
+ var videoCard = SettingObj.Settings.VideoCardDescription;
+
+ let NewSettingsObj = parser.parse(settingsXml[config.tier]);
+ NewSettingsObj.Settings.VideoCardDescription = videoCard;
+
+ const builder = new XMLBuilder(options);
+ const output = builder.build(NewSettingsObj);
+
+ fs.writeFile(config.filepath, output, function (err) {
+ if (err) {
+ config.callback(false);
+ } else {
+ config.callback(true);
+ }
+ });
+ fs.writeFile(config.filepath + ".backup.xml", xmlDataStr, () => {});
+ });
+}
+
+function checkPath(path) {
+ if (fs.existsSync(path)) {
+ config.filepath = path;
+ createSettingsFile();
+ } else {
+ console.log(
+ chalk.red("Couldn't find the GTA V settings path."),
+ `Type ${chalk.blue("A")} to abort or type the path to ${chalk.blue(
+ "settings.xml"
+ )} file`
+ );
+
+ AskPath();
+ }
+}
+
+function AskPath() {
+ inquirer
+ .prompt([
+ {
+ type: "message",
+ name: "path",
+ message: `Path to ${chalk.blue("settings.xml")}: `,
+ },
+ ])
+ .then((answers) => {
+ if (answers.path.toLowerCase() === "a") {
+ callback(false);
+ } else {
+ checkPath(answers.path);
+ }
+ });
+}
+
+export default function createSettings(tier = 3, callback = console.log) {
+ var home = os.homedir();
+ var path = home + "\\Documents\\Rockstar Games\\GTA V\\settings.xml";
+ config.tier = tier;
+ config.callback = callback;
+ checkPath(path);
+}
diff --git a/lib/tempCodeRunnerFile.js b/lib/tempCodeRunnerFile.js
new file mode 100644
index 0000000..6bf0c97
--- /dev/null
+++ b/lib/tempCodeRunnerFile.js
@@ -0,0 +1 @@
+w
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..669031e
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,1165 @@
+{
+ "name": "gtav-optx",
+ "version": "1.0.0",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "gtav-optx",
+ "version": "1.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "boxen": "^7.0.0",
+ "chalk": "^5.1.2",
+ "fast-xml-parser": "^4.0.12",
+ "inquirer": "^9.1.4",
+ "node-file-dialog": "^1.0.3",
+ "regedit": "^5.1.1"
+ },
+ "bin": {
+ "optx": "index.js"
+ }
+ },
+ "node_modules/ansi-align": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
+ "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
+ "dependencies": {
+ "string-width": "^4.1.0"
+ }
+ },
+ "node_modules/ansi-align/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-align/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/ansi-align/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/ansi-align/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/ansi-escapes": {
+ "version": "6.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "6.0.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/bl": {
+ "version": "5.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "buffer": "^6.0.3",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
+ "node_modules/boxen": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz",
+ "integrity": "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==",
+ "dependencies": {
+ "ansi-align": "^3.0.1",
+ "camelcase": "^7.0.0",
+ "chalk": "^5.0.1",
+ "cli-boxes": "^3.0.0",
+ "string-width": "^5.1.2",
+ "type-fest": "^2.13.0",
+ "widest-line": "^4.0.1",
+ "wrap-ansi": "^8.0.1"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/boxen/node_modules/type-fest": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
+ "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "6.0.3",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.2.1"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.0.tgz",
+ "integrity": "sha512-JToIvOmz6nhGsUhAYScbo2d6Py5wojjNfoxoc2mEVLUdJ70gJK2gnd+ABY1Tc3sVMyK7QDPtN0T/XdlCQWITyQ==",
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "5.1.2",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/chardet": {
+ "version": "0.7.0",
+ "license": "MIT"
+ },
+ "node_modules/cli-boxes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz",
+ "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-cursor": {
+ "version": "4.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "restore-cursor": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-spinners": {
+ "version": "2.7.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-width": {
+ "version": "4.0.0",
+ "license": "ISC",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/clone": {
+ "version": "1.0.4",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "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/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/defaults": {
+ "version": "1.0.4",
+ "license": "MIT",
+ "dependencies": {
+ "clone": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "license": "MIT"
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "license": "MIT"
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "5.0.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/external-editor": {
+ "version": "3.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "chardet": "^0.7.0",
+ "iconv-lite": "^0.4.24",
+ "tmp": "^0.0.33"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/fast-xml-parser": {
+ "version": "4.0.12",
+ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.12.tgz",
+ "integrity": "sha512-/Nmo3823Rfx7UTJosQNz6hBVbszfv1Unb7A4iNJZhvCGCgtIHv/uODmrYIH8vc05+XKZ4hNIOv6SlBejvJgATw==",
+ "dependencies": {
+ "strnum": "^1.0.5"
+ },
+ "bin": {
+ "fxparser": "src/cli/cli.js"
+ },
+ "funding": {
+ "type": "paypal",
+ "url": "https://paypal.me/naturalintelligence"
+ }
+ },
+ "node_modules/figures": {
+ "version": "5.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "escape-string-regexp": "^5.0.0",
+ "is-unicode-supported": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/if-async": {
+ "version": "3.7.4",
+ "resolved": "https://registry.npmjs.org/if-async/-/if-async-3.7.4.tgz",
+ "integrity": "sha512-BFEH2mZyeF6KZKaKLVPZ0wMjIiWOdjvZ7zbx8ENec0qfZhJwKFbX/4jKM5LTKyJEc/GOqUKiiJ2IFKT9yWrZqA=="
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "license": "ISC"
+ },
+ "node_modules/inquirer": {
+ "version": "9.1.4",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-escapes": "^6.0.0",
+ "chalk": "^5.1.2",
+ "cli-cursor": "^4.0.0",
+ "cli-width": "^4.0.0",
+ "external-editor": "^3.0.3",
+ "figures": "^5.0.0",
+ "lodash": "^4.17.21",
+ "mute-stream": "0.0.8",
+ "ora": "^6.1.2",
+ "run-async": "^2.4.0",
+ "rxjs": "^7.5.7",
+ "string-width": "^5.1.2",
+ "strip-ansi": "^7.0.1",
+ "through": "^2.3.6",
+ "wrap-ansi": "^8.0.1"
+ },
+ "engines": {
+ "node": ">=12.0.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-interactive": {
+ "version": "2.0.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "1.3.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "license": "MIT"
+ },
+ "node_modules/log-symbols": {
+ "version": "5.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^5.0.0",
+ "is-unicode-supported": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "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/mute-stream": {
+ "version": "0.0.8",
+ "license": "ISC"
+ },
+ "node_modules/node-file-dialog": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/node-file-dialog/-/node-file-dialog-1.0.3.tgz",
+ "integrity": "sha512-hFOeuQHWk1f44jFI6LB7SxDWBRzN/RhLPTTn6PiD4qsRAwv7k5nWpmUbIpHkyIrJvM9Ekpwtz0dxF6zwYndK6g=="
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "license": "MIT",
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ora": {
+ "version": "6.1.2",
+ "license": "MIT",
+ "dependencies": {
+ "bl": "^5.0.0",
+ "chalk": "^5.0.0",
+ "cli-cursor": "^4.0.0",
+ "cli-spinners": "^2.6.1",
+ "is-interactive": "^2.0.0",
+ "is-unicode-supported": "^1.1.0",
+ "log-symbols": "^5.1.0",
+ "strip-ansi": "^7.0.1",
+ "wcwidth": "^1.0.1"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/os-tmpdir": {
+ "version": "1.0.2",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.0",
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/regedit": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/regedit/-/regedit-5.1.1.tgz",
+ "integrity": "sha512-NJ2OZ14czryt3RiQyMM/nptaiu0bF1CT+YVw0PBziMrLJyq8pdmIAvupi9E+NPWJLDJtyHDoKs5g5wcbP8ANIg==",
+ "dependencies": {
+ "debug": "^4.1.0",
+ "if-async": "^3.7.4",
+ "stream-slicer": "0.0.6",
+ "through2": "^0.6.3"
+ }
+ },
+ "node_modules/restore-cursor": {
+ "version": "4.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/run-async": {
+ "version": "2.4.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/rxjs": {
+ "version": "7.6.0",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "license": "MIT"
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "license": "ISC"
+ },
+ "node_modules/stream-slicer": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/stream-slicer/-/stream-slicer-0.0.6.tgz",
+ "integrity": "sha512-QsY0LbweYE5L+e+iBQgtkM5WUIf7+kCMA/m2VULv8rEEDDnlDPsPvOHH4nli6uaZOKQEt64u65h0l/eeZo7lCw=="
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "5.1.2",
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "7.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/strnum": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz",
+ "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA=="
+ },
+ "node_modules/through": {
+ "version": "2.3.8",
+ "license": "MIT"
+ },
+ "node_modules/through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==",
+ "dependencies": {
+ "readable-stream": ">=1.0.33-1 <1.1.0-0",
+ "xtend": ">=4.0.0 <4.1.0-0"
+ }
+ },
+ "node_modules/through2/node_modules/readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "node_modules/through2/node_modules/string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="
+ },
+ "node_modules/tmp": {
+ "version": "0.0.33",
+ "license": "MIT",
+ "dependencies": {
+ "os-tmpdir": "~1.0.2"
+ },
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.4.1",
+ "license": "0BSD"
+ },
+ "node_modules/type-fest": {
+ "version": "3.3.0",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "license": "MIT"
+ },
+ "node_modules/wcwidth": {
+ "version": "1.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "defaults": "^1.0.3"
+ }
+ },
+ "node_modules/widest-line": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz",
+ "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==",
+ "dependencies": {
+ "string-width": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "8.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "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"
+ }
+ }
+ },
+ "dependencies": {
+ "ansi-align": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
+ "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
+ "requires": {
+ "string-width": "^4.1.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
+ },
+ "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=="
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "ansi-escapes": {
+ "version": "6.0.0",
+ "requires": {
+ "type-fest": "^3.0.0"
+ }
+ },
+ "ansi-regex": {
+ "version": "6.0.1"
+ },
+ "ansi-styles": {
+ "version": "6.2.1"
+ },
+ "base64-js": {
+ "version": "1.5.1"
+ },
+ "bl": {
+ "version": "5.1.0",
+ "requires": {
+ "buffer": "^6.0.3",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
+ "boxen": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz",
+ "integrity": "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==",
+ "requires": {
+ "ansi-align": "^3.0.1",
+ "camelcase": "^7.0.0",
+ "chalk": "^5.0.1",
+ "cli-boxes": "^3.0.0",
+ "string-width": "^5.1.2",
+ "type-fest": "^2.13.0",
+ "widest-line": "^4.0.1",
+ "wrap-ansi": "^8.0.1"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
+ "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA=="
+ }
+ }
+ },
+ "buffer": {
+ "version": "6.0.3",
+ "requires": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.2.1"
+ }
+ },
+ "camelcase": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.0.tgz",
+ "integrity": "sha512-JToIvOmz6nhGsUhAYScbo2d6Py5wojjNfoxoc2mEVLUdJ70gJK2gnd+ABY1Tc3sVMyK7QDPtN0T/XdlCQWITyQ=="
+ },
+ "chalk": {
+ "version": "5.1.2"
+ },
+ "chardet": {
+ "version": "0.7.0"
+ },
+ "cli-boxes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz",
+ "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g=="
+ },
+ "cli-cursor": {
+ "version": "4.0.0",
+ "requires": {
+ "restore-cursor": "^4.0.0"
+ }
+ },
+ "cli-spinners": {
+ "version": "2.7.0"
+ },
+ "cli-width": {
+ "version": "4.0.0"
+ },
+ "clone": {
+ "version": "1.0.4"
+ },
+ "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=="
+ },
+ "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"
+ }
+ },
+ "defaults": {
+ "version": "1.0.4",
+ "requires": {
+ "clone": "^1.0.2"
+ }
+ },
+ "eastasianwidth": {
+ "version": "0.2.0"
+ },
+ "emoji-regex": {
+ "version": "9.2.2"
+ },
+ "escape-string-regexp": {
+ "version": "5.0.0"
+ },
+ "external-editor": {
+ "version": "3.1.0",
+ "requires": {
+ "chardet": "^0.7.0",
+ "iconv-lite": "^0.4.24",
+ "tmp": "^0.0.33"
+ }
+ },
+ "fast-xml-parser": {
+ "version": "4.0.12",
+ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.12.tgz",
+ "integrity": "sha512-/Nmo3823Rfx7UTJosQNz6hBVbszfv1Unb7A4iNJZhvCGCgtIHv/uODmrYIH8vc05+XKZ4hNIOv6SlBejvJgATw==",
+ "requires": {
+ "strnum": "^1.0.5"
+ }
+ },
+ "figures": {
+ "version": "5.0.0",
+ "requires": {
+ "escape-string-regexp": "^5.0.0",
+ "is-unicode-supported": "^1.2.0"
+ }
+ },
+ "iconv-lite": {
+ "version": "0.4.24",
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
+ "ieee754": {
+ "version": "1.2.1"
+ },
+ "if-async": {
+ "version": "3.7.4",
+ "resolved": "https://registry.npmjs.org/if-async/-/if-async-3.7.4.tgz",
+ "integrity": "sha512-BFEH2mZyeF6KZKaKLVPZ0wMjIiWOdjvZ7zbx8ENec0qfZhJwKFbX/4jKM5LTKyJEc/GOqUKiiJ2IFKT9yWrZqA=="
+ },
+ "inherits": {
+ "version": "2.0.4"
+ },
+ "inquirer": {
+ "version": "9.1.4",
+ "requires": {
+ "ansi-escapes": "^6.0.0",
+ "chalk": "^5.1.2",
+ "cli-cursor": "^4.0.0",
+ "cli-width": "^4.0.0",
+ "external-editor": "^3.0.3",
+ "figures": "^5.0.0",
+ "lodash": "^4.17.21",
+ "mute-stream": "0.0.8",
+ "ora": "^6.1.2",
+ "run-async": "^2.4.0",
+ "rxjs": "^7.5.7",
+ "string-width": "^5.1.2",
+ "strip-ansi": "^7.0.1",
+ "through": "^2.3.6",
+ "wrap-ansi": "^8.0.1"
+ }
+ },
+ "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-interactive": {
+ "version": "2.0.0"
+ },
+ "is-unicode-supported": {
+ "version": "1.3.0"
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
+ },
+ "lodash": {
+ "version": "4.17.21"
+ },
+ "log-symbols": {
+ "version": "5.1.0",
+ "requires": {
+ "chalk": "^5.0.0",
+ "is-unicode-supported": "^1.1.0"
+ }
+ },
+ "mimic-fn": {
+ "version": "2.1.0"
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "mute-stream": {
+ "version": "0.0.8"
+ },
+ "node-file-dialog": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/node-file-dialog/-/node-file-dialog-1.0.3.tgz",
+ "integrity": "sha512-hFOeuQHWk1f44jFI6LB7SxDWBRzN/RhLPTTn6PiD4qsRAwv7k5nWpmUbIpHkyIrJvM9Ekpwtz0dxF6zwYndK6g=="
+ },
+ "onetime": {
+ "version": "5.1.2",
+ "requires": {
+ "mimic-fn": "^2.1.0"
+ }
+ },
+ "ora": {
+ "version": "6.1.2",
+ "requires": {
+ "bl": "^5.0.0",
+ "chalk": "^5.0.0",
+ "cli-cursor": "^4.0.0",
+ "cli-spinners": "^2.6.1",
+ "is-interactive": "^2.0.0",
+ "is-unicode-supported": "^1.1.0",
+ "log-symbols": "^5.1.0",
+ "strip-ansi": "^7.0.1",
+ "wcwidth": "^1.0.1"
+ }
+ },
+ "os-tmpdir": {
+ "version": "1.0.2"
+ },
+ "readable-stream": {
+ "version": "3.6.0",
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ },
+ "regedit": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/regedit/-/regedit-5.1.1.tgz",
+ "integrity": "sha512-NJ2OZ14czryt3RiQyMM/nptaiu0bF1CT+YVw0PBziMrLJyq8pdmIAvupi9E+NPWJLDJtyHDoKs5g5wcbP8ANIg==",
+ "requires": {
+ "debug": "^4.1.0",
+ "if-async": "^3.7.4",
+ "stream-slicer": "0.0.6",
+ "through2": "^0.6.3"
+ }
+ },
+ "restore-cursor": {
+ "version": "4.0.0",
+ "requires": {
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ }
+ },
+ "run-async": {
+ "version": "2.4.1"
+ },
+ "rxjs": {
+ "version": "7.6.0",
+ "requires": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.2.1"
+ },
+ "safer-buffer": {
+ "version": "2.1.2"
+ },
+ "signal-exit": {
+ "version": "3.0.7"
+ },
+ "stream-slicer": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/stream-slicer/-/stream-slicer-0.0.6.tgz",
+ "integrity": "sha512-QsY0LbweYE5L+e+iBQgtkM5WUIf7+kCMA/m2VULv8rEEDDnlDPsPvOHH4nli6uaZOKQEt64u65h0l/eeZo7lCw=="
+ },
+ "string_decoder": {
+ "version": "1.3.0",
+ "requires": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "string-width": {
+ "version": "5.1.2",
+ "requires": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "7.0.1",
+ "requires": {
+ "ansi-regex": "^6.0.1"
+ }
+ },
+ "strnum": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz",
+ "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA=="
+ },
+ "through": {
+ "version": "2.3.8"
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==",
+ "requires": {
+ "readable-stream": ">=1.0.33-1 <1.1.0-0",
+ "xtend": ">=4.0.0 <4.1.0-0"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="
+ }
+ }
+ },
+ "tmp": {
+ "version": "0.0.33",
+ "requires": {
+ "os-tmpdir": "~1.0.2"
+ }
+ },
+ "tslib": {
+ "version": "2.4.1"
+ },
+ "type-fest": {
+ "version": "3.3.0"
+ },
+ "util-deprecate": {
+ "version": "1.0.2"
+ },
+ "wcwidth": {
+ "version": "1.0.1",
+ "requires": {
+ "defaults": "^1.0.3"
+ }
+ },
+ "widest-line": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz",
+ "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==",
+ "requires": {
+ "string-width": "^5.0.1"
+ }
+ },
+ "wrap-ansi": {
+ "version": "8.0.1",
+ "requires": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ }
+ },
+ "xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..0425cd3
--- /dev/null
+++ b/package.json
@@ -0,0 +1,35 @@
+{
+ "name": "goptx",
+ "version": "1.0.69",
+ "description": "Optimize/Boost your GTA V FPS according to your PC configuration",
+ "main": "./bin/index.js",
+ "scripts": {
+ "test": "node index.js",
+ "deploy": "optx"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/harry260/GTAV-OPTX.git"
+ },
+ "type": "module",
+ "keywords": [
+ "GTA-V"
+ ],
+ "dependencies": {
+ "boxen": "^7.0.0",
+ "chalk": "^5.1.2",
+ "fast-xml-parser": "^4.0.12",
+ "inquirer": "^9.1.4",
+ "node-file-dialog": "^1.0.3",
+ "regedit": "^5.1.1"
+ },
+ "bin": {
+ "goptx": "bin/index.js"
+ },
+ "author": "Harry",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/harry260/GTAV-OPTX/issues"
+ },
+ "homepage": "https://github.com/harry260/GTAV-OPTX#readme"
+}
diff --git a/screenshot.jpg b/screenshot.jpg
new file mode 100644
index 0000000..71d9a44
Binary files /dev/null and b/screenshot.jpg differ