diff --git a/.dockerignore b/.dockerignore
index 95fb17d0..8676f5d2 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -3,3 +3,4 @@ start.sh
setup.sh
.git/
node_modules/*
+make.bat
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 00000000..c217f9ef
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,52 @@
+---
+name: Bug report
+about: Create a report to help us improve
+title: ''
+labels: bug
+assignees: ''
+
+---
+
+**Describe the bug**
+A clear and concise description of what the bug is.
+
+**To Reproduce**
+Steps to reproduce the behavior:
+1. Go to '...'
+2. Click on '....'
+3. Scroll down to '....'
+4. See error
+
+**Expected behavior**
+A clear and concise description of what you expected to happen.
+
+**Screenshots**
+If applicable, add screenshots to help explain your problem.
+
+**Command Line Logs**
+Gitconvex displays logs in the command line. Please paste the error logs below
+
+```
+# Error Logs...
+```
+
+**Desktop (please complete the following information):**
+ - OS: [e.g. Linux]
+ - Browser [e.g. chrome, safari]
+ - Version [e.g. 2.0.0]
+
+**Issue Type**
+>mark with [x] to select the check box
+
+- [ ] UI Issue
+- [ ] Performance Issue
+- [ ] Feature Breaking Issue
+- [ ] Security Issue
+
+**Severity**
+>mark with [x] to select the check box
+
+- [ ] Critical (The application crashes / breaks completely)
+- [ ] High (Blocks you from performing an critical operation)
+- [ ] Moderate (Bearable or Manageable issue)
+- [ ] Low (Something is not right, but the impact is minimal)
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 00000000..bef36f48
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,20 @@
+---
+name: Feature request
+about: Suggest an idea for this project
+title: ''
+labels: Feature request
+assignees: neel1996
+
+---
+
+**Is your feature request related to a problem? Please describe.**
+A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
+
+**Describe the solution you'd like**
+A clear and concise description of what you want to happen.
+
+**Describe alternatives you've considered**
+A clear and concise description of any alternative solutions or features you've considered.
+
+**Additional context**
+Add any other context or screenshots about the feature request here.
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 07baef64..e24924dc 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -2,11 +2,12 @@ name: Gitconvex build deploy
on:
push:
- branches: [ master ]
+ branches: [ v2.0.0 ]
jobs:
build:
runs-on: ubuntu-latest
+ timeout-minutes: 60
steps:
- name: Set up Go 1.x
@@ -22,27 +23,25 @@ jobs:
run: |
go get -v -t -d ./...
- - name: Running Test Cases
- run: export GOTESTENV=ci && go test -v ./...
-
- - name: Build for windows
+ - name: Run test cases
run: |
- export GOOS=windows && GOARCH=amd64
- mkdir -p ./windows
- make build
- mv dist/ windows/
-
- - name: deploy gitconvex windows build bundles to S3
- uses: shallwefootball/upload-s3-action@v1.1.2
- with:
- aws_key_id: ${{ secrets.AWS_ACCESS_ID }}
- aws_secret_access_key: ${{ secrets.AWS_ACCESS_SECRET }}
- aws_bucket: ${{ secrets.AWS_BUCKET_URL }}
- source_dir: 'windows'
- destination_dir: 'windows'
-
- # Runs a set of commands using the runners shell
- - name: Run a multi-line script
+ export GOTESTENV=ci && go test -v ./...
+
+ - name: Run sample build
run: |
- echo Add other actions to build,
- echo test, and deploy your project.
+ go build -v
+
+ # Initiating build and S# deployment
+ - name: Starting S3 deployment script from droplet
+ uses: appleboy/ssh-action@master
+ with:
+ host: ${{ secrets.DROPLET_HOST }}
+ username: ${{ secrets.DROPLET_USERNAME }}
+ key: ${{ secrets.DROPLET_PRIVATE_KEY }}
+ port: ${{ secrets.DROPLET_PORT }}
+ script: |
+ /opt/workroom/aws-build/init-deploy.sh
+ /opt/workroom/aws-build/windows-deploy.sh
+ /opt/workroom/aws-build/linux-deploy.sh
+ /opt/workroom/aws-build/macos-deploy.sh
+ /opt/workroom/aws-build/cleanup.sh
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index bbcf0663..00000000
--- a/.gitignore
+++ /dev/null
@@ -1,7 +0,0 @@
-# Git ignore for gitconvex server
-
-node_modules/
-package-lock.json
-database/*
-tests/
-*.swp
diff --git a/API/addRepoApi.js b/API/addRepoApi.js
deleted file mode 100644
index 66f22743..00000000
--- a/API/addRepoApi.js
+++ /dev/null
@@ -1,128 +0,0 @@
-const { exec } = require("child_process");
-const path = require("path");
-const util = require("util");
-const execPromisified = util.promisify(exec);
-const fs = require("fs");
-const { getEnvData } = require("../utils/getEnvData");
-const { gitCommitLogToDb } = require("../utils/sqliteDbAccess");
-
-/**
- * @param {String} repoName - Name of the repository
- * @param {String} repoPath - Path were the repo is residing or where it should be cloned / initialized
- * @param {boolean} initCheck - Switch to check if user has selected repo init option
- * @param {boolean} cloneCheck - Switch to check if user has selected repo cloning option
- * @param {String} cloneUrl - The If cloning switch is true, then this holds the URL of the remote repo
- * @returns {Object} - created a new entry in the data file and retusn the status
- */
-
-async function addRepoHandler(
- repoName,
- repoPath,
- initCheck,
- cloneCheck,
- cloneUrl
-) {
- const timeStamp = new Date().toUTCString();
- const id = new Date().getTime();
-
- function errorResponse() {
- return {
- message: "REPO_WRITE_FAILED",
- };
- }
-
- function successResponse() {
- gitCommitLogToDb();
- return {
- message: "REPO_DATA_UPDATED",
- repoId: id,
- };
- }
-
- if (cloneCheck) {
- try {
- if (cloneUrl.match(/[^a-zA-Z0-9-_.~@#$%:/]/gi)) {
- throw new Error("Invalid clone URL string!");
- }
-
- if (repoName.match(/[^a-zA-Z0-9-_.\s]/gi)) {
- throw new Error("Invalid repo name string!");
- }
-
- const cloneStatus = await execPromisified(
- `git clone "${cloneUrl}" "./${repoName}"`,
- {
- cwd: repoPath,
- windowsHide: true,
- }
- )
- .then(({ stdout, stderr }) => {
- console.log(stdout);
- console.log(stderr);
- if (stdout || stderr) {
- console.log(stdout);
- return true;
- } else {
- return false;
- }
- })
- .catch((err) => {
- console.log(err);
- return false;
- });
-
- console.log("CLONE STAT : ", cloneStatus);
-
- if (cloneStatus) {
- if (repoPath.includes("\\")) {
- repoPath = repoPath + "\\" + repoName;
- } else {
- repoPath = repoPath + "/" + repoName;
- }
- } else {
- return errorResponse();
- }
- } catch (err) {
- console.log(err);
- return errorResponse();
- }
- }
-
- const repoObject = {
- id,
- timeStamp,
- repoName,
- repoPath,
- };
-
- const dataStoreFile = getEnvData().DATABASE_FILE;
-
- let fileData = fs.readFileSync(dataStoreFile);
- const repoData = fileData.toString();
-
- return await fs.promises
- .access(repoPath)
- .then(async () => {
- if (initCheck) {
- await execPromisified(`git init`, { cwd: repoPath, windowsHide: true });
- }
-
- if (repoData) {
- const existingData = JSON.parse(repoData);
-
- existingData.push(repoObject);
-
- fs.writeFileSync(dataStoreFile, JSON.stringify(existingData));
- return successResponse();
- } else {
- fs.writeFileSync(dataStoreFile, JSON.stringify([repoObject]));
- return successResponse();
- }
- })
- .catch((err) => {
- console.log(err);
- return errorResponse();
- });
-}
-
-module.exports.addRepoHandler = addRepoHandler;
diff --git a/API/branchCompareApi.js b/API/branchCompareApi.js
deleted file mode 100644
index 4f478dc2..00000000
--- a/API/branchCompareApi.js
+++ /dev/null
@@ -1,16 +0,0 @@
-const { gitBranchCompare } = require("../git/gitBranchCompare");
-const { getRepoPath } = require("../global/fetchGitRepoPath");
-
-async function branchCompareApi(repoId, baseBranch, compareBranch) {
- const repoPath = getRepoPath(repoId);
-
- if (baseBranch !== compareBranch) {
- return await gitBranchCompare(repoPath, baseBranch, compareBranch);
- } else {
- return {
- message: "Nothing to compare as the branches are the same",
- };
- }
-}
-
-module.exports.branchCompareApi = branchCompareApi;
diff --git a/API/codeFileViewApi.js b/API/codeFileViewApi.js
deleted file mode 100644
index 58c33fff..00000000
--- a/API/codeFileViewApi.js
+++ /dev/null
@@ -1,54 +0,0 @@
-const fs = require("fs");
-const path = require("path");
-const { getRepoPath } = require("../global/fetchGitRepoPath");
-const { gitFileBasedCommit } = require("../git/gitFileBasedCommit");
-const { isText } = require("istextorbinary");
-const { LangLine } = require("@itassistors/langline");
-
-async function codeFileViewApi(repoId, fileName) {
- const repoPath = await getRepoPath(repoId);
- const targetFile = path.join(repoPath, fileName);
- const langData = await new LangLine().withFile(targetFile);
- let fileContent = [];
-
- if (isText(targetFile)) {
- const commit = await gitFileBasedCommit(repoPath, targetFile);
-
- let fileData = await fs.promises
- .readFile(targetFile)
- .then((res) => {
- return res.toString();
- })
- .catch((err) => {
- console.log(err);
- return "";
- });
-
- if (langData && langData.name) {
- if (fileData) {
- fileContent = fileData.split("\n");
- return {
- codeFileDetails: {
- language: langData.name,
- fileData: fileContent,
- fileCommit: commit,
- prism: langData.prismIndicator
- ? langData.prismIndicator
- : "markdown",
- },
- };
- }
- } else {
- return {
- codeFileDetails: {
- language: "Invalid",
- fileData: fileContent,
- fileCommit: commit,
- prism: "markdown",
- },
- };
- }
- }
-}
-
-module.exports.codeFileViewApi = codeFileViewApi;
diff --git a/API/commitCompareApi.js b/API/commitCompareApi.js
deleted file mode 100644
index d1632b45..00000000
--- a/API/commitCompareApi.js
+++ /dev/null
@@ -1,16 +0,0 @@
-const { gitCommitCompare } = require("../git/gitCommitCompareApi");
-const { getRepoPath } = require("../global/fetchGitRepoPath");
-
-async function commitCompareApi(repoId, baseCommit, compareCommit) {
- const repoPath = getRepoPath(repoId);
-
- if (baseCommit !== compareCommit) {
- return await gitCommitCompare(repoPath, baseCommit, compareCommit);
- } else {
- return {
- message: "Nothing to compare as the commits are the same",
- };
- }
-}
-
-module.exports.commitCompareApi = commitCompareApi;
diff --git a/API/commitLogSearchApi.js b/API/commitLogSearchApi.js
deleted file mode 100644
index 87482e28..00000000
--- a/API/commitLogSearchApi.js
+++ /dev/null
@@ -1,58 +0,0 @@
-const sqlite = require("sqlite3").verbose();
-const path = require("path");
-const { gitCommitLogSearchHandler } = require("../git/gitCommitLogSearchApi");
-
-async function gitCommitLogDbSerchApi(repoId, searchCategory, searchKey) {
- let searchQuery = "";
- const db = new sqlite.Database(
- path.join(__dirname, "..", "/database/commitLogs.sqlite"),
- (err) => {
- if (err) {
- console.log("ERROR: Unable to open commit log SQLITE DB", err);
- }
- }
- );
-
- switch (searchCategory) {
- case "hash":
- searchQuery = `SELECT * FROM commitLog_${repoId} WHERE hash LIKE "${searchKey}%" LIMIT 10`;
- break;
- case "message":
- searchQuery = `SELECT * FROM commitLog_${repoId} WHERE commit_message LIKE "%${searchKey}%" LIMIT 10`;
- break;
- case "user":
- searchQuery = `SELECT * FROM commitLog_${repoId} WHERE author LIKE "%${searchKey}%" LIMIT 10`;
- break;
- default:
- searchQuery = `SELECT * FROM commitLog_${repoId} WHERE commit_message LIKE "%${searchKey}%" LIMIT 10`;
- break;
- }
-
- return new Promise((resolve, reject) => {
- db.all(searchQuery, [], async (err, rows) => {
- if (err) {
- console.log(err);
- reject("Database fetch error");
- }
- if (rows) {
- const hashArray = rows.map((row) => {
- return row.hash;
- });
- const commits = await gitCommitLogSearchHandler(repoId, hashArray)
- .then(async (res) => {
- console.log(await res.commits);
- return Promise.all(res.commits).then((commit) => {
- return commit;
- });
- })
- .catch((err) => {
- console.log(err);
- return [];
- });
- resolve(commits);
- }
- });
- });
-}
-
-module.exports.gitCommitLogDbSerchApi = gitCommitLogDbSerchApi;
diff --git a/API/deleteRepoApi.js b/API/deleteRepoApi.js
deleted file mode 100644
index 16bcb6d2..00000000
--- a/API/deleteRepoApi.js
+++ /dev/null
@@ -1,49 +0,0 @@
-const fs = require("fs");
-const path = require("path");
-const { getEnvData } = require("../utils/getEnvData");
-
-/**
- * @param {String} repoId - ID of the repo stored in the data file
- */
-
-
- async function deleteRepoApi(repoId) {
- const dataStoreFile = getEnvData().DATABASE_FILE;
-
- return await fs.promises
- .readFile(dataStoreFile)
- .then(async (data) => {
- const fileContent = JSON.parse(data.toString());
-
- if (fileContent && fileContent.length > 0) {
- let updatedData = fileContent.filter(({ id }) => {
- if (id.toString() === repoId.toString()) {
- return false;
- }
-
- return true;
- });
-
- return await fs.promises
- .writeFile(dataStoreFile, JSON.stringify(updatedData))
- .then(() => {
- return {
- status: "DELETE_SUCCESS",
- repoId,
- };
- });
- } else {
- return {
- status: "DELETE_FAILED",
- };
- }
- })
- .catch((err) => {
- console.log(err);
- return {
- status: "DELETE_FAILED",
- };
- });
-}
-
-module.exports.deleteRepoApi = deleteRepoApi;
diff --git a/API/fetchRepoApi.js b/API/fetchRepoApi.js
deleted file mode 100644
index 79b21228..00000000
--- a/API/fetchRepoApi.js
+++ /dev/null
@@ -1,40 +0,0 @@
-const fs = require("fs");
-const path = require("path");
-const { getEnvData } = require("../utils/getEnvData");
-
-/**
- * @returns {Object} - details about all the repos stored in the data file
- */
-
-async function fetchRepoHandler() {
- var repoDSContent = fs.readFileSync(getEnvData().DATABASE_FILE);
-
- repoDSContent = repoDSContent.toString();
-
- if (repoDSContent !== "") {
- let parsedData = JSON.parse(JSON.parse(JSON.stringify(repoDSContent)));
-
- let repoId = [];
- let repoName = [];
- let repoPath = [];
-
- parsedData.forEach((item) => {
- if (item) {
- repoId.push(item.id);
- repoName.push(item.repoName);
- repoPath.push(item.repoPath);
- }
- });
-
- const fetchRepo = {
- repoId,
- repoName,
- repoPath,
- };
- return fetchRepo;
- } else {
- return [];
- }
-}
-
-module.exports.fetchRepoHandler = fetchRepoHandler;
diff --git a/API/healthcheckApi.js b/API/healthcheckApi.js
deleted file mode 100644
index 49506374..00000000
--- a/API/healthcheckApi.js
+++ /dev/null
@@ -1,74 +0,0 @@
-const { exec } = require("child_process");
-const util = require("util");
-const execPromise = util.promisify(exec);
-const os = require("os");
-
-/**
- * @returns {Object} - Version of the required software and the platform on which the app is running
- */
-
-async function healthCheckHandler() {
- let healthCheckResults = {
- osCheck: "",
- gitCheck: "",
- nodeCheck: "",
- };
-
- healthCheckResults.osCheck = await checkStatus("OS").then((res) =>
- JSON.stringify(res)
- );
- healthCheckResults.gitCheck = await checkStatus("GIT").then((res) =>
- JSON.stringify(res)
- );
- healthCheckResults.nodeCheck = await checkStatus("NODE").then((res) =>
- JSON.stringify(res)
- );
-
- return { ...healthCheckResults };
-}
-
-/**
- * @param {String} param
- * @returns {Object} - Executes the shell command and returns the results
- */
-
-async function checkStatus(param) {
- var commandString = "";
-
- switch (param) {
- case "GIT":
- commandString = `git --version`;
- break;
- case "NODE":
- commandString = `node --version`;
- break;
- default:
- commandString = ` `;
- }
-
- return await execPromise(commandString, { windowsHide: true }).then((res) => {
- if (param === "OS") {
- return {
- code: "SUCCESS",
- status: `${param}_CHECK_PASSED`,
- message: os.platform().toString(),
- };
- } else {
- if (res.stderr) {
- return {
- code: "ERR",
- status: `${param}_CHECK_FAILURE`,
- message: res.stderr,
- };
- } else {
- return {
- code: "SUCCESS",
- status: `${param}_CHECK_PASSED`,
- message: res.stdout.trim(),
- };
- }
- }
- });
-}
-
-module.exports.healthCheckHandler = healthCheckHandler;
diff --git a/API/settingsApi.js b/API/settingsApi.js
deleted file mode 100644
index 2c7bd4f7..00000000
--- a/API/settingsApi.js
+++ /dev/null
@@ -1,135 +0,0 @@
-const fs = require("fs");
-const path = require("path");
-const { getEnvData } = require("../utils/getEnvData");
-
-/**
- * @returns {Object} - Path where the Data file is stored
- */
-
-const fetchDatabaseFile = async () => {
- const dbPath = getEnvData().DATABASE_FILE || "NO_DATABASE_FILE";
- console.log("Database File", dbPath);
- return {
- settingsDatabasePath: dbPath.toString(),
- };
-};
-
-/**
- * @returns {Array} - The array containing the list of all repos stored in the data file
- */
-
-const fetchRepoDetails = async () => {
- return await fs.promises
- .readFile(getEnvData().DATABASE_FILE)
- .then((res) => {
- const fileContent = res.toString();
- let parsedFileContent = [];
- if (fileContent.length > 0) {
- try {
- parsedFileContent = JSON.parse(fileContent);
- } catch (e) {
- console.log(e);
- parsedFileContent = [];
- }
- } else {
- fs.writeFileSync(getEnvData().DATABASE_FILE, "[]");
-
- return {
- settingsRepoDetails: [],
- };
- }
- return {
- settingsRepoDetails: parsedFileContent,
- };
- })
- .catch((err) => {
- if (err) {
- console.log(err);
- return {
- settingsRepoDetails: [],
- };
- }
- });
-};
-
-/**
- * @param {String} newFileName - A new JSON file for storing repo information
- * @returns {String} - updates the data file in config file and returns the status as string
- */
-
-const updateDbFile = async (newFileName) => {
- console.log("FILE NAME : ", newFileName);
-
- return await fs.promises
- .access(newFileName)
- .then(async (res) => {
- const envContent = fs
- .readFileSync(path.join(__dirname, "..", "env_config.json"))
- .toString();
-
- const parsedEnvContent = JSON.parse(envContent)[0];
- parsedEnvContent.databaseFile = newFileName.toString();
-
- console.log(JSON.stringify(parsedEnvContent));
-
- return await fs.promises
- .writeFile(
- path.join(__dirname, "..", "env_config.json"),
- JSON.stringify([parsedEnvContent])
- )
- .then(() => {
- return "DATAFILE_UPDATE_SUCCESS";
- })
- .catch((err) => {
- console.log(err);
- return "DATAFILE_UPDATE_FAILED";
- });
- })
- .catch((err) => {
- console.log(err);
- return "DATAFILE_UPDATE_FAILED";
- });
-};
-
-const getPortDetails = async () => {
- return { settingsPortDetails: Number(getEnvData().GITCONVEX_PORT) };
-};
-
-/**
- * @param {number} newPort - new port number for running gitconvex
- * @returns {String} - status string for updating the port
- */
-
-const updatePortDetails = async (newPort) => {
- if (!isNaN(newPort)) {
- const envContent = fs
- .readFileSync(path.join(__dirname, "..", "env_config.json"))
- .toString();
-
- const parsedEnvContent = JSON.parse(envContent)[0];
- parsedEnvContent.port = Number(newPort);
-
- console.log(JSON.stringify(parsedEnvContent));
-
- return await fs.promises
- .writeFile(
- path.join(__dirname, "..", "env_config.json"),
- JSON.stringify([parsedEnvContent])
- )
- .then(() => {
- return "PORT_UPDATE_SUCCESS";
- })
- .catch((err) => {
- console.log(err);
- return "PORT_UPDATE_FAILED";
- });
- } else {
- return "PORT_UPDATE_FAILED";
- }
-};
-
-module.exports.updateDbFile = updateDbFile;
-module.exports.fetchDatabaseFile = fetchDatabaseFile;
-module.exports.fetchRepoDetails = fetchRepoDetails;
-module.exports.updatePortDetails = updatePortDetails;
-module.exports.getPortDetails = getPortDetails;
diff --git a/DOCUMENTATION.md b/DOCUMENTATION.md
index d73fed41..e87ac3c1 100644
--- a/DOCUMENTATION.md
+++ b/DOCUMENTATION.md
@@ -1,10 +1,9 @@
# Introduction
-GitConvex is a web app for managing your git repositories. It is supported by Linux, Mac OS and Windows. The [latest version](https://github.com/neel1996/gitconvex-package/releases) of GitConvex supports git features such as initializing and tracking a git repo, staging and unstaging changes, committing changes, pushing changes to the selected remote and so on.
+GitConvex is a web app for managing your git repositories. It is supported by Linux, Mac OS and Windows. The [latest version](https://github.com/neel1996/gitconvex/releases) of GitConvex supports git features such as initializing and tracking a git repo, staging and unstaging changes, committing changes, pushing changes to the selected remote and so on.
The main goal of this platform is to act as a web-based alternative for Github desktop, but we are still in the starting stages, so we are not completely there yet (baby steps, right?)
## Table of Contents
[Requirements](#requirements)
[Download Options](#download-options)
-[Setup](#setup)
[Features available](#features-available)
[How to use](#how-to-use)
- [Adding a new repo](#adding-a-new-repo)
@@ -12,48 +11,41 @@ The main goal of this platform is to act as a web-based alternative for Github d
- [Add a new branch](#add-new-branch)
## Requirements
-1. [Node JS](https://nodejs.org/en/) (Version 12.0+)
-2. [Git](https://git-scm.com/) (Version 2.20+)
+1. [Git](https://git-scm.com/) (Version 2.20+)
+
+If you wish to build the application from source then install,
+ - [Node JS](https://nodejs.org/en/) (Version 12.0+)
+ - [go](https://golang.org/dl/)
+
## Download Options
- **Option-1:** Directly clone the repo from GitHub
-`git clone https://github.com/neel1996/gitconvex-package`
+`git clone https://github.com/neel1996/gitconvex`
-- **Option-2:** Downloading the zip file from the [releases](https://github.com/neel1996/gitconvex-package/releases).
+- **Option-2:** If you are into docker, then there is also a docker image available for gitconvex
+`docker pull itassistors/gitconvex`
-- **Option-3:** GitConvex is also available on `npm`. Install the package globally to run it directly from the command line
-`npm i -g @itassistors/gitconvex`
+- **Option-3:** Downloading the zip file from the [releases](https://github.com/neel1996/gitconvex/releases).
-This will install **GitConvex** as a global module and it can be started straight away from the command line with `gitconvex` command
-```
-$ gitconvex
-
-INFO: Checking for config file
-INFO: Config file is present
-INFO: Reading from config file /usr/lib/node_modules/@itassistors/gitconvex/env_config.json
-GitConvex API connected!
-
-Checking data file availability...
-INFO: Data file /usr/lib/node_modules/@itassistors/gitconvex/database/repo-datastore.json is present and it will be used as the active data file!
-You can change this under the settings menu
-GitConvex is running on port 9001
-Open http://localhost:9001/ to access GitConvex
```
-## Setup
+## Extract the downloaded zip file and execute the commands
-If either download **Option-1** or **Option-2** is opted, then the following steps need to be followed to setup GitConvex
-1. For installing all dependencies,
-`` $npm install ``
+$ cd gitconvex
-2. To start the server, either use normal node command
-`` $node server.js ``
-or use `pm2` by downloading it from npm - `npm i -g pm2` and start the module by executing the following command,
-`pm2 start ecosystem.config.js`
+# for Mac & Linux
+$ make build
+$ ./dist/gitconvex
+
+# for Windows
+$ ./make.bat build
+$ ./dist/gitconvex.exe
+```
## Features available
- Visualizing basic repo stats such as active branch, active remotes, number of files tracked etc
- Tracking modified files
- Creating new branches (provided there are no diverging changes)
- Initializing git inside a new repo and adding it to the platform tracker on the go
+- Secure clone option with authentication
- File difference tracker with syntax highlighting
- File explorer with repository navigation features
- Code view capability from in-build repository explorer
@@ -75,7 +67,7 @@ or use `pm2` by downloading it from npm - `npm i -g pm2` and start the module by

- Enter repo name and paste the repo path. If the folder is not a git repo then check the "*Check this if the folder is not a git repo*" checkbox to initialize git.
-
+
- The newly added repo will be displayed as a card in the dashboard

@@ -169,4 +161,4 @@ In "Git Difference" click on the modified file to see the difference. The platfo
## Help and Support
- Visit help section if you're facing an issue or need any help. If you have any queries or feedback, then discuss it in "Discord" or report an issue in GitHub.
-
+
diff --git a/Dockerfile b/Dockerfile
old mode 100755
new mode 100644
index e87a8dab..8e028cb7
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,23 +1,22 @@
-## Dockerfile for gitconvex
+FROM golang:1.15.5-alpine
-# If you are running the container from windows, make sure you map the host volume
-# ... while running container using the docker run command
+WORKDIR /go/src/github.com/neel1996/gitconvex-server
-# docker container run -t -d -p 9001:9001 --name gitconvex -v HOST_VOLUME:CONTAINER_VOLUME itassistors/gitconvex:TAG_VERSION
-
-FROM node:12.18.1-alpine3.12
-
-WORKDIR /opt/workroom/gitconvex-package
-
-COPY package*.json ./
+COPY . .
-RUN npm install
+RUN apk update && apk upgrade
+RUN apk add --update nodejs nodejs-npm
+RUN apk add git
-COPY . .
+RUN cd ui/ && \
+ npm install && \
+ export NODE_ENV=production && \
+ npm install tailwindcss postcss autoprefixer && \
+ npx tailwindcss build -o src/index.css -c src/tailwind.config.js && \
+ npm run build && \
+ mv build/ gitconvex-ui/ && \
+ mv gitconvex-ui/ ../
EXPOSE 9001
-RUN npm i -g pm2
-RUN apk update && apk add git
-
-CMD pm2-runtime ecosystem.config.js
+CMD go run /go/src/github.com/neel1996/gitconvex-server/server.go
diff --git a/Makefile b/Makefile
new file mode 100644
index 00000000..10d8ef48
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,47 @@
+get:
+ go get
+run:
+ go run server.go
+build-ui:
+ git clone https://github.com/neel1996/gitconvex-ui.git ui/
+ cd ui
+ npm install
+ npm i -g create-react-app tailwindcss@1.6.0
+ npm run build:tailwind
+ npm run build
+ mv ./build ../
+build-server:
+ mkdir -p ./dist
+ go build -o ./dist
+build:
+ echo "Initiating gitconvex build"
+ echo "Cleaning up old directories"
+ rm -rf ui/ dist/ build/
+ echo "Cloning gitconvex react repo"
+ git clone https://github.com/neel1996/gitconvex-ui.git ui/ && \
+ cd ui && \
+ echo "Installing UI dependencies..." && \
+ npm install && \
+ export NODE_ENV=production && \
+ echo "Generating production ready css" && \
+ npm install tailwindcss postcss autoprefixer && \
+ npx tailwindcss build -o ./src/index.css -c ./src/tailwind.config.js && \
+ rm package-*.json && \
+ rm -rf .git/ && \
+ echo "Building react UI bundle" && \
+ npm run build && \
+ mv ./build ../ && \
+ cd .. && \
+ mkdir -p ./dist && \
+ mv build/ ./dist/ && \
+ mv ./dist/build ./dist/gitconvex-ui
+ echo "Building final go source with UI bundle" && \
+ go build -o ./dist && \
+ echo "Gitconvex build completed!" && \
+ mv ./dist/gitconvex-server ./dist/gitconvex
+ echo "Use ./dist/gitconvex to start Gitconvex on port 9001"
+ echo "Try ./dist/gitconvex --port PORT_NUMBER to run gitconvex on the desired port"
+test:
+ go test -v ./...
+start:
+ ./dist/gitconvex
diff --git a/README.md b/README.md
index 1e5de92f..cce7b0f3 100755
--- a/README.md
+++ b/README.md
@@ -1,4 +1,3 @@
-
# Gitconvex
@@ -18,9 +17,8 @@
> Use any of the below options to get gitconvex for your system
-[](https://www.npmjs.com/package/@itassistors/gitconvex)
-[](https://github.com/neel1996/gitconvex-package/releases)
-[](https://hub.docker.com/repository/docker/itassistors/gitconvex)
+[](https://github.com/neel1996/gitconvex-package/releases)
+[](https://hub.docker.com/repository/docker/itassistors/gitconvex)
[](LICENSE)
- **Option - 1** Cloning repo from **github**
@@ -29,51 +27,47 @@
```
-$ git clone https://github.com/neel1996/gitconvex-package.git
-$ cd gitconvex-package
-$ npm start
-
-```
-
-- **Option - 2** Downloading package from **npm**
+$ git clone https://github.com/neel1996/gitconvex.git
+$ cd gitconvex
-`npm i -g @itassistors/gitconvex`
+# for Mac & Linux
-This will install **gitconvex** as a global module and it can be started straight away from the command line with `gitconvex` command
+$ make build
-```
-$ gitconvex
+# for Windows
-INFO: Checking for config file
-INFO: Config file is present
-INFO: Reading from config file /usr/lib/node_modules/@itassistors/gitconvex/env_config.json
-GitConvex API connected!
+$ ./make.bat build
-Checking data file availability...
-INFO: Data file /usr/lib/node_modules/@itassistors/gitconvex/database/repo-datastore.json is present and it will be used as the active data file!
+## After build completion...
-You can change this under the settings menu
+$ ./dist/gitconvex-server
-Gitconvex is running on port 9001
+2020/11/14 22:57:47 INFO: Starting Gitconvex server modules
+2020/11/14 22:57:47 INFO: Using available env config file
+2020/11/14 22:57:47 INFO: Gitconvex started on http://localhost:9001
- Open http://localhost:9001/ to access gitconvex
```
-- **Option - 3** If you are into **docker**, then there is also a docker image available for gitconvex
+- **Option - 2** If you are into **docker**, then there is also a docker image available for gitconvex
`docker pull itassistors/gitconvex`
**Note:** Make sure you mount the host volume to the container to access the git repos from the host system. If you have git repos stored within your containers, then this is not required
-- **Option - 4** Downloading the zip file from the tagged github [**release**](https://github.com/neel1996/gitconvex-package/releases)
+- **Option - 3** Downloading the zip file from the tagged github [**release**](https://github.com/neel1996/gitconvex/releases)
```
## Extract the downloaded zip file and execute the commands
-$ cd gitconvex-package
-$ npm start
-```
+$ cd gitconvex
+# for Mac & Linux
+$ make build
+
+# for Windows
+$ ./make.bat build
+
+```
# Platforms
@@ -85,9 +79,11 @@ $ npm start
## Requirements
-| [Node js](https://nodejs.org/en/) | Tested on v12.0+ |
-|--|--|
-| [Git](https://git-scm.com/) | Tested on v2.20+ |
+| Software | Purpose |
+| -- | -- |
+| [Git](https://git-scm.com/) | Required for handling some intense git operations with the target repo |
+| [Go](https://golang.org/) | For building the backend from the source |
+| [Node JS](https://nodejs.org/en/) | For building the react UI bundle from scratch |
> **Important note for windows users**
@@ -112,6 +108,11 @@ operable program or batch file.
This can be fixed by adding `git` to the PATH environment variable in windows. The process of setting this up is available [here](https://stackoverflow.com/questions/26620312/git-installing-git-in-path-with-github-client-for-windows#answer-53706956:~:text=comment-,27,Here%20is%20the%20magic)
+> **🍎 Important note for MacOS users**
+
+The pre-built bundle for MacOS is not a verfieid or signed bundle. So gatekeeper could warn you or even prevent you from using gitconvex on your Mac devices. If this is the case then I recommend building the application from scratch using the `Makefile` included in the repo. Follow **[Option - 1](#download-options)** mentioned above to build the application from scratch.
+
+**Reason** - Enrolling in the apple developer program for making the application a verfied one will cost me 100 USD anually. So I will do it once the project gets enough reach
# Detailed documentation
@@ -120,13 +121,13 @@ Refer the detailed [Documentation](DOCUMENTATION.md) for how to setup and use th
# Contributions
-This is the final production build for **gitconvex** and direct contributions will not be accepted to this repo. If you wish to contribute to this project, then it has to be made to the following repos which are dedicated to the frontend (React) and backend (Node JS) for the platform
+This is the final production build for **gitconvex** and direct contributions will not be accepted to this repo. If you wish to contribute to this project, then it has to be made to the following repos which are dedicated to the frontend (React) and backend (Go) for the platform
- **Frontend repo - Build with React JS**
[](https://github.com/neel1996/gitconvex-ui)
-- **Backend repo - Build with Node JS**
+- **Backend repo - Build with GoLang**
[](https://github.com/neel1996/gitconvex-server)
@@ -139,8 +140,9 @@ For reporting issues or for requesting any feature use the following medium,
[**Discord Channel** ](https://discord.gg/PSd2Cq9)
-[**Github Issue Reporting**](https://github.com/neel1996/gitconvex-package/issues)
+[**Github Issue Reporting**](https://github.com/neel1996/gitconvex/issues)
# License
See [LICENSE ](LICENSE) info for more
+
diff --git a/api/add_repo.go b/api/add_repo.go
new file mode 100644
index 00000000..a2a1c435
--- /dev/null
+++ b/api/add_repo.go
@@ -0,0 +1,193 @@
+package api
+
+import (
+ "encoding/json"
+ "fmt"
+ "github.com/google/uuid"
+ "github.com/neel1996/gitconvex-server/git"
+ "github.com/neel1996/gitconvex-server/global"
+ "github.com/neel1996/gitconvex-server/graph/model"
+ "github.com/neel1996/gitconvex-server/utils"
+ "go/types"
+ "io/ioutil"
+ "os"
+ "strings"
+ "time"
+)
+
+type RepoData struct {
+ Id string `json:"id"`
+ RepoName string `json:"repoName"`
+ RepoPath string `json:"repoPath"`
+ TimeStamp string `json:"timestamp"`
+}
+
+// localLogger logs messages to the global logger module
+func localLogger(message string, status string) {
+ logger := &global.Logger{Message: message}
+ logger.Log(logger.Message, status)
+}
+
+// repoIdGenerator generates a unique ID for the newly added repo
+func repoIdGenerator(c chan string) {
+ newUUID, _ := uuid.NewUUID()
+ repoId := strings.Split(newUUID.String(), "-")[0]
+ c <- repoId
+}
+
+// repoDataCreator creates a new datastore directory and file if repo data does not exist
+func repoDataCreator(dbFile string) error {
+ sliceDbFile := strings.Split(dbFile, "/")
+ dbDir := strings.Join(sliceDbFile[0:len(sliceDbFile)-1], "/")
+ dirErr := os.MkdirAll(dbDir, 0755)
+ _, err := os.Create(dbFile)
+
+ if err != nil {
+ localLogger(err.Error(), global.StatusError)
+ return types.Error{Msg: err.Error()}
+ }
+ if dirErr != nil {
+ localLogger(fmt.Sprintf("Error occurred creating database directory \n%v", dirErr), global.StatusError)
+ return types.Error{Msg: dirErr.Error()}
+ }
+ localLogger("New repo datastore created successfully", global.StatusInfo)
+ return nil
+}
+
+func dataFileWriteHandler(dbFile string, repoDataArray []RepoData) error {
+ repoDataJSON, _ := json.Marshal(repoDataArray)
+ osRead, _ := os.Open(dbFile)
+ readFileStat, _ := ioutil.ReadAll(osRead)
+
+ var existingData []RepoData
+
+ if readFileStat != nil && json.Unmarshal(readFileStat, &existingData) == nil {
+ appendData := append(existingData, repoDataArray[0])
+ writeData, _ := json.MarshalIndent(appendData, "", " ")
+ return ioutil.WriteFile(dbFile, writeData, 0755)
+ } else {
+ return ioutil.WriteFile(dbFile, repoDataJSON, 0755)
+ }
+}
+
+// repoDataFileWriter writes the new repo details to the repo_datastore.json file
+func repoDataFileWriter(repoId string, repoName string, repoPath string, repoAddStatus chan string) {
+ rArray := make([]RepoData, 1)
+
+ rArray[0] = RepoData{
+ Id: repoId,
+ RepoName: repoName,
+ RepoPath: repoPath,
+ TimeStamp: time.Now().String(),
+ }
+
+ envConfig := *utils.EnvConfigFileReader()
+
+ dbFile := envConfig.DataBaseFile
+ localLogger("Opening DB file present in env_config", global.StatusInfo)
+ _, fileOpenErr := os.Open(dbFile)
+
+ if fileOpenErr != nil {
+ localLogger(fmt.Sprintf("Error occurred while opening repo data JSON file \n%v", fileOpenErr), global.StatusError)
+
+ createErr := repoDataCreator(dbFile)
+
+ if createErr != nil {
+ localLogger(createErr.Error(), global.StatusError)
+ panic(createErr)
+ } else {
+ if err := dataFileWriteHandler(dbFile, rArray); err != nil && err.Error() != "" {
+ localLogger(err.Error(), global.StatusError)
+ repoAddStatus <- "failed"
+ } else {
+ repoAddStatus <- "success"
+ }
+ }
+ } else {
+ if err := dataFileWriteHandler(dbFile, rArray); err != nil && err.Error() != "" {
+ localLogger(err.Error(), global.StatusError)
+ repoAddStatus <- "failed"
+ } else {
+ repoAddStatus <- "success"
+ }
+ }
+}
+
+// AddRepo function gets the repository details and includes a record to the gitconvex repo datastore file
+// If initSwitch is 'true' then the git repo init function will be invoked to initialize a new repo
+// If cloneSwitch is 'true' then the repo will be cloned to the file system using the repoURL field
+func AddRepo(inputs model.NewRepoInputs) *model.AddRepoParams {
+ var repoIdChannel = make(chan string)
+
+ repoName := inputs.RepoName
+ repoPath := inputs.RepoPath
+ cloneSwitch := inputs.CloneSwitch
+ repoURL := inputs.RepoURL
+ initSwitch := inputs.InitSwitch
+ authOption := inputs.AuthOption
+ userName := inputs.UserName
+ password := inputs.Password
+
+ if cloneSwitch && len(*repoURL) > 0 {
+ repoPath = repoPath + "/" + repoName
+
+ _, err := git.CloneHandler(repoPath, *repoURL, authOption, userName, password)
+ if err != nil {
+ localLogger(fmt.Sprintf("%v", err), global.StatusError)
+ return &model.AddRepoParams{
+ RepoID: "",
+ Status: "Failed",
+ Message: err.Error(),
+ }
+ }
+ }
+ if initSwitch {
+ _, err := git.InitHandler(repoPath)
+ if err != nil {
+ localLogger(fmt.Sprintf("%v", err), global.StatusError)
+ return &model.AddRepoParams{
+ RepoID: "",
+ Status: "Failed",
+ Message: err.Error(),
+ }
+ }
+ }
+
+ _, invalidRepoErr := git.RepoValidator(repoPath)
+
+ if invalidRepoErr != nil && !initSwitch {
+ localLogger(fmt.Sprintf("The repo is not a valid git repo\n%v", invalidRepoErr), global.StatusError)
+
+ return &model.AddRepoParams{
+ RepoID: "",
+ Status: "Failed",
+ Message: invalidRepoErr.Error(),
+ }
+ }
+
+ go repoIdGenerator(repoIdChannel)
+ repoId := <-repoIdChannel
+
+ var repoAddStatusChannel = make(chan string)
+ go repoDataFileWriter(repoId, repoName, repoPath, repoAddStatusChannel)
+ status := <-repoAddStatusChannel
+
+ close(repoIdChannel)
+ close(repoAddStatusChannel)
+
+ if status == "success" {
+ localLogger("Repo entry added to the data store", global.StatusInfo)
+ return &model.AddRepoParams{
+ RepoID: repoId,
+ Status: "Repo Added",
+ Message: "The new repository has been added to Gitconvex",
+ }
+ } else {
+ localLogger("Failed to add new repo entry", global.StatusError)
+ return &model.AddRepoParams{
+ RepoID: "",
+ Status: "Failed",
+ }
+ }
+
+}
diff --git a/api/code_file_view.go b/api/code_file_view.go
new file mode 100644
index 00000000..a2c40422
--- /dev/null
+++ b/api/code_file_view.go
@@ -0,0 +1,38 @@
+package api
+
+import (
+ "bufio"
+ "fmt"
+ "github.com/neel1996/gitconvex-server/global"
+ "github.com/neel1996/gitconvex-server/graph/model"
+ "os"
+)
+
+// CodeFileView returns the lines from the target file and the latest commit corresponding to the file
+func CodeFileView(repoPath string, fileName string) *model.CodeFileType {
+ var codeLines []*string
+
+ targetFile := repoPath + "/" + fileName
+ logger := global.Logger{}
+ file, err := os.Open(targetFile)
+
+ if err != nil {
+ logger.Log(err.Error(), global.StatusError)
+ return &model.CodeFileType{
+ FileData: nil,
+ }
+ } else {
+ logger.Log(fmt.Sprintf("Reading lines from file --> %s", targetFile), global.StatusInfo)
+ scanner := bufio.NewScanner(file)
+ scanner.Split(bufio.ScanLines)
+ for scanner.Scan() {
+ line := scanner.Text()
+ codeLines = append(codeLines, &line)
+ }
+ _ = file.Close()
+ }
+
+ return &model.CodeFileType{
+ FileData: codeLines,
+ }
+}
diff --git a/api/fetch_repo.go b/api/fetch_repo.go
new file mode 100644
index 00000000..b6419711
--- /dev/null
+++ b/api/fetch_repo.go
@@ -0,0 +1,61 @@
+package api
+
+import (
+ "encoding/json"
+ "fmt"
+ "github.com/neel1996/gitconvex-server/global"
+ "github.com/neel1996/gitconvex-server/graph/model"
+ "github.com/neel1996/gitconvex-server/utils"
+ "time"
+)
+
+// FetchRepo reads the gitconvex datafile (repo_datastore.json) and returns the stored information
+// in the form of categorized array items
+func FetchRepo() *model.FetchRepoParams {
+ var (
+ repoId []*string
+ repoName []*string
+ repoPath []*string
+ timeStamp []*string
+ )
+
+ const defaultDateFormat = "2006-01-02 15:04:05"
+
+ repoData := utils.DataStoreFileReader()
+
+ for _, repo := range repoData {
+ repoIdStr := repo.RepoId
+ repoNameStr := repo.RepoName
+ repoPathStr := repo.RepoPath
+ timeStampStr := repo.TimeStamp
+
+ convTimeStamp, _ := time.Parse(defaultDateFormat, timeStampStr[:19])
+ timeStampStr = convTimeStamp.String()
+
+ repoId = append(repoId, &repoIdStr)
+ repoName = append(repoName, &repoNameStr)
+ repoPath = append(repoPath, &repoPathStr)
+ timeStamp = append(timeStamp, &timeStampStr)
+ }
+
+ logger := global.Logger{}
+ jsonContent, err := json.MarshalIndent(repoData, "", " ")
+
+ if err != nil {
+ logger.Log(fmt.Sprintf("Data file could not be parsed -> %s", err.Error()), global.StatusError)
+ return &model.FetchRepoParams{
+ RepoID: nil,
+ RepoName: nil,
+ RepoPath: nil,
+ TimeStamp: nil,
+ }
+ }
+
+ logger.Log(fmt.Sprintf("Available data file content \n%v", string(jsonContent)), global.StatusInfo)
+ return &model.FetchRepoParams{
+ RepoID: repoId,
+ RepoName: repoName,
+ RepoPath: repoPath,
+ TimeStamp: timeStamp,
+ }
+}
diff --git a/api/health_check.go b/api/health_check.go
new file mode 100644
index 00000000..e5537169
--- /dev/null
+++ b/api/health_check.go
@@ -0,0 +1,38 @@
+package api
+
+import (
+ "fmt"
+ "github.com/neel1996/gitconvex-server/utils"
+ "runtime"
+ "strings"
+
+ "github.com/neel1996/gitconvex-server/global"
+ "github.com/neel1996/gitconvex-server/graph/model"
+)
+
+func getOs() string {
+ return runtime.GOOS
+}
+
+func getGitVersion() string {
+ gitCmd := utils.GetGitClient(".", []string{"version"})
+ gitVersion, err := gitCmd.Output()
+
+ if err != nil {
+ logger.Log(fmt.Sprintf("Git version could not be obtained \n %v", err), global.StatusError)
+ }
+
+ return strings.Split(string(gitVersion), "\n")[0]
+}
+
+// HealthCheckApi returns the current version of git installed in the host and the platform gitconvex is running on
+func HealthCheckApi() *model.HealthCheckParams {
+
+ logger := global.Logger{Message: fmt.Sprintf("Obtained host information : %v -- %v", getOs(), getGitVersion())}
+ logger.LogInfo()
+
+ return &model.HealthCheckParams{
+ Os: getOs(),
+ Git: getGitVersion(),
+ }
+}
diff --git a/api/repo_status.go b/api/repo_status.go
new file mode 100644
index 00000000..5f4b6fba
--- /dev/null
+++ b/api/repo_status.go
@@ -0,0 +1,103 @@
+package api
+
+import (
+ "github.com/neel1996/gitconvex-server/git"
+ "github.com/neel1996/gitconvex-server/global"
+ "github.com/neel1996/gitconvex-server/graph/model"
+ "github.com/neel1996/gitconvex-server/utils"
+ "strings"
+)
+
+// RepoStatus collects the basic details of the target repo and returns the consolidated result
+func RepoStatus(repoId string) *model.GitRepoStatusResults {
+ logger := global.Logger{}
+ logger.Log("Collecting repo status information", global.StatusInfo)
+
+ repoChan := make(chan git.RepoDetails)
+ remoteChan := make(chan git.RemoteDataModel)
+ branchChan := make(chan git.Branch)
+ commitChan := make(chan git.AllCommitData)
+ trackedFileCountChan := make(chan int)
+
+ go git.Repo(repoId, repoChan)
+
+ var repoName *string
+ r := <-repoChan
+ repo := r.GitRepo
+
+ if repo == nil {
+ return &model.GitRepoStatusResults{
+ GitRemoteData: nil,
+ GitRepoName: nil,
+ GitBranchList: nil,
+ GitAllBranchList: nil,
+ GitCurrentBranch: nil,
+ GitRemoteHost: nil,
+ GitTotalCommits: nil,
+ GitLatestCommit: nil,
+ GitTotalTrackedFiles: nil,
+ }
+ }
+
+ remote := ""
+ var remoteURL *string
+ remoteURL = &remote
+ go git.RemoteData(repo, remoteChan)
+ remoteData := <-remoteChan
+ remotes := remoteData.RemoteURL
+
+ if len(remotes) > 0 && *remotes[0] != "" {
+ sRemote := strings.Split(*remotes[0], "/")
+ repoName = &sRemote[len(sRemote)-1]
+ } else {
+ nilRemote := "No Remotes Available"
+ remotes[0] = &nilRemote
+ repoData := utils.DataStoreFileReader()
+
+ for _, repo := range repoData {
+ if repo.RepoId == repoId {
+ repoName = &repo.RepoName
+ }
+ }
+ }
+
+ if len(remotes) > 1 {
+ var tempRemoteArray []string
+ for _, ptrRemote := range remotes {
+ tempRemoteArray = append(tempRemoteArray, *ptrRemote)
+ }
+ *remoteURL = strings.Join(tempRemoteArray, "||")
+ } else {
+ *remoteURL = *remotes[0]
+ }
+
+ go git.GetBranchList(repo, branchChan)
+ branchList := <-branchChan
+ currentBranch := &branchList.CurrentBranch
+ branches := branchList.BranchList
+ allBranches := branchList.AllBranchList
+
+ var latestCommit *string
+
+ go git.AllCommits(repo, commitChan)
+ commitData := <-commitChan
+ latestCommit = &commitData.LatestCommit
+ totalCommits := commitData.TotalCommits
+ totalCommitsPtr := &totalCommits
+
+ go git.TrackedFileCount(repo, trackedFileCountChan)
+ trackedFileCount := <-trackedFileCountChan
+ trackedFilePtr := &trackedFileCount
+
+ return &model.GitRepoStatusResults{
+ GitRemoteData: remoteURL,
+ GitRepoName: repoName,
+ GitBranchList: branches,
+ GitAllBranchList: allBranches,
+ GitCurrentBranch: currentBranch,
+ GitRemoteHost: remoteData.RemoteHost,
+ GitTotalCommits: totalCommitsPtr,
+ GitLatestCommit: latestCommit,
+ GitTotalTrackedFiles: trackedFilePtr,
+ }
+}
diff --git a/api/settings_api.go b/api/settings_api.go
new file mode 100644
index 00000000..f0bf984e
--- /dev/null
+++ b/api/settings_api.go
@@ -0,0 +1,149 @@
+package api
+
+import (
+ "encoding/json"
+ "fmt"
+ "github.com/neel1996/gitconvex-server/global"
+ "github.com/neel1996/gitconvex-server/graph/model"
+ "github.com/neel1996/gitconvex-server/utils"
+ "io/ioutil"
+ "os"
+ "path/filepath"
+)
+
+var logger global.Logger
+
+// GetSettingsData returns the data extracted from the env_config.json file
+func GetSettingsData() *model.SettingsDataResults {
+ envData := utils.EnvConfigFileReader()
+
+ if envData != nil {
+ return &model.SettingsDataResults{
+ SettingsDatabasePath: envData.DataBaseFile,
+ SettingsPortDetails: envData.Port,
+ }
+ } else {
+ return &model.SettingsDataResults{}
+ }
+}
+
+// UpdatePortNumber updates the port number in the env_config.json file with the
+// newly supplied port number
+func UpdatePortNumber(newPort string) string {
+ if utils.EnvConfigValidator() == nil {
+ var newEnvData utils.EnvConfig
+ envData := utils.EnvConfigFileReader()
+
+ newEnvData.Port = newPort
+ newEnvData.DataBaseFile = envData.DataBaseFile
+
+ execName, execErr := os.Executable()
+ if execErr != nil {
+ logger.Log(execErr.Error(), global.StatusError)
+ return global.PortUpdateError
+ }
+
+ cwd := filepath.Dir(execName)
+
+ fileString := cwd + "/" + global.EnvFileName
+ envContent, _ := json.MarshalIndent(&newEnvData, "", " ")
+ writeErr := ioutil.WriteFile(fileString, envContent, 0755)
+
+ if writeErr != nil {
+ logger.Log(writeErr.Error(), global.StatusError)
+ return global.PortUpdateError
+ } else {
+ return global.PortUpdateSuccess
+ }
+ } else {
+ return global.PortUpdateError
+ }
+}
+
+// UpdateDBFilePath function updates the data file in the env_config json file
+func UpdateDBFilePath(newFilePath string) string {
+ if utils.EnvConfigValidator() == nil {
+ var newEnvData utils.EnvConfig
+ envData := utils.EnvConfigFileReader()
+
+ newEnvData.Port = envData.Port
+ newEnvData.DataBaseFile = newFilePath
+
+ execName, execErr := os.Executable()
+ if execErr != nil {
+ logger.Log(execErr.Error(), global.StatusError)
+ return global.DataFileUpdateError
+ }
+
+ cwd := filepath.Dir(execName)
+
+ fileString := cwd + "/" + global.EnvFileName
+ envContent, _ := json.MarshalIndent(&newEnvData, "", " ")
+ writeErr := ioutil.WriteFile(fileString, envContent, 0755)
+
+ if writeErr != nil {
+ logger.Log(writeErr.Error(), global.StatusError)
+ return global.DataFileUpdateError
+ } else {
+ return global.DataFileUpdateSuccess
+ }
+ } else {
+ return global.DataFileUpdateError
+ }
+}
+
+func reportError(repoId string, errMsg string, errString string) *model.DeleteStatus {
+ logger.Log(fmt.Sprintf("%s -> %s", errMsg, errString), global.StatusError)
+ return &model.DeleteStatus{
+ Status: global.RepoDeleteError,
+ RepoID: repoId,
+ }
+}
+
+// DeleteRepo deletes a repo entry from the env_config json file
+// This will just remove the record for gitconvex alone and disturbs the repo in no other way
+func DeleteRepo(repoId string) *model.DeleteStatus {
+ var repoData []RepoData
+ var newRepoData []RepoData
+ if utils.EnvConfigValidator() == nil {
+ dbFile := utils.EnvConfigFileReader().DataBaseFile
+
+ file, openErr := os.Open(dbFile)
+
+ if openErr != nil {
+ return reportError(repoId, "Unable to open DB file ->", openErr.Error())
+ }
+
+ fileData, fileErr := ioutil.ReadAll(file)
+ if fileErr != nil {
+ return reportError(repoId, "Unable to read DB file ->", fileErr.Error())
+ }
+ unmarshalErr := json.Unmarshal(fileData, &repoData)
+
+ if unmarshalErr != nil {
+ return reportError(repoId, "JSON format is incompatible ->", unmarshalErr.Error())
+ }
+
+ for _, data := range repoData {
+ if data.Id == repoId {
+ continue
+ }
+ newRepoData = append(newRepoData, data)
+ }
+ dbFileContent, _ := json.MarshalIndent(newRepoData, "", " ")
+ if dbFileContent != nil {
+ err := ioutil.WriteFile(dbFile, dbFileContent, 0755)
+ if err != nil {
+ return reportError(repoId, "Failed to update DB file", err.Error())
+ }
+ return &model.DeleteStatus{
+ Status: global.RepoDeleteSuccess,
+ RepoID: repoId,
+ }
+ } else {
+ return reportError(repoId, "Failed to update DB file", "")
+ }
+ } else {
+ return reportError(repoId, "Env config file cannot be accessed", "")
+ }
+}
diff --git a/build/asset-manifest.json b/build/asset-manifest.json
deleted file mode 100644
index b6f9d0e8..00000000
--- a/build/asset-manifest.json
+++ /dev/null
@@ -1,932 +0,0 @@
-{
- "files": {
- "main.css": "/static/css/main.06e63d6d.chunk.css",
- "main.js": "/static/js/main.599d444d.chunk.js",
- "main.js.map": "/static/js/main.599d444d.chunk.js.map",
- "runtime-main.js": "/static/js/runtime-main.75b5ed94.js",
- "runtime-main.js.map": "/static/js/runtime-main.75b5ed94.js.map",
- "static/js/2.3b9ab7d4.chunk.js": "/static/js/2.3b9ab7d4.chunk.js",
- "static/js/2.3b9ab7d4.chunk.js.map": "/static/js/2.3b9ab7d4.chunk.js.map",
- "static/js/3.10a9185e.chunk.js": "/static/js/3.10a9185e.chunk.js",
- "static/js/3.10a9185e.chunk.js.map": "/static/js/3.10a9185e.chunk.js.map",
- "static/js/4.b39bfee9.chunk.js": "/static/js/4.b39bfee9.chunk.js",
- "static/js/4.b39bfee9.chunk.js.map": "/static/js/4.b39bfee9.chunk.js.map",
- "static/js/5.dc6d6a06.chunk.js": "/static/js/5.dc6d6a06.chunk.js",
- "static/js/5.dc6d6a06.chunk.js.map": "/static/js/5.dc6d6a06.chunk.js.map",
- "static/js/6.252406e4.chunk.js": "/static/js/6.252406e4.chunk.js",
- "static/js/6.252406e4.chunk.js.map": "/static/js/6.252406e4.chunk.js.map",
- "static/js/7.4dc56935.chunk.js": "/static/js/7.4dc56935.chunk.js",
- "static/js/7.4dc56935.chunk.js.map": "/static/js/7.4dc56935.chunk.js.map",
- "static/js/8.94ae262e.chunk.js": "/static/js/8.94ae262e.chunk.js",
- "static/js/8.94ae262e.chunk.js.map": "/static/js/8.94ae262e.chunk.js.map",
- "static/js/9.ffdadf11.chunk.js": "/static/js/9.ffdadf11.chunk.js",
- "static/js/9.ffdadf11.chunk.js.map": "/static/js/9.ffdadf11.chunk.js.map",
- "static/js/10.e91b0897.chunk.js": "/static/js/10.e91b0897.chunk.js",
- "static/js/10.e91b0897.chunk.js.map": "/static/js/10.e91b0897.chunk.js.map",
- "static/js/11.3ff55656.chunk.js": "/static/js/11.3ff55656.chunk.js",
- "static/js/11.3ff55656.chunk.js.map": "/static/js/11.3ff55656.chunk.js.map",
- "static/js/12.dcc19704.chunk.js": "/static/js/12.dcc19704.chunk.js",
- "static/js/12.dcc19704.chunk.js.map": "/static/js/12.dcc19704.chunk.js.map",
- "static/js/13.ee381fbf.chunk.js": "/static/js/13.ee381fbf.chunk.js",
- "static/js/13.ee381fbf.chunk.js.map": "/static/js/13.ee381fbf.chunk.js.map",
- "static/js/14.e4fe8945.chunk.js": "/static/js/14.e4fe8945.chunk.js",
- "static/js/14.e4fe8945.chunk.js.map": "/static/js/14.e4fe8945.chunk.js.map",
- "static/js/15.1d815542.chunk.js": "/static/js/15.1d815542.chunk.js",
- "static/js/15.1d815542.chunk.js.map": "/static/js/15.1d815542.chunk.js.map",
- "static/js/16.c967c39f.chunk.js": "/static/js/16.c967c39f.chunk.js",
- "static/js/16.c967c39f.chunk.js.map": "/static/js/16.c967c39f.chunk.js.map",
- "static/js/17.af718f91.chunk.js": "/static/js/17.af718f91.chunk.js",
- "static/js/17.af718f91.chunk.js.map": "/static/js/17.af718f91.chunk.js.map",
- "static/js/18.1d602f26.chunk.js": "/static/js/18.1d602f26.chunk.js",
- "static/js/18.1d602f26.chunk.js.map": "/static/js/18.1d602f26.chunk.js.map",
- "static/js/19.f5e17699.chunk.js": "/static/js/19.f5e17699.chunk.js",
- "static/js/19.f5e17699.chunk.js.map": "/static/js/19.f5e17699.chunk.js.map",
- "static/js/20.4f245d9a.chunk.js": "/static/js/20.4f245d9a.chunk.js",
- "static/js/20.4f245d9a.chunk.js.map": "/static/js/20.4f245d9a.chunk.js.map",
- "static/js/21.33a1d3bf.chunk.js": "/static/js/21.33a1d3bf.chunk.js",
- "static/js/21.33a1d3bf.chunk.js.map": "/static/js/21.33a1d3bf.chunk.js.map",
- "static/js/22.611917b6.chunk.js": "/static/js/22.611917b6.chunk.js",
- "static/js/22.611917b6.chunk.js.map": "/static/js/22.611917b6.chunk.js.map",
- "static/js/23.0d26665a.chunk.js": "/static/js/23.0d26665a.chunk.js",
- "static/js/23.0d26665a.chunk.js.map": "/static/js/23.0d26665a.chunk.js.map",
- "static/js/24.d4eee0e5.chunk.js": "/static/js/24.d4eee0e5.chunk.js",
- "static/js/24.d4eee0e5.chunk.js.map": "/static/js/24.d4eee0e5.chunk.js.map",
- "static/js/25.586f208c.chunk.js": "/static/js/25.586f208c.chunk.js",
- "static/js/25.586f208c.chunk.js.map": "/static/js/25.586f208c.chunk.js.map",
- "static/js/26.32ee39e3.chunk.js": "/static/js/26.32ee39e3.chunk.js",
- "static/js/26.32ee39e3.chunk.js.map": "/static/js/26.32ee39e3.chunk.js.map",
- "static/js/27.d3c08d90.chunk.js": "/static/js/27.d3c08d90.chunk.js",
- "static/js/27.d3c08d90.chunk.js.map": "/static/js/27.d3c08d90.chunk.js.map",
- "static/js/28.f6ed4207.chunk.js": "/static/js/28.f6ed4207.chunk.js",
- "static/js/28.f6ed4207.chunk.js.map": "/static/js/28.f6ed4207.chunk.js.map",
- "static/js/29.785cf7f2.chunk.js": "/static/js/29.785cf7f2.chunk.js",
- "static/js/29.785cf7f2.chunk.js.map": "/static/js/29.785cf7f2.chunk.js.map",
- "static/js/30.7340c0b7.chunk.js": "/static/js/30.7340c0b7.chunk.js",
- "static/js/30.7340c0b7.chunk.js.map": "/static/js/30.7340c0b7.chunk.js.map",
- "static/js/31.7428de03.chunk.js": "/static/js/31.7428de03.chunk.js",
- "static/js/31.7428de03.chunk.js.map": "/static/js/31.7428de03.chunk.js.map",
- "static/js/32.1fc64a17.chunk.js": "/static/js/32.1fc64a17.chunk.js",
- "static/js/32.1fc64a17.chunk.js.map": "/static/js/32.1fc64a17.chunk.js.map",
- "static/js/33.7f649747.chunk.js": "/static/js/33.7f649747.chunk.js",
- "static/js/33.7f649747.chunk.js.map": "/static/js/33.7f649747.chunk.js.map",
- "static/js/34.e3b22c59.chunk.js": "/static/js/34.e3b22c59.chunk.js",
- "static/js/34.e3b22c59.chunk.js.map": "/static/js/34.e3b22c59.chunk.js.map",
- "static/js/35.036929db.chunk.js": "/static/js/35.036929db.chunk.js",
- "static/js/35.036929db.chunk.js.map": "/static/js/35.036929db.chunk.js.map",
- "static/js/36.7a176527.chunk.js": "/static/js/36.7a176527.chunk.js",
- "static/js/36.7a176527.chunk.js.map": "/static/js/36.7a176527.chunk.js.map",
- "static/js/37.9c66e569.chunk.js": "/static/js/37.9c66e569.chunk.js",
- "static/js/37.9c66e569.chunk.js.map": "/static/js/37.9c66e569.chunk.js.map",
- "static/js/38.dcf31209.chunk.js": "/static/js/38.dcf31209.chunk.js",
- "static/js/38.dcf31209.chunk.js.map": "/static/js/38.dcf31209.chunk.js.map",
- "static/js/39.19426041.chunk.js": "/static/js/39.19426041.chunk.js",
- "static/js/39.19426041.chunk.js.map": "/static/js/39.19426041.chunk.js.map",
- "static/js/40.b0cba35b.chunk.js": "/static/js/40.b0cba35b.chunk.js",
- "static/js/40.b0cba35b.chunk.js.map": "/static/js/40.b0cba35b.chunk.js.map",
- "static/js/41.fd5ece88.chunk.js": "/static/js/41.fd5ece88.chunk.js",
- "static/js/41.fd5ece88.chunk.js.map": "/static/js/41.fd5ece88.chunk.js.map",
- "static/js/42.edeb8095.chunk.js": "/static/js/42.edeb8095.chunk.js",
- "static/js/42.edeb8095.chunk.js.map": "/static/js/42.edeb8095.chunk.js.map",
- "static/js/43.43040fcc.chunk.js": "/static/js/43.43040fcc.chunk.js",
- "static/js/43.43040fcc.chunk.js.map": "/static/js/43.43040fcc.chunk.js.map",
- "static/js/44.f1bfde70.chunk.js": "/static/js/44.f1bfde70.chunk.js",
- "static/js/44.f1bfde70.chunk.js.map": "/static/js/44.f1bfde70.chunk.js.map",
- "static/js/45.2c24d2c4.chunk.js": "/static/js/45.2c24d2c4.chunk.js",
- "static/js/45.2c24d2c4.chunk.js.map": "/static/js/45.2c24d2c4.chunk.js.map",
- "static/js/46.8a4950ce.chunk.js": "/static/js/46.8a4950ce.chunk.js",
- "static/js/46.8a4950ce.chunk.js.map": "/static/js/46.8a4950ce.chunk.js.map",
- "static/js/47.86ee385b.chunk.js": "/static/js/47.86ee385b.chunk.js",
- "static/js/47.86ee385b.chunk.js.map": "/static/js/47.86ee385b.chunk.js.map",
- "static/js/48.97255d16.chunk.js": "/static/js/48.97255d16.chunk.js",
- "static/js/48.97255d16.chunk.js.map": "/static/js/48.97255d16.chunk.js.map",
- "static/js/49.99ab9d64.chunk.js": "/static/js/49.99ab9d64.chunk.js",
- "static/js/49.99ab9d64.chunk.js.map": "/static/js/49.99ab9d64.chunk.js.map",
- "static/js/50.2cc45c0c.chunk.js": "/static/js/50.2cc45c0c.chunk.js",
- "static/js/50.2cc45c0c.chunk.js.map": "/static/js/50.2cc45c0c.chunk.js.map",
- "static/js/51.5f575694.chunk.js": "/static/js/51.5f575694.chunk.js",
- "static/js/51.5f575694.chunk.js.map": "/static/js/51.5f575694.chunk.js.map",
- "static/js/52.607a6ed1.chunk.js": "/static/js/52.607a6ed1.chunk.js",
- "static/js/52.607a6ed1.chunk.js.map": "/static/js/52.607a6ed1.chunk.js.map",
- "static/js/53.31ebad1b.chunk.js": "/static/js/53.31ebad1b.chunk.js",
- "static/js/53.31ebad1b.chunk.js.map": "/static/js/53.31ebad1b.chunk.js.map",
- "static/js/54.a06e0f48.chunk.js": "/static/js/54.a06e0f48.chunk.js",
- "static/js/54.a06e0f48.chunk.js.map": "/static/js/54.a06e0f48.chunk.js.map",
- "static/js/55.d954c03e.chunk.js": "/static/js/55.d954c03e.chunk.js",
- "static/js/55.d954c03e.chunk.js.map": "/static/js/55.d954c03e.chunk.js.map",
- "static/js/56.6ca9e331.chunk.js": "/static/js/56.6ca9e331.chunk.js",
- "static/js/56.6ca9e331.chunk.js.map": "/static/js/56.6ca9e331.chunk.js.map",
- "static/js/57.200f989c.chunk.js": "/static/js/57.200f989c.chunk.js",
- "static/js/57.200f989c.chunk.js.map": "/static/js/57.200f989c.chunk.js.map",
- "static/js/58.3f3e8624.chunk.js": "/static/js/58.3f3e8624.chunk.js",
- "static/js/58.3f3e8624.chunk.js.map": "/static/js/58.3f3e8624.chunk.js.map",
- "static/js/59.93853ebe.chunk.js": "/static/js/59.93853ebe.chunk.js",
- "static/js/59.93853ebe.chunk.js.map": "/static/js/59.93853ebe.chunk.js.map",
- "static/js/60.49708fad.chunk.js": "/static/js/60.49708fad.chunk.js",
- "static/js/60.49708fad.chunk.js.map": "/static/js/60.49708fad.chunk.js.map",
- "static/js/61.3ec9aa2a.chunk.js": "/static/js/61.3ec9aa2a.chunk.js",
- "static/js/61.3ec9aa2a.chunk.js.map": "/static/js/61.3ec9aa2a.chunk.js.map",
- "static/js/62.5fd9e652.chunk.js": "/static/js/62.5fd9e652.chunk.js",
- "static/js/62.5fd9e652.chunk.js.map": "/static/js/62.5fd9e652.chunk.js.map",
- "static/js/63.c41b8b1f.chunk.js": "/static/js/63.c41b8b1f.chunk.js",
- "static/js/63.c41b8b1f.chunk.js.map": "/static/js/63.c41b8b1f.chunk.js.map",
- "static/js/64.7b76382c.chunk.js": "/static/js/64.7b76382c.chunk.js",
- "static/js/64.7b76382c.chunk.js.map": "/static/js/64.7b76382c.chunk.js.map",
- "static/js/65.3651b3f6.chunk.js": "/static/js/65.3651b3f6.chunk.js",
- "static/js/65.3651b3f6.chunk.js.map": "/static/js/65.3651b3f6.chunk.js.map",
- "static/js/66.600f96a9.chunk.js": "/static/js/66.600f96a9.chunk.js",
- "static/js/66.600f96a9.chunk.js.map": "/static/js/66.600f96a9.chunk.js.map",
- "static/js/67.56bfe93d.chunk.js": "/static/js/67.56bfe93d.chunk.js",
- "static/js/67.56bfe93d.chunk.js.map": "/static/js/67.56bfe93d.chunk.js.map",
- "static/js/68.a2a72f6e.chunk.js": "/static/js/68.a2a72f6e.chunk.js",
- "static/js/68.a2a72f6e.chunk.js.map": "/static/js/68.a2a72f6e.chunk.js.map",
- "static/js/69.a874f70f.chunk.js": "/static/js/69.a874f70f.chunk.js",
- "static/js/69.a874f70f.chunk.js.map": "/static/js/69.a874f70f.chunk.js.map",
- "static/js/70.ba4472b4.chunk.js": "/static/js/70.ba4472b4.chunk.js",
- "static/js/70.ba4472b4.chunk.js.map": "/static/js/70.ba4472b4.chunk.js.map",
- "static/js/71.d073535f.chunk.js": "/static/js/71.d073535f.chunk.js",
- "static/js/71.d073535f.chunk.js.map": "/static/js/71.d073535f.chunk.js.map",
- "static/js/72.4a10289e.chunk.js": "/static/js/72.4a10289e.chunk.js",
- "static/js/72.4a10289e.chunk.js.map": "/static/js/72.4a10289e.chunk.js.map",
- "static/js/73.fb7a09a4.chunk.js": "/static/js/73.fb7a09a4.chunk.js",
- "static/js/73.fb7a09a4.chunk.js.map": "/static/js/73.fb7a09a4.chunk.js.map",
- "static/js/74.956b4156.chunk.js": "/static/js/74.956b4156.chunk.js",
- "static/js/74.956b4156.chunk.js.map": "/static/js/74.956b4156.chunk.js.map",
- "static/js/75.68e5e6a7.chunk.js": "/static/js/75.68e5e6a7.chunk.js",
- "static/js/75.68e5e6a7.chunk.js.map": "/static/js/75.68e5e6a7.chunk.js.map",
- "static/js/76.b31dc793.chunk.js": "/static/js/76.b31dc793.chunk.js",
- "static/js/76.b31dc793.chunk.js.map": "/static/js/76.b31dc793.chunk.js.map",
- "static/js/77.597e4185.chunk.js": "/static/js/77.597e4185.chunk.js",
- "static/js/77.597e4185.chunk.js.map": "/static/js/77.597e4185.chunk.js.map",
- "static/js/78.01603bbc.chunk.js": "/static/js/78.01603bbc.chunk.js",
- "static/js/78.01603bbc.chunk.js.map": "/static/js/78.01603bbc.chunk.js.map",
- "static/js/79.e8cae122.chunk.js": "/static/js/79.e8cae122.chunk.js",
- "static/js/79.e8cae122.chunk.js.map": "/static/js/79.e8cae122.chunk.js.map",
- "static/js/80.21499724.chunk.js": "/static/js/80.21499724.chunk.js",
- "static/js/80.21499724.chunk.js.map": "/static/js/80.21499724.chunk.js.map",
- "static/js/81.1dafcbe0.chunk.js": "/static/js/81.1dafcbe0.chunk.js",
- "static/js/81.1dafcbe0.chunk.js.map": "/static/js/81.1dafcbe0.chunk.js.map",
- "static/js/82.f6288af7.chunk.js": "/static/js/82.f6288af7.chunk.js",
- "static/js/82.f6288af7.chunk.js.map": "/static/js/82.f6288af7.chunk.js.map",
- "static/js/83.1b329c25.chunk.js": "/static/js/83.1b329c25.chunk.js",
- "static/js/83.1b329c25.chunk.js.map": "/static/js/83.1b329c25.chunk.js.map",
- "static/js/84.9b3b4b79.chunk.js": "/static/js/84.9b3b4b79.chunk.js",
- "static/js/84.9b3b4b79.chunk.js.map": "/static/js/84.9b3b4b79.chunk.js.map",
- "static/js/85.59b2ea4d.chunk.js": "/static/js/85.59b2ea4d.chunk.js",
- "static/js/85.59b2ea4d.chunk.js.map": "/static/js/85.59b2ea4d.chunk.js.map",
- "static/js/86.d5b9b62a.chunk.js": "/static/js/86.d5b9b62a.chunk.js",
- "static/js/86.d5b9b62a.chunk.js.map": "/static/js/86.d5b9b62a.chunk.js.map",
- "static/js/87.602fc8ab.chunk.js": "/static/js/87.602fc8ab.chunk.js",
- "static/js/87.602fc8ab.chunk.js.map": "/static/js/87.602fc8ab.chunk.js.map",
- "static/js/88.6d866d9c.chunk.js": "/static/js/88.6d866d9c.chunk.js",
- "static/js/88.6d866d9c.chunk.js.map": "/static/js/88.6d866d9c.chunk.js.map",
- "static/js/89.e6dd7d18.chunk.js": "/static/js/89.e6dd7d18.chunk.js",
- "static/js/89.e6dd7d18.chunk.js.map": "/static/js/89.e6dd7d18.chunk.js.map",
- "static/js/90.ca98f8c0.chunk.js": "/static/js/90.ca98f8c0.chunk.js",
- "static/js/90.ca98f8c0.chunk.js.map": "/static/js/90.ca98f8c0.chunk.js.map",
- "static/js/91.0927253e.chunk.js": "/static/js/91.0927253e.chunk.js",
- "static/js/91.0927253e.chunk.js.map": "/static/js/91.0927253e.chunk.js.map",
- "static/js/92.fb3a53b4.chunk.js": "/static/js/92.fb3a53b4.chunk.js",
- "static/js/92.fb3a53b4.chunk.js.map": "/static/js/92.fb3a53b4.chunk.js.map",
- "static/js/93.00ba5818.chunk.js": "/static/js/93.00ba5818.chunk.js",
- "static/js/93.00ba5818.chunk.js.map": "/static/js/93.00ba5818.chunk.js.map",
- "static/js/94.45987604.chunk.js": "/static/js/94.45987604.chunk.js",
- "static/js/94.45987604.chunk.js.map": "/static/js/94.45987604.chunk.js.map",
- "static/js/95.1eb48d79.chunk.js": "/static/js/95.1eb48d79.chunk.js",
- "static/js/95.1eb48d79.chunk.js.map": "/static/js/95.1eb48d79.chunk.js.map",
- "static/js/96.4ddc8d0b.chunk.js": "/static/js/96.4ddc8d0b.chunk.js",
- "static/js/96.4ddc8d0b.chunk.js.map": "/static/js/96.4ddc8d0b.chunk.js.map",
- "static/js/97.61ca4dc4.chunk.js": "/static/js/97.61ca4dc4.chunk.js",
- "static/js/97.61ca4dc4.chunk.js.map": "/static/js/97.61ca4dc4.chunk.js.map",
- "static/js/98.99ce5979.chunk.js": "/static/js/98.99ce5979.chunk.js",
- "static/js/98.99ce5979.chunk.js.map": "/static/js/98.99ce5979.chunk.js.map",
- "static/js/99.14544f4f.chunk.js": "/static/js/99.14544f4f.chunk.js",
- "static/js/99.14544f4f.chunk.js.map": "/static/js/99.14544f4f.chunk.js.map",
- "static/js/100.ed9d26be.chunk.js": "/static/js/100.ed9d26be.chunk.js",
- "static/js/100.ed9d26be.chunk.js.map": "/static/js/100.ed9d26be.chunk.js.map",
- "static/js/101.689b05e2.chunk.js": "/static/js/101.689b05e2.chunk.js",
- "static/js/101.689b05e2.chunk.js.map": "/static/js/101.689b05e2.chunk.js.map",
- "static/js/102.9ff284a9.chunk.js": "/static/js/102.9ff284a9.chunk.js",
- "static/js/102.9ff284a9.chunk.js.map": "/static/js/102.9ff284a9.chunk.js.map",
- "static/js/103.dcaac96d.chunk.js": "/static/js/103.dcaac96d.chunk.js",
- "static/js/103.dcaac96d.chunk.js.map": "/static/js/103.dcaac96d.chunk.js.map",
- "static/js/104.f549029c.chunk.js": "/static/js/104.f549029c.chunk.js",
- "static/js/104.f549029c.chunk.js.map": "/static/js/104.f549029c.chunk.js.map",
- "static/js/105.83f51034.chunk.js": "/static/js/105.83f51034.chunk.js",
- "static/js/105.83f51034.chunk.js.map": "/static/js/105.83f51034.chunk.js.map",
- "static/js/106.6537ca31.chunk.js": "/static/js/106.6537ca31.chunk.js",
- "static/js/106.6537ca31.chunk.js.map": "/static/js/106.6537ca31.chunk.js.map",
- "static/js/107.19903471.chunk.js": "/static/js/107.19903471.chunk.js",
- "static/js/107.19903471.chunk.js.map": "/static/js/107.19903471.chunk.js.map",
- "static/js/108.26262342.chunk.js": "/static/js/108.26262342.chunk.js",
- "static/js/108.26262342.chunk.js.map": "/static/js/108.26262342.chunk.js.map",
- "static/js/109.f3843127.chunk.js": "/static/js/109.f3843127.chunk.js",
- "static/js/109.f3843127.chunk.js.map": "/static/js/109.f3843127.chunk.js.map",
- "static/js/110.12728625.chunk.js": "/static/js/110.12728625.chunk.js",
- "static/js/110.12728625.chunk.js.map": "/static/js/110.12728625.chunk.js.map",
- "static/js/111.11432069.chunk.js": "/static/js/111.11432069.chunk.js",
- "static/js/111.11432069.chunk.js.map": "/static/js/111.11432069.chunk.js.map",
- "static/js/112.67db0f1a.chunk.js": "/static/js/112.67db0f1a.chunk.js",
- "static/js/112.67db0f1a.chunk.js.map": "/static/js/112.67db0f1a.chunk.js.map",
- "static/js/113.a3d11bf5.chunk.js": "/static/js/113.a3d11bf5.chunk.js",
- "static/js/113.a3d11bf5.chunk.js.map": "/static/js/113.a3d11bf5.chunk.js.map",
- "static/js/114.b867d4c6.chunk.js": "/static/js/114.b867d4c6.chunk.js",
- "static/js/114.b867d4c6.chunk.js.map": "/static/js/114.b867d4c6.chunk.js.map",
- "static/js/115.9a6c7f59.chunk.js": "/static/js/115.9a6c7f59.chunk.js",
- "static/js/115.9a6c7f59.chunk.js.map": "/static/js/115.9a6c7f59.chunk.js.map",
- "static/js/116.cc5d2f2a.chunk.js": "/static/js/116.cc5d2f2a.chunk.js",
- "static/js/116.cc5d2f2a.chunk.js.map": "/static/js/116.cc5d2f2a.chunk.js.map",
- "static/js/117.924ab623.chunk.js": "/static/js/117.924ab623.chunk.js",
- "static/js/117.924ab623.chunk.js.map": "/static/js/117.924ab623.chunk.js.map",
- "static/js/118.0a54db54.chunk.js": "/static/js/118.0a54db54.chunk.js",
- "static/js/118.0a54db54.chunk.js.map": "/static/js/118.0a54db54.chunk.js.map",
- "static/js/119.ab1d7aeb.chunk.js": "/static/js/119.ab1d7aeb.chunk.js",
- "static/js/119.ab1d7aeb.chunk.js.map": "/static/js/119.ab1d7aeb.chunk.js.map",
- "static/js/120.d8b6c922.chunk.js": "/static/js/120.d8b6c922.chunk.js",
- "static/js/120.d8b6c922.chunk.js.map": "/static/js/120.d8b6c922.chunk.js.map",
- "static/js/121.841f85fc.chunk.js": "/static/js/121.841f85fc.chunk.js",
- "static/js/121.841f85fc.chunk.js.map": "/static/js/121.841f85fc.chunk.js.map",
- "static/js/122.d72ea534.chunk.js": "/static/js/122.d72ea534.chunk.js",
- "static/js/122.d72ea534.chunk.js.map": "/static/js/122.d72ea534.chunk.js.map",
- "static/js/123.9b447a32.chunk.js": "/static/js/123.9b447a32.chunk.js",
- "static/js/123.9b447a32.chunk.js.map": "/static/js/123.9b447a32.chunk.js.map",
- "static/js/124.a1e34b98.chunk.js": "/static/js/124.a1e34b98.chunk.js",
- "static/js/124.a1e34b98.chunk.js.map": "/static/js/124.a1e34b98.chunk.js.map",
- "static/js/125.7758a386.chunk.js": "/static/js/125.7758a386.chunk.js",
- "static/js/125.7758a386.chunk.js.map": "/static/js/125.7758a386.chunk.js.map",
- "static/js/126.1d25e1e5.chunk.js": "/static/js/126.1d25e1e5.chunk.js",
- "static/js/126.1d25e1e5.chunk.js.map": "/static/js/126.1d25e1e5.chunk.js.map",
- "static/js/127.f02cb2a8.chunk.js": "/static/js/127.f02cb2a8.chunk.js",
- "static/js/127.f02cb2a8.chunk.js.map": "/static/js/127.f02cb2a8.chunk.js.map",
- "static/js/128.da5196a4.chunk.js": "/static/js/128.da5196a4.chunk.js",
- "static/js/128.da5196a4.chunk.js.map": "/static/js/128.da5196a4.chunk.js.map",
- "static/js/129.2fb7a7ad.chunk.js": "/static/js/129.2fb7a7ad.chunk.js",
- "static/js/129.2fb7a7ad.chunk.js.map": "/static/js/129.2fb7a7ad.chunk.js.map",
- "static/js/130.a2113ae9.chunk.js": "/static/js/130.a2113ae9.chunk.js",
- "static/js/130.a2113ae9.chunk.js.map": "/static/js/130.a2113ae9.chunk.js.map",
- "static/js/131.106ceccd.chunk.js": "/static/js/131.106ceccd.chunk.js",
- "static/js/131.106ceccd.chunk.js.map": "/static/js/131.106ceccd.chunk.js.map",
- "static/js/132.9ae5fe80.chunk.js": "/static/js/132.9ae5fe80.chunk.js",
- "static/js/132.9ae5fe80.chunk.js.map": "/static/js/132.9ae5fe80.chunk.js.map",
- "static/js/133.36793458.chunk.js": "/static/js/133.36793458.chunk.js",
- "static/js/133.36793458.chunk.js.map": "/static/js/133.36793458.chunk.js.map",
- "static/js/134.c1283279.chunk.js": "/static/js/134.c1283279.chunk.js",
- "static/js/134.c1283279.chunk.js.map": "/static/js/134.c1283279.chunk.js.map",
- "static/js/135.921b307a.chunk.js": "/static/js/135.921b307a.chunk.js",
- "static/js/135.921b307a.chunk.js.map": "/static/js/135.921b307a.chunk.js.map",
- "static/js/136.7c113d9a.chunk.js": "/static/js/136.7c113d9a.chunk.js",
- "static/js/136.7c113d9a.chunk.js.map": "/static/js/136.7c113d9a.chunk.js.map",
- "static/js/137.6e95f661.chunk.js": "/static/js/137.6e95f661.chunk.js",
- "static/js/137.6e95f661.chunk.js.map": "/static/js/137.6e95f661.chunk.js.map",
- "static/js/138.367c54af.chunk.js": "/static/js/138.367c54af.chunk.js",
- "static/js/138.367c54af.chunk.js.map": "/static/js/138.367c54af.chunk.js.map",
- "static/js/139.321adef1.chunk.js": "/static/js/139.321adef1.chunk.js",
- "static/js/139.321adef1.chunk.js.map": "/static/js/139.321adef1.chunk.js.map",
- "static/js/140.ced3d0e6.chunk.js": "/static/js/140.ced3d0e6.chunk.js",
- "static/js/140.ced3d0e6.chunk.js.map": "/static/js/140.ced3d0e6.chunk.js.map",
- "static/js/141.4dff4fa8.chunk.js": "/static/js/141.4dff4fa8.chunk.js",
- "static/js/141.4dff4fa8.chunk.js.map": "/static/js/141.4dff4fa8.chunk.js.map",
- "static/js/142.3d607bba.chunk.js": "/static/js/142.3d607bba.chunk.js",
- "static/js/142.3d607bba.chunk.js.map": "/static/js/142.3d607bba.chunk.js.map",
- "static/js/143.ff9b6cd3.chunk.js": "/static/js/143.ff9b6cd3.chunk.js",
- "static/js/143.ff9b6cd3.chunk.js.map": "/static/js/143.ff9b6cd3.chunk.js.map",
- "static/js/144.995f9b8c.chunk.js": "/static/js/144.995f9b8c.chunk.js",
- "static/js/144.995f9b8c.chunk.js.map": "/static/js/144.995f9b8c.chunk.js.map",
- "static/js/145.c5df3cc7.chunk.js": "/static/js/145.c5df3cc7.chunk.js",
- "static/js/145.c5df3cc7.chunk.js.map": "/static/js/145.c5df3cc7.chunk.js.map",
- "static/js/146.9fab88cd.chunk.js": "/static/js/146.9fab88cd.chunk.js",
- "static/js/146.9fab88cd.chunk.js.map": "/static/js/146.9fab88cd.chunk.js.map",
- "static/js/147.f544d8e6.chunk.js": "/static/js/147.f544d8e6.chunk.js",
- "static/js/147.f544d8e6.chunk.js.map": "/static/js/147.f544d8e6.chunk.js.map",
- "static/js/148.18f153ac.chunk.js": "/static/js/148.18f153ac.chunk.js",
- "static/js/148.18f153ac.chunk.js.map": "/static/js/148.18f153ac.chunk.js.map",
- "static/js/149.c3d1563a.chunk.js": "/static/js/149.c3d1563a.chunk.js",
- "static/js/149.c3d1563a.chunk.js.map": "/static/js/149.c3d1563a.chunk.js.map",
- "static/js/150.f562f592.chunk.js": "/static/js/150.f562f592.chunk.js",
- "static/js/150.f562f592.chunk.js.map": "/static/js/150.f562f592.chunk.js.map",
- "static/js/151.f941e4af.chunk.js": "/static/js/151.f941e4af.chunk.js",
- "static/js/151.f941e4af.chunk.js.map": "/static/js/151.f941e4af.chunk.js.map",
- "static/js/152.e8e3547e.chunk.js": "/static/js/152.e8e3547e.chunk.js",
- "static/js/152.e8e3547e.chunk.js.map": "/static/js/152.e8e3547e.chunk.js.map",
- "static/js/153.2c4eddde.chunk.js": "/static/js/153.2c4eddde.chunk.js",
- "static/js/153.2c4eddde.chunk.js.map": "/static/js/153.2c4eddde.chunk.js.map",
- "static/js/154.80482df3.chunk.js": "/static/js/154.80482df3.chunk.js",
- "static/js/154.80482df3.chunk.js.map": "/static/js/154.80482df3.chunk.js.map",
- "static/js/155.9bbd60d0.chunk.js": "/static/js/155.9bbd60d0.chunk.js",
- "static/js/155.9bbd60d0.chunk.js.map": "/static/js/155.9bbd60d0.chunk.js.map",
- "static/js/156.172eeb96.chunk.js": "/static/js/156.172eeb96.chunk.js",
- "static/js/156.172eeb96.chunk.js.map": "/static/js/156.172eeb96.chunk.js.map",
- "static/js/157.ab78c7d3.chunk.js": "/static/js/157.ab78c7d3.chunk.js",
- "static/js/157.ab78c7d3.chunk.js.map": "/static/js/157.ab78c7d3.chunk.js.map",
- "static/js/158.be535c68.chunk.js": "/static/js/158.be535c68.chunk.js",
- "static/js/158.be535c68.chunk.js.map": "/static/js/158.be535c68.chunk.js.map",
- "static/js/159.942e7d92.chunk.js": "/static/js/159.942e7d92.chunk.js",
- "static/js/159.942e7d92.chunk.js.map": "/static/js/159.942e7d92.chunk.js.map",
- "static/js/160.dce0a880.chunk.js": "/static/js/160.dce0a880.chunk.js",
- "static/js/160.dce0a880.chunk.js.map": "/static/js/160.dce0a880.chunk.js.map",
- "static/js/161.1a2f0273.chunk.js": "/static/js/161.1a2f0273.chunk.js",
- "static/js/161.1a2f0273.chunk.js.map": "/static/js/161.1a2f0273.chunk.js.map",
- "static/js/162.d7b24079.chunk.js": "/static/js/162.d7b24079.chunk.js",
- "static/js/162.d7b24079.chunk.js.map": "/static/js/162.d7b24079.chunk.js.map",
- "static/js/163.7c2510d0.chunk.js": "/static/js/163.7c2510d0.chunk.js",
- "static/js/163.7c2510d0.chunk.js.map": "/static/js/163.7c2510d0.chunk.js.map",
- "static/js/164.389be2ea.chunk.js": "/static/js/164.389be2ea.chunk.js",
- "static/js/164.389be2ea.chunk.js.map": "/static/js/164.389be2ea.chunk.js.map",
- "static/js/165.781b2f44.chunk.js": "/static/js/165.781b2f44.chunk.js",
- "static/js/165.781b2f44.chunk.js.map": "/static/js/165.781b2f44.chunk.js.map",
- "static/js/166.53e93993.chunk.js": "/static/js/166.53e93993.chunk.js",
- "static/js/166.53e93993.chunk.js.map": "/static/js/166.53e93993.chunk.js.map",
- "static/js/167.f091b6a8.chunk.js": "/static/js/167.f091b6a8.chunk.js",
- "static/js/167.f091b6a8.chunk.js.map": "/static/js/167.f091b6a8.chunk.js.map",
- "static/js/168.918c0063.chunk.js": "/static/js/168.918c0063.chunk.js",
- "static/js/168.918c0063.chunk.js.map": "/static/js/168.918c0063.chunk.js.map",
- "static/js/169.dfeb55ac.chunk.js": "/static/js/169.dfeb55ac.chunk.js",
- "static/js/169.dfeb55ac.chunk.js.map": "/static/js/169.dfeb55ac.chunk.js.map",
- "static/js/170.7be2c85f.chunk.js": "/static/js/170.7be2c85f.chunk.js",
- "static/js/170.7be2c85f.chunk.js.map": "/static/js/170.7be2c85f.chunk.js.map",
- "static/js/171.7d0698db.chunk.js": "/static/js/171.7d0698db.chunk.js",
- "static/js/171.7d0698db.chunk.js.map": "/static/js/171.7d0698db.chunk.js.map",
- "static/js/172.cf2c376e.chunk.js": "/static/js/172.cf2c376e.chunk.js",
- "static/js/172.cf2c376e.chunk.js.map": "/static/js/172.cf2c376e.chunk.js.map",
- "static/js/173.f091ac03.chunk.js": "/static/js/173.f091ac03.chunk.js",
- "static/js/173.f091ac03.chunk.js.map": "/static/js/173.f091ac03.chunk.js.map",
- "static/js/174.91fc96b7.chunk.js": "/static/js/174.91fc96b7.chunk.js",
- "static/js/174.91fc96b7.chunk.js.map": "/static/js/174.91fc96b7.chunk.js.map",
- "static/js/175.3b466ef3.chunk.js": "/static/js/175.3b466ef3.chunk.js",
- "static/js/175.3b466ef3.chunk.js.map": "/static/js/175.3b466ef3.chunk.js.map",
- "static/js/176.0a9d3e87.chunk.js": "/static/js/176.0a9d3e87.chunk.js",
- "static/js/176.0a9d3e87.chunk.js.map": "/static/js/176.0a9d3e87.chunk.js.map",
- "static/js/177.0929c025.chunk.js": "/static/js/177.0929c025.chunk.js",
- "static/js/177.0929c025.chunk.js.map": "/static/js/177.0929c025.chunk.js.map",
- "static/js/178.7de5a8d4.chunk.js": "/static/js/178.7de5a8d4.chunk.js",
- "static/js/178.7de5a8d4.chunk.js.map": "/static/js/178.7de5a8d4.chunk.js.map",
- "static/js/179.7d579906.chunk.js": "/static/js/179.7d579906.chunk.js",
- "static/js/179.7d579906.chunk.js.map": "/static/js/179.7d579906.chunk.js.map",
- "static/js/180.6c6ca7eb.chunk.js": "/static/js/180.6c6ca7eb.chunk.js",
- "static/js/180.6c6ca7eb.chunk.js.map": "/static/js/180.6c6ca7eb.chunk.js.map",
- "static/js/181.bfc93195.chunk.js": "/static/js/181.bfc93195.chunk.js",
- "static/js/181.bfc93195.chunk.js.map": "/static/js/181.bfc93195.chunk.js.map",
- "static/js/182.72f2446c.chunk.js": "/static/js/182.72f2446c.chunk.js",
- "static/js/182.72f2446c.chunk.js.map": "/static/js/182.72f2446c.chunk.js.map",
- "static/js/183.42e80509.chunk.js": "/static/js/183.42e80509.chunk.js",
- "static/js/183.42e80509.chunk.js.map": "/static/js/183.42e80509.chunk.js.map",
- "static/js/184.3c8f7116.chunk.js": "/static/js/184.3c8f7116.chunk.js",
- "static/js/184.3c8f7116.chunk.js.map": "/static/js/184.3c8f7116.chunk.js.map",
- "static/js/185.5ed35291.chunk.js": "/static/js/185.5ed35291.chunk.js",
- "static/js/185.5ed35291.chunk.js.map": "/static/js/185.5ed35291.chunk.js.map",
- "static/js/186.8a500c60.chunk.js": "/static/js/186.8a500c60.chunk.js",
- "static/js/186.8a500c60.chunk.js.map": "/static/js/186.8a500c60.chunk.js.map",
- "static/js/187.6dc97572.chunk.js": "/static/js/187.6dc97572.chunk.js",
- "static/js/187.6dc97572.chunk.js.map": "/static/js/187.6dc97572.chunk.js.map",
- "static/js/188.6fba460f.chunk.js": "/static/js/188.6fba460f.chunk.js",
- "static/js/188.6fba460f.chunk.js.map": "/static/js/188.6fba460f.chunk.js.map",
- "static/js/189.44200fe8.chunk.js": "/static/js/189.44200fe8.chunk.js",
- "static/js/189.44200fe8.chunk.js.map": "/static/js/189.44200fe8.chunk.js.map",
- "static/js/190.9d295983.chunk.js": "/static/js/190.9d295983.chunk.js",
- "static/js/190.9d295983.chunk.js.map": "/static/js/190.9d295983.chunk.js.map",
- "static/js/191.713b7bc1.chunk.js": "/static/js/191.713b7bc1.chunk.js",
- "static/js/191.713b7bc1.chunk.js.map": "/static/js/191.713b7bc1.chunk.js.map",
- "static/js/192.c3e58b76.chunk.js": "/static/js/192.c3e58b76.chunk.js",
- "static/js/192.c3e58b76.chunk.js.map": "/static/js/192.c3e58b76.chunk.js.map",
- "static/js/193.05410355.chunk.js": "/static/js/193.05410355.chunk.js",
- "static/js/193.05410355.chunk.js.map": "/static/js/193.05410355.chunk.js.map",
- "static/js/194.9370e2cb.chunk.js": "/static/js/194.9370e2cb.chunk.js",
- "static/js/194.9370e2cb.chunk.js.map": "/static/js/194.9370e2cb.chunk.js.map",
- "static/js/195.8c52a197.chunk.js": "/static/js/195.8c52a197.chunk.js",
- "static/js/195.8c52a197.chunk.js.map": "/static/js/195.8c52a197.chunk.js.map",
- "static/js/196.e3adbe61.chunk.js": "/static/js/196.e3adbe61.chunk.js",
- "static/js/196.e3adbe61.chunk.js.map": "/static/js/196.e3adbe61.chunk.js.map",
- "static/js/197.1229d3f7.chunk.js": "/static/js/197.1229d3f7.chunk.js",
- "static/js/197.1229d3f7.chunk.js.map": "/static/js/197.1229d3f7.chunk.js.map",
- "static/js/198.864258be.chunk.js": "/static/js/198.864258be.chunk.js",
- "static/js/198.864258be.chunk.js.map": "/static/js/198.864258be.chunk.js.map",
- "static/js/199.02050f91.chunk.js": "/static/js/199.02050f91.chunk.js",
- "static/js/199.02050f91.chunk.js.map": "/static/js/199.02050f91.chunk.js.map",
- "static/js/200.c3eb9ffb.chunk.js": "/static/js/200.c3eb9ffb.chunk.js",
- "static/js/200.c3eb9ffb.chunk.js.map": "/static/js/200.c3eb9ffb.chunk.js.map",
- "static/js/201.43650f2d.chunk.js": "/static/js/201.43650f2d.chunk.js",
- "static/js/201.43650f2d.chunk.js.map": "/static/js/201.43650f2d.chunk.js.map",
- "static/js/202.630bcbae.chunk.js": "/static/js/202.630bcbae.chunk.js",
- "static/js/202.630bcbae.chunk.js.map": "/static/js/202.630bcbae.chunk.js.map",
- "static/js/203.bdc52a6a.chunk.js": "/static/js/203.bdc52a6a.chunk.js",
- "static/js/203.bdc52a6a.chunk.js.map": "/static/js/203.bdc52a6a.chunk.js.map",
- "static/js/204.39fd56b2.chunk.js": "/static/js/204.39fd56b2.chunk.js",
- "static/js/204.39fd56b2.chunk.js.map": "/static/js/204.39fd56b2.chunk.js.map",
- "static/js/205.f7f4ff8b.chunk.js": "/static/js/205.f7f4ff8b.chunk.js",
- "static/js/205.f7f4ff8b.chunk.js.map": "/static/js/205.f7f4ff8b.chunk.js.map",
- "static/js/206.1e079db7.chunk.js": "/static/js/206.1e079db7.chunk.js",
- "static/js/206.1e079db7.chunk.js.map": "/static/js/206.1e079db7.chunk.js.map",
- "static/js/207.8f1ff1e8.chunk.js": "/static/js/207.8f1ff1e8.chunk.js",
- "static/js/207.8f1ff1e8.chunk.js.map": "/static/js/207.8f1ff1e8.chunk.js.map",
- "static/js/208.e07f5bdd.chunk.js": "/static/js/208.e07f5bdd.chunk.js",
- "static/js/208.e07f5bdd.chunk.js.map": "/static/js/208.e07f5bdd.chunk.js.map",
- "static/js/209.344e3b45.chunk.js": "/static/js/209.344e3b45.chunk.js",
- "static/js/209.344e3b45.chunk.js.map": "/static/js/209.344e3b45.chunk.js.map",
- "static/js/210.146a0bf5.chunk.js": "/static/js/210.146a0bf5.chunk.js",
- "static/js/210.146a0bf5.chunk.js.map": "/static/js/210.146a0bf5.chunk.js.map",
- "static/js/211.1999c3c2.chunk.js": "/static/js/211.1999c3c2.chunk.js",
- "static/js/211.1999c3c2.chunk.js.map": "/static/js/211.1999c3c2.chunk.js.map",
- "static/js/212.b0854229.chunk.js": "/static/js/212.b0854229.chunk.js",
- "static/js/212.b0854229.chunk.js.map": "/static/js/212.b0854229.chunk.js.map",
- "static/js/213.4720cfdf.chunk.js": "/static/js/213.4720cfdf.chunk.js",
- "static/js/213.4720cfdf.chunk.js.map": "/static/js/213.4720cfdf.chunk.js.map",
- "static/js/214.e1a5c52b.chunk.js": "/static/js/214.e1a5c52b.chunk.js",
- "static/js/214.e1a5c52b.chunk.js.map": "/static/js/214.e1a5c52b.chunk.js.map",
- "static/js/215.edf36ea8.chunk.js": "/static/js/215.edf36ea8.chunk.js",
- "static/js/215.edf36ea8.chunk.js.map": "/static/js/215.edf36ea8.chunk.js.map",
- "static/js/216.0e0e0c4d.chunk.js": "/static/js/216.0e0e0c4d.chunk.js",
- "static/js/216.0e0e0c4d.chunk.js.map": "/static/js/216.0e0e0c4d.chunk.js.map",
- "static/js/217.d5ccc2c6.chunk.js": "/static/js/217.d5ccc2c6.chunk.js",
- "static/js/217.d5ccc2c6.chunk.js.map": "/static/js/217.d5ccc2c6.chunk.js.map",
- "static/js/218.e0cecb3b.chunk.js": "/static/js/218.e0cecb3b.chunk.js",
- "static/js/218.e0cecb3b.chunk.js.map": "/static/js/218.e0cecb3b.chunk.js.map",
- "static/js/219.8c8874bc.chunk.js": "/static/js/219.8c8874bc.chunk.js",
- "static/js/219.8c8874bc.chunk.js.map": "/static/js/219.8c8874bc.chunk.js.map",
- "static/js/220.9d3f1834.chunk.js": "/static/js/220.9d3f1834.chunk.js",
- "static/js/220.9d3f1834.chunk.js.map": "/static/js/220.9d3f1834.chunk.js.map",
- "static/js/221.2bd1a598.chunk.js": "/static/js/221.2bd1a598.chunk.js",
- "static/js/221.2bd1a598.chunk.js.map": "/static/js/221.2bd1a598.chunk.js.map",
- "static/js/222.c99bdf49.chunk.js": "/static/js/222.c99bdf49.chunk.js",
- "static/js/222.c99bdf49.chunk.js.map": "/static/js/222.c99bdf49.chunk.js.map",
- "static/js/223.51ecc43c.chunk.js": "/static/js/223.51ecc43c.chunk.js",
- "static/js/223.51ecc43c.chunk.js.map": "/static/js/223.51ecc43c.chunk.js.map",
- "static/js/224.8e45b844.chunk.js": "/static/js/224.8e45b844.chunk.js",
- "static/js/224.8e45b844.chunk.js.map": "/static/js/224.8e45b844.chunk.js.map",
- "static/js/225.bb30aea5.chunk.js": "/static/js/225.bb30aea5.chunk.js",
- "static/js/225.bb30aea5.chunk.js.map": "/static/js/225.bb30aea5.chunk.js.map",
- "static/js/226.b42e4b7b.chunk.js": "/static/js/226.b42e4b7b.chunk.js",
- "static/js/226.b42e4b7b.chunk.js.map": "/static/js/226.b42e4b7b.chunk.js.map",
- "static/js/227.f69dbf33.chunk.js": "/static/js/227.f69dbf33.chunk.js",
- "static/js/227.f69dbf33.chunk.js.map": "/static/js/227.f69dbf33.chunk.js.map",
- "static/js/228.7939b737.chunk.js": "/static/js/228.7939b737.chunk.js",
- "static/js/228.7939b737.chunk.js.map": "/static/js/228.7939b737.chunk.js.map",
- "static/js/229.4a123c91.chunk.js": "/static/js/229.4a123c91.chunk.js",
- "static/js/229.4a123c91.chunk.js.map": "/static/js/229.4a123c91.chunk.js.map",
- "static/js/230.c1b2d1dc.chunk.js": "/static/js/230.c1b2d1dc.chunk.js",
- "static/js/230.c1b2d1dc.chunk.js.map": "/static/js/230.c1b2d1dc.chunk.js.map",
- "static/js/231.e48ae90f.chunk.js": "/static/js/231.e48ae90f.chunk.js",
- "static/js/231.e48ae90f.chunk.js.map": "/static/js/231.e48ae90f.chunk.js.map",
- "static/js/232.8d13f04f.chunk.js": "/static/js/232.8d13f04f.chunk.js",
- "static/js/232.8d13f04f.chunk.js.map": "/static/js/232.8d13f04f.chunk.js.map",
- "static/js/233.b6e870e3.chunk.js": "/static/js/233.b6e870e3.chunk.js",
- "static/js/233.b6e870e3.chunk.js.map": "/static/js/233.b6e870e3.chunk.js.map",
- "static/js/234.b642c35c.chunk.js": "/static/js/234.b642c35c.chunk.js",
- "static/js/234.b642c35c.chunk.js.map": "/static/js/234.b642c35c.chunk.js.map",
- "static/js/235.01546480.chunk.js": "/static/js/235.01546480.chunk.js",
- "static/js/235.01546480.chunk.js.map": "/static/js/235.01546480.chunk.js.map",
- "static/js/236.627c167b.chunk.js": "/static/js/236.627c167b.chunk.js",
- "static/js/236.627c167b.chunk.js.map": "/static/js/236.627c167b.chunk.js.map",
- "static/js/237.24c6cf02.chunk.js": "/static/js/237.24c6cf02.chunk.js",
- "static/js/237.24c6cf02.chunk.js.map": "/static/js/237.24c6cf02.chunk.js.map",
- "static/js/238.6d2ff5e0.chunk.js": "/static/js/238.6d2ff5e0.chunk.js",
- "static/js/238.6d2ff5e0.chunk.js.map": "/static/js/238.6d2ff5e0.chunk.js.map",
- "static/js/239.93e513a1.chunk.js": "/static/js/239.93e513a1.chunk.js",
- "static/js/239.93e513a1.chunk.js.map": "/static/js/239.93e513a1.chunk.js.map",
- "static/js/240.f98758df.chunk.js": "/static/js/240.f98758df.chunk.js",
- "static/js/240.f98758df.chunk.js.map": "/static/js/240.f98758df.chunk.js.map",
- "static/js/241.a38a88e6.chunk.js": "/static/js/241.a38a88e6.chunk.js",
- "static/js/241.a38a88e6.chunk.js.map": "/static/js/241.a38a88e6.chunk.js.map",
- "static/js/242.589c4f99.chunk.js": "/static/js/242.589c4f99.chunk.js",
- "static/js/242.589c4f99.chunk.js.map": "/static/js/242.589c4f99.chunk.js.map",
- "static/js/243.47a4a5ef.chunk.js": "/static/js/243.47a4a5ef.chunk.js",
- "static/js/243.47a4a5ef.chunk.js.map": "/static/js/243.47a4a5ef.chunk.js.map",
- "static/js/244.8ecd2e40.chunk.js": "/static/js/244.8ecd2e40.chunk.js",
- "static/js/244.8ecd2e40.chunk.js.map": "/static/js/244.8ecd2e40.chunk.js.map",
- "static/js/245.fcfc96e2.chunk.js": "/static/js/245.fcfc96e2.chunk.js",
- "static/js/245.fcfc96e2.chunk.js.map": "/static/js/245.fcfc96e2.chunk.js.map",
- "static/js/246.e48434c5.chunk.js": "/static/js/246.e48434c5.chunk.js",
- "static/js/246.e48434c5.chunk.js.map": "/static/js/246.e48434c5.chunk.js.map",
- "static/js/247.b8fd7bf6.chunk.js": "/static/js/247.b8fd7bf6.chunk.js",
- "static/js/247.b8fd7bf6.chunk.js.map": "/static/js/247.b8fd7bf6.chunk.js.map",
- "static/js/248.f44e32c1.chunk.js": "/static/js/248.f44e32c1.chunk.js",
- "static/js/248.f44e32c1.chunk.js.map": "/static/js/248.f44e32c1.chunk.js.map",
- "static/js/249.3a220914.chunk.js": "/static/js/249.3a220914.chunk.js",
- "static/js/249.3a220914.chunk.js.map": "/static/js/249.3a220914.chunk.js.map",
- "static/js/250.2eba3e30.chunk.js": "/static/js/250.2eba3e30.chunk.js",
- "static/js/250.2eba3e30.chunk.js.map": "/static/js/250.2eba3e30.chunk.js.map",
- "static/js/251.f6ef2f08.chunk.js": "/static/js/251.f6ef2f08.chunk.js",
- "static/js/251.f6ef2f08.chunk.js.map": "/static/js/251.f6ef2f08.chunk.js.map",
- "static/js/252.caf06036.chunk.js": "/static/js/252.caf06036.chunk.js",
- "static/js/252.caf06036.chunk.js.map": "/static/js/252.caf06036.chunk.js.map",
- "static/js/253.250ed88a.chunk.js": "/static/js/253.250ed88a.chunk.js",
- "static/js/253.250ed88a.chunk.js.map": "/static/js/253.250ed88a.chunk.js.map",
- "static/js/254.913332fd.chunk.js": "/static/js/254.913332fd.chunk.js",
- "static/js/254.913332fd.chunk.js.map": "/static/js/254.913332fd.chunk.js.map",
- "static/js/255.375b9383.chunk.js": "/static/js/255.375b9383.chunk.js",
- "static/js/255.375b9383.chunk.js.map": "/static/js/255.375b9383.chunk.js.map",
- "static/js/256.eacbf5b6.chunk.js": "/static/js/256.eacbf5b6.chunk.js",
- "static/js/256.eacbf5b6.chunk.js.map": "/static/js/256.eacbf5b6.chunk.js.map",
- "static/js/257.7cc07a91.chunk.js": "/static/js/257.7cc07a91.chunk.js",
- "static/js/257.7cc07a91.chunk.js.map": "/static/js/257.7cc07a91.chunk.js.map",
- "static/js/258.e65e4763.chunk.js": "/static/js/258.e65e4763.chunk.js",
- "static/js/258.e65e4763.chunk.js.map": "/static/js/258.e65e4763.chunk.js.map",
- "static/js/259.695f12c5.chunk.js": "/static/js/259.695f12c5.chunk.js",
- "static/js/259.695f12c5.chunk.js.map": "/static/js/259.695f12c5.chunk.js.map",
- "static/js/260.017c2dc3.chunk.js": "/static/js/260.017c2dc3.chunk.js",
- "static/js/260.017c2dc3.chunk.js.map": "/static/js/260.017c2dc3.chunk.js.map",
- "static/js/261.ff57cbff.chunk.js": "/static/js/261.ff57cbff.chunk.js",
- "static/js/261.ff57cbff.chunk.js.map": "/static/js/261.ff57cbff.chunk.js.map",
- "static/js/262.c9922d09.chunk.js": "/static/js/262.c9922d09.chunk.js",
- "static/js/262.c9922d09.chunk.js.map": "/static/js/262.c9922d09.chunk.js.map",
- "static/js/263.5e0998e2.chunk.js": "/static/js/263.5e0998e2.chunk.js",
- "static/js/263.5e0998e2.chunk.js.map": "/static/js/263.5e0998e2.chunk.js.map",
- "static/js/264.9f817011.chunk.js": "/static/js/264.9f817011.chunk.js",
- "static/js/264.9f817011.chunk.js.map": "/static/js/264.9f817011.chunk.js.map",
- "static/js/265.9b006fad.chunk.js": "/static/js/265.9b006fad.chunk.js",
- "static/js/265.9b006fad.chunk.js.map": "/static/js/265.9b006fad.chunk.js.map",
- "static/js/266.5f4d7c15.chunk.js": "/static/js/266.5f4d7c15.chunk.js",
- "static/js/266.5f4d7c15.chunk.js.map": "/static/js/266.5f4d7c15.chunk.js.map",
- "static/js/267.0bcda1f0.chunk.js": "/static/js/267.0bcda1f0.chunk.js",
- "static/js/267.0bcda1f0.chunk.js.map": "/static/js/267.0bcda1f0.chunk.js.map",
- "static/js/268.cf7dc612.chunk.js": "/static/js/268.cf7dc612.chunk.js",
- "static/js/268.cf7dc612.chunk.js.map": "/static/js/268.cf7dc612.chunk.js.map",
- "static/js/269.af1bf043.chunk.js": "/static/js/269.af1bf043.chunk.js",
- "static/js/269.af1bf043.chunk.js.map": "/static/js/269.af1bf043.chunk.js.map",
- "static/js/270.57c2de63.chunk.js": "/static/js/270.57c2de63.chunk.js",
- "static/js/270.57c2de63.chunk.js.map": "/static/js/270.57c2de63.chunk.js.map",
- "static/js/271.2068cc21.chunk.js": "/static/js/271.2068cc21.chunk.js",
- "static/js/271.2068cc21.chunk.js.map": "/static/js/271.2068cc21.chunk.js.map",
- "static/js/272.cbb8b38b.chunk.js": "/static/js/272.cbb8b38b.chunk.js",
- "static/js/272.cbb8b38b.chunk.js.map": "/static/js/272.cbb8b38b.chunk.js.map",
- "static/js/273.38449a67.chunk.js": "/static/js/273.38449a67.chunk.js",
- "static/js/273.38449a67.chunk.js.map": "/static/js/273.38449a67.chunk.js.map",
- "static/js/274.1a9a5b20.chunk.js": "/static/js/274.1a9a5b20.chunk.js",
- "static/js/274.1a9a5b20.chunk.js.map": "/static/js/274.1a9a5b20.chunk.js.map",
- "static/js/275.20a3dd9f.chunk.js": "/static/js/275.20a3dd9f.chunk.js",
- "static/js/275.20a3dd9f.chunk.js.map": "/static/js/275.20a3dd9f.chunk.js.map",
- "static/js/276.f955abe0.chunk.js": "/static/js/276.f955abe0.chunk.js",
- "static/js/276.f955abe0.chunk.js.map": "/static/js/276.f955abe0.chunk.js.map",
- "static/js/277.c83eb932.chunk.js": "/static/js/277.c83eb932.chunk.js",
- "static/js/277.c83eb932.chunk.js.map": "/static/js/277.c83eb932.chunk.js.map",
- "static/js/278.d1e92089.chunk.js": "/static/js/278.d1e92089.chunk.js",
- "static/js/278.d1e92089.chunk.js.map": "/static/js/278.d1e92089.chunk.js.map",
- "static/js/279.ab3e3341.chunk.js": "/static/js/279.ab3e3341.chunk.js",
- "static/js/279.ab3e3341.chunk.js.map": "/static/js/279.ab3e3341.chunk.js.map",
- "static/js/280.a44d993d.chunk.js": "/static/js/280.a44d993d.chunk.js",
- "static/js/280.a44d993d.chunk.js.map": "/static/js/280.a44d993d.chunk.js.map",
- "static/js/281.84c55e32.chunk.js": "/static/js/281.84c55e32.chunk.js",
- "static/js/281.84c55e32.chunk.js.map": "/static/js/281.84c55e32.chunk.js.map",
- "static/js/282.13448b4d.chunk.js": "/static/js/282.13448b4d.chunk.js",
- "static/js/282.13448b4d.chunk.js.map": "/static/js/282.13448b4d.chunk.js.map",
- "static/js/283.2f1cd87a.chunk.js": "/static/js/283.2f1cd87a.chunk.js",
- "static/js/283.2f1cd87a.chunk.js.map": "/static/js/283.2f1cd87a.chunk.js.map",
- "static/js/284.fad0ab58.chunk.js": "/static/js/284.fad0ab58.chunk.js",
- "static/js/284.fad0ab58.chunk.js.map": "/static/js/284.fad0ab58.chunk.js.map",
- "static/js/285.568a1b06.chunk.js": "/static/js/285.568a1b06.chunk.js",
- "static/js/285.568a1b06.chunk.js.map": "/static/js/285.568a1b06.chunk.js.map",
- "static/js/286.3d6ef4be.chunk.js": "/static/js/286.3d6ef4be.chunk.js",
- "static/js/286.3d6ef4be.chunk.js.map": "/static/js/286.3d6ef4be.chunk.js.map",
- "static/js/287.34cee9ec.chunk.js": "/static/js/287.34cee9ec.chunk.js",
- "static/js/287.34cee9ec.chunk.js.map": "/static/js/287.34cee9ec.chunk.js.map",
- "static/js/288.9af33e8a.chunk.js": "/static/js/288.9af33e8a.chunk.js",
- "static/js/288.9af33e8a.chunk.js.map": "/static/js/288.9af33e8a.chunk.js.map",
- "static/js/289.e8d9517e.chunk.js": "/static/js/289.e8d9517e.chunk.js",
- "static/js/289.e8d9517e.chunk.js.map": "/static/js/289.e8d9517e.chunk.js.map",
- "static/js/290.275e1bec.chunk.js": "/static/js/290.275e1bec.chunk.js",
- "static/js/290.275e1bec.chunk.js.map": "/static/js/290.275e1bec.chunk.js.map",
- "static/js/291.18d11b54.chunk.js": "/static/js/291.18d11b54.chunk.js",
- "static/js/291.18d11b54.chunk.js.map": "/static/js/291.18d11b54.chunk.js.map",
- "static/js/292.f6b3cbbc.chunk.js": "/static/js/292.f6b3cbbc.chunk.js",
- "static/js/292.f6b3cbbc.chunk.js.map": "/static/js/292.f6b3cbbc.chunk.js.map",
- "static/js/293.b3bbf2f9.chunk.js": "/static/js/293.b3bbf2f9.chunk.js",
- "static/js/293.b3bbf2f9.chunk.js.map": "/static/js/293.b3bbf2f9.chunk.js.map",
- "static/js/294.2547bc88.chunk.js": "/static/js/294.2547bc88.chunk.js",
- "static/js/294.2547bc88.chunk.js.map": "/static/js/294.2547bc88.chunk.js.map",
- "static/js/295.ca26e4ff.chunk.js": "/static/js/295.ca26e4ff.chunk.js",
- "static/js/295.ca26e4ff.chunk.js.map": "/static/js/295.ca26e4ff.chunk.js.map",
- "static/js/296.b3c9baac.chunk.js": "/static/js/296.b3c9baac.chunk.js",
- "static/js/296.b3c9baac.chunk.js.map": "/static/js/296.b3c9baac.chunk.js.map",
- "static/js/297.99d47517.chunk.js": "/static/js/297.99d47517.chunk.js",
- "static/js/297.99d47517.chunk.js.map": "/static/js/297.99d47517.chunk.js.map",
- "static/js/298.c1aa661b.chunk.js": "/static/js/298.c1aa661b.chunk.js",
- "static/js/298.c1aa661b.chunk.js.map": "/static/js/298.c1aa661b.chunk.js.map",
- "static/js/299.3b72a4db.chunk.js": "/static/js/299.3b72a4db.chunk.js",
- "static/js/299.3b72a4db.chunk.js.map": "/static/js/299.3b72a4db.chunk.js.map",
- "static/js/300.953a75ef.chunk.js": "/static/js/300.953a75ef.chunk.js",
- "static/js/300.953a75ef.chunk.js.map": "/static/js/300.953a75ef.chunk.js.map",
- "static/js/301.6beb3af4.chunk.js": "/static/js/301.6beb3af4.chunk.js",
- "static/js/301.6beb3af4.chunk.js.map": "/static/js/301.6beb3af4.chunk.js.map",
- "static/js/302.fdf96642.chunk.js": "/static/js/302.fdf96642.chunk.js",
- "static/js/302.fdf96642.chunk.js.map": "/static/js/302.fdf96642.chunk.js.map",
- "static/js/303.281ee8bd.chunk.js": "/static/js/303.281ee8bd.chunk.js",
- "static/js/303.281ee8bd.chunk.js.map": "/static/js/303.281ee8bd.chunk.js.map",
- "static/js/304.75269e82.chunk.js": "/static/js/304.75269e82.chunk.js",
- "static/js/304.75269e82.chunk.js.map": "/static/js/304.75269e82.chunk.js.map",
- "static/js/305.39a8cf00.chunk.js": "/static/js/305.39a8cf00.chunk.js",
- "static/js/305.39a8cf00.chunk.js.map": "/static/js/305.39a8cf00.chunk.js.map",
- "static/js/306.bb6de8e4.chunk.js": "/static/js/306.bb6de8e4.chunk.js",
- "static/js/306.bb6de8e4.chunk.js.map": "/static/js/306.bb6de8e4.chunk.js.map",
- "static/js/307.76180639.chunk.js": "/static/js/307.76180639.chunk.js",
- "static/js/307.76180639.chunk.js.map": "/static/js/307.76180639.chunk.js.map",
- "static/js/308.15a3e48e.chunk.js": "/static/js/308.15a3e48e.chunk.js",
- "static/js/308.15a3e48e.chunk.js.map": "/static/js/308.15a3e48e.chunk.js.map",
- "static/js/309.0991f0e8.chunk.js": "/static/js/309.0991f0e8.chunk.js",
- "static/js/309.0991f0e8.chunk.js.map": "/static/js/309.0991f0e8.chunk.js.map",
- "static/js/310.306e1564.chunk.js": "/static/js/310.306e1564.chunk.js",
- "static/js/310.306e1564.chunk.js.map": "/static/js/310.306e1564.chunk.js.map",
- "static/js/311.9397afa9.chunk.js": "/static/js/311.9397afa9.chunk.js",
- "static/js/311.9397afa9.chunk.js.map": "/static/js/311.9397afa9.chunk.js.map",
- "static/js/312.f2132932.chunk.js": "/static/js/312.f2132932.chunk.js",
- "static/js/312.f2132932.chunk.js.map": "/static/js/312.f2132932.chunk.js.map",
- "static/js/313.3b6123f2.chunk.js": "/static/js/313.3b6123f2.chunk.js",
- "static/js/313.3b6123f2.chunk.js.map": "/static/js/313.3b6123f2.chunk.js.map",
- "static/js/314.3e599d9d.chunk.js": "/static/js/314.3e599d9d.chunk.js",
- "static/js/314.3e599d9d.chunk.js.map": "/static/js/314.3e599d9d.chunk.js.map",
- "static/js/315.b5edc70f.chunk.js": "/static/js/315.b5edc70f.chunk.js",
- "static/js/315.b5edc70f.chunk.js.map": "/static/js/315.b5edc70f.chunk.js.map",
- "static/js/316.9a69d33b.chunk.js": "/static/js/316.9a69d33b.chunk.js",
- "static/js/316.9a69d33b.chunk.js.map": "/static/js/316.9a69d33b.chunk.js.map",
- "static/js/317.3adb1be6.chunk.js": "/static/js/317.3adb1be6.chunk.js",
- "static/js/317.3adb1be6.chunk.js.map": "/static/js/317.3adb1be6.chunk.js.map",
- "static/js/318.f50b4400.chunk.js": "/static/js/318.f50b4400.chunk.js",
- "static/js/318.f50b4400.chunk.js.map": "/static/js/318.f50b4400.chunk.js.map",
- "static/js/319.2730b8c3.chunk.js": "/static/js/319.2730b8c3.chunk.js",
- "static/js/319.2730b8c3.chunk.js.map": "/static/js/319.2730b8c3.chunk.js.map",
- "static/js/320.947934ae.chunk.js": "/static/js/320.947934ae.chunk.js",
- "static/js/320.947934ae.chunk.js.map": "/static/js/320.947934ae.chunk.js.map",
- "static/js/321.c8b7d905.chunk.js": "/static/js/321.c8b7d905.chunk.js",
- "static/js/321.c8b7d905.chunk.js.map": "/static/js/321.c8b7d905.chunk.js.map",
- "static/js/322.91558df5.chunk.js": "/static/js/322.91558df5.chunk.js",
- "static/js/322.91558df5.chunk.js.map": "/static/js/322.91558df5.chunk.js.map",
- "static/js/323.f5fa72ee.chunk.js": "/static/js/323.f5fa72ee.chunk.js",
- "static/js/323.f5fa72ee.chunk.js.map": "/static/js/323.f5fa72ee.chunk.js.map",
- "static/js/324.36c893fd.chunk.js": "/static/js/324.36c893fd.chunk.js",
- "static/js/324.36c893fd.chunk.js.map": "/static/js/324.36c893fd.chunk.js.map",
- "static/js/325.9674c286.chunk.js": "/static/js/325.9674c286.chunk.js",
- "static/js/325.9674c286.chunk.js.map": "/static/js/325.9674c286.chunk.js.map",
- "static/js/326.df323406.chunk.js": "/static/js/326.df323406.chunk.js",
- "static/js/326.df323406.chunk.js.map": "/static/js/326.df323406.chunk.js.map",
- "static/js/327.55b14d08.chunk.js": "/static/js/327.55b14d08.chunk.js",
- "static/js/327.55b14d08.chunk.js.map": "/static/js/327.55b14d08.chunk.js.map",
- "static/js/328.f3dad4a7.chunk.js": "/static/js/328.f3dad4a7.chunk.js",
- "static/js/328.f3dad4a7.chunk.js.map": "/static/js/328.f3dad4a7.chunk.js.map",
- "static/js/329.11fce8ba.chunk.js": "/static/js/329.11fce8ba.chunk.js",
- "static/js/329.11fce8ba.chunk.js.map": "/static/js/329.11fce8ba.chunk.js.map",
- "static/js/330.e1055db7.chunk.js": "/static/js/330.e1055db7.chunk.js",
- "static/js/330.e1055db7.chunk.js.map": "/static/js/330.e1055db7.chunk.js.map",
- "static/js/331.9da046a6.chunk.js": "/static/js/331.9da046a6.chunk.js",
- "static/js/331.9da046a6.chunk.js.map": "/static/js/331.9da046a6.chunk.js.map",
- "static/js/332.d022f33b.chunk.js": "/static/js/332.d022f33b.chunk.js",
- "static/js/332.d022f33b.chunk.js.map": "/static/js/332.d022f33b.chunk.js.map",
- "static/js/333.f46e5633.chunk.js": "/static/js/333.f46e5633.chunk.js",
- "static/js/333.f46e5633.chunk.js.map": "/static/js/333.f46e5633.chunk.js.map",
- "static/js/334.8088f207.chunk.js": "/static/js/334.8088f207.chunk.js",
- "static/js/334.8088f207.chunk.js.map": "/static/js/334.8088f207.chunk.js.map",
- "static/js/335.5790149e.chunk.js": "/static/js/335.5790149e.chunk.js",
- "static/js/335.5790149e.chunk.js.map": "/static/js/335.5790149e.chunk.js.map",
- "static/js/336.68fb967c.chunk.js": "/static/js/336.68fb967c.chunk.js",
- "static/js/336.68fb967c.chunk.js.map": "/static/js/336.68fb967c.chunk.js.map",
- "static/js/337.62d35774.chunk.js": "/static/js/337.62d35774.chunk.js",
- "static/js/337.62d35774.chunk.js.map": "/static/js/337.62d35774.chunk.js.map",
- "static/js/338.e871568d.chunk.js": "/static/js/338.e871568d.chunk.js",
- "static/js/338.e871568d.chunk.js.map": "/static/js/338.e871568d.chunk.js.map",
- "static/js/339.b333e79b.chunk.js": "/static/js/339.b333e79b.chunk.js",
- "static/js/339.b333e79b.chunk.js.map": "/static/js/339.b333e79b.chunk.js.map",
- "static/js/340.c95d449a.chunk.js": "/static/js/340.c95d449a.chunk.js",
- "static/js/340.c95d449a.chunk.js.map": "/static/js/340.c95d449a.chunk.js.map",
- "static/js/341.b5e0c2e2.chunk.js": "/static/js/341.b5e0c2e2.chunk.js",
- "static/js/341.b5e0c2e2.chunk.js.map": "/static/js/341.b5e0c2e2.chunk.js.map",
- "static/js/342.cfd39731.chunk.js": "/static/js/342.cfd39731.chunk.js",
- "static/js/342.cfd39731.chunk.js.map": "/static/js/342.cfd39731.chunk.js.map",
- "static/js/343.4d945725.chunk.js": "/static/js/343.4d945725.chunk.js",
- "static/js/343.4d945725.chunk.js.map": "/static/js/343.4d945725.chunk.js.map",
- "static/js/344.272939a0.chunk.js": "/static/js/344.272939a0.chunk.js",
- "static/js/344.272939a0.chunk.js.map": "/static/js/344.272939a0.chunk.js.map",
- "static/js/345.36980d3f.chunk.js": "/static/js/345.36980d3f.chunk.js",
- "static/js/345.36980d3f.chunk.js.map": "/static/js/345.36980d3f.chunk.js.map",
- "static/js/346.1617d318.chunk.js": "/static/js/346.1617d318.chunk.js",
- "static/js/346.1617d318.chunk.js.map": "/static/js/346.1617d318.chunk.js.map",
- "static/js/347.a997c896.chunk.js": "/static/js/347.a997c896.chunk.js",
- "static/js/347.a997c896.chunk.js.map": "/static/js/347.a997c896.chunk.js.map",
- "static/js/348.a46655aa.chunk.js": "/static/js/348.a46655aa.chunk.js",
- "static/js/348.a46655aa.chunk.js.map": "/static/js/348.a46655aa.chunk.js.map",
- "static/js/349.6bf347d4.chunk.js": "/static/js/349.6bf347d4.chunk.js",
- "static/js/349.6bf347d4.chunk.js.map": "/static/js/349.6bf347d4.chunk.js.map",
- "static/js/350.89a21528.chunk.js": "/static/js/350.89a21528.chunk.js",
- "static/js/350.89a21528.chunk.js.map": "/static/js/350.89a21528.chunk.js.map",
- "static/js/351.6101c094.chunk.js": "/static/js/351.6101c094.chunk.js",
- "static/js/351.6101c094.chunk.js.map": "/static/js/351.6101c094.chunk.js.map",
- "static/js/352.9711b413.chunk.js": "/static/js/352.9711b413.chunk.js",
- "static/js/352.9711b413.chunk.js.map": "/static/js/352.9711b413.chunk.js.map",
- "static/js/353.32b3814c.chunk.js": "/static/js/353.32b3814c.chunk.js",
- "static/js/353.32b3814c.chunk.js.map": "/static/js/353.32b3814c.chunk.js.map",
- "static/js/354.0656f899.chunk.js": "/static/js/354.0656f899.chunk.js",
- "static/js/354.0656f899.chunk.js.map": "/static/js/354.0656f899.chunk.js.map",
- "static/js/355.0d032f15.chunk.js": "/static/js/355.0d032f15.chunk.js",
- "static/js/355.0d032f15.chunk.js.map": "/static/js/355.0d032f15.chunk.js.map",
- "static/js/356.7f508641.chunk.js": "/static/js/356.7f508641.chunk.js",
- "static/js/356.7f508641.chunk.js.map": "/static/js/356.7f508641.chunk.js.map",
- "static/js/357.f8a2ba47.chunk.js": "/static/js/357.f8a2ba47.chunk.js",
- "static/js/357.f8a2ba47.chunk.js.map": "/static/js/357.f8a2ba47.chunk.js.map",
- "static/js/358.3303dc8c.chunk.js": "/static/js/358.3303dc8c.chunk.js",
- "static/js/358.3303dc8c.chunk.js.map": "/static/js/358.3303dc8c.chunk.js.map",
- "static/js/359.900aa579.chunk.js": "/static/js/359.900aa579.chunk.js",
- "static/js/359.900aa579.chunk.js.map": "/static/js/359.900aa579.chunk.js.map",
- "static/js/360.3101dc9b.chunk.js": "/static/js/360.3101dc9b.chunk.js",
- "static/js/360.3101dc9b.chunk.js.map": "/static/js/360.3101dc9b.chunk.js.map",
- "static/js/361.d1bef176.chunk.js": "/static/js/361.d1bef176.chunk.js",
- "static/js/361.d1bef176.chunk.js.map": "/static/js/361.d1bef176.chunk.js.map",
- "static/js/362.be6b64ef.chunk.js": "/static/js/362.be6b64ef.chunk.js",
- "static/js/362.be6b64ef.chunk.js.map": "/static/js/362.be6b64ef.chunk.js.map",
- "static/js/363.7da59d13.chunk.js": "/static/js/363.7da59d13.chunk.js",
- "static/js/363.7da59d13.chunk.js.map": "/static/js/363.7da59d13.chunk.js.map",
- "static/js/364.31ac1b57.chunk.js": "/static/js/364.31ac1b57.chunk.js",
- "static/js/364.31ac1b57.chunk.js.map": "/static/js/364.31ac1b57.chunk.js.map",
- "static/js/365.444293f4.chunk.js": "/static/js/365.444293f4.chunk.js",
- "static/js/365.444293f4.chunk.js.map": "/static/js/365.444293f4.chunk.js.map",
- "static/js/366.d45be436.chunk.js": "/static/js/366.d45be436.chunk.js",
- "static/js/366.d45be436.chunk.js.map": "/static/js/366.d45be436.chunk.js.map",
- "static/js/367.97e23379.chunk.js": "/static/js/367.97e23379.chunk.js",
- "static/js/367.97e23379.chunk.js.map": "/static/js/367.97e23379.chunk.js.map",
- "static/js/368.e3761404.chunk.js": "/static/js/368.e3761404.chunk.js",
- "static/js/368.e3761404.chunk.js.map": "/static/js/368.e3761404.chunk.js.map",
- "static/js/369.3134b681.chunk.js": "/static/js/369.3134b681.chunk.js",
- "static/js/369.3134b681.chunk.js.map": "/static/js/369.3134b681.chunk.js.map",
- "static/js/370.d39337ef.chunk.js": "/static/js/370.d39337ef.chunk.js",
- "static/js/370.d39337ef.chunk.js.map": "/static/js/370.d39337ef.chunk.js.map",
- "static/js/371.29f67cbb.chunk.js": "/static/js/371.29f67cbb.chunk.js",
- "static/js/371.29f67cbb.chunk.js.map": "/static/js/371.29f67cbb.chunk.js.map",
- "static/js/372.a35a72d8.chunk.js": "/static/js/372.a35a72d8.chunk.js",
- "static/js/372.a35a72d8.chunk.js.map": "/static/js/372.a35a72d8.chunk.js.map",
- "static/js/373.9bacabca.chunk.js": "/static/js/373.9bacabca.chunk.js",
- "static/js/373.9bacabca.chunk.js.map": "/static/js/373.9bacabca.chunk.js.map",
- "static/js/374.02cac5a7.chunk.js": "/static/js/374.02cac5a7.chunk.js",
- "static/js/374.02cac5a7.chunk.js.map": "/static/js/374.02cac5a7.chunk.js.map",
- "static/js/375.91bcc5f8.chunk.js": "/static/js/375.91bcc5f8.chunk.js",
- "static/js/375.91bcc5f8.chunk.js.map": "/static/js/375.91bcc5f8.chunk.js.map",
- "static/js/376.777b9963.chunk.js": "/static/js/376.777b9963.chunk.js",
- "static/js/376.777b9963.chunk.js.map": "/static/js/376.777b9963.chunk.js.map",
- "static/js/377.e6672062.chunk.js": "/static/js/377.e6672062.chunk.js",
- "static/js/377.e6672062.chunk.js.map": "/static/js/377.e6672062.chunk.js.map",
- "static/js/378.bc69daf5.chunk.js": "/static/js/378.bc69daf5.chunk.js",
- "static/js/378.bc69daf5.chunk.js.map": "/static/js/378.bc69daf5.chunk.js.map",
- "static/js/379.6aa0cd9d.chunk.js": "/static/js/379.6aa0cd9d.chunk.js",
- "static/js/379.6aa0cd9d.chunk.js.map": "/static/js/379.6aa0cd9d.chunk.js.map",
- "static/js/380.3052cd12.chunk.js": "/static/js/380.3052cd12.chunk.js",
- "static/js/380.3052cd12.chunk.js.map": "/static/js/380.3052cd12.chunk.js.map",
- "static/js/381.21642ba9.chunk.js": "/static/js/381.21642ba9.chunk.js",
- "static/js/381.21642ba9.chunk.js.map": "/static/js/381.21642ba9.chunk.js.map",
- "static/js/382.8f3eb0f9.chunk.js": "/static/js/382.8f3eb0f9.chunk.js",
- "static/js/382.8f3eb0f9.chunk.js.map": "/static/js/382.8f3eb0f9.chunk.js.map",
- "static/js/383.275338d9.chunk.js": "/static/js/383.275338d9.chunk.js",
- "static/js/383.275338d9.chunk.js.map": "/static/js/383.275338d9.chunk.js.map",
- "static/js/384.074f1d82.chunk.js": "/static/js/384.074f1d82.chunk.js",
- "static/js/384.074f1d82.chunk.js.map": "/static/js/384.074f1d82.chunk.js.map",
- "static/js/385.d404ad00.chunk.js": "/static/js/385.d404ad00.chunk.js",
- "static/js/385.d404ad00.chunk.js.map": "/static/js/385.d404ad00.chunk.js.map",
- "static/js/386.59ad97c6.chunk.js": "/static/js/386.59ad97c6.chunk.js",
- "static/js/386.59ad97c6.chunk.js.map": "/static/js/386.59ad97c6.chunk.js.map",
- "static/js/387.e3a02783.chunk.js": "/static/js/387.e3a02783.chunk.js",
- "static/js/387.e3a02783.chunk.js.map": "/static/js/387.e3a02783.chunk.js.map",
- "static/js/388.482f31b4.chunk.js": "/static/js/388.482f31b4.chunk.js",
- "static/js/388.482f31b4.chunk.js.map": "/static/js/388.482f31b4.chunk.js.map",
- "static/js/389.0b936e18.chunk.js": "/static/js/389.0b936e18.chunk.js",
- "static/js/389.0b936e18.chunk.js.map": "/static/js/389.0b936e18.chunk.js.map",
- "static/js/390.c296a254.chunk.js": "/static/js/390.c296a254.chunk.js",
- "static/js/390.c296a254.chunk.js.map": "/static/js/390.c296a254.chunk.js.map",
- "static/js/391.a3bd0df5.chunk.js": "/static/js/391.a3bd0df5.chunk.js",
- "static/js/391.a3bd0df5.chunk.js.map": "/static/js/391.a3bd0df5.chunk.js.map",
- "static/js/392.bcc1b8ad.chunk.js": "/static/js/392.bcc1b8ad.chunk.js",
- "static/js/392.bcc1b8ad.chunk.js.map": "/static/js/392.bcc1b8ad.chunk.js.map",
- "static/js/393.cec73723.chunk.js": "/static/js/393.cec73723.chunk.js",
- "static/js/393.cec73723.chunk.js.map": "/static/js/393.cec73723.chunk.js.map",
- "static/js/394.0561fb9b.chunk.js": "/static/js/394.0561fb9b.chunk.js",
- "static/js/394.0561fb9b.chunk.js.map": "/static/js/394.0561fb9b.chunk.js.map",
- "static/js/395.aec27a7f.chunk.js": "/static/js/395.aec27a7f.chunk.js",
- "static/js/395.aec27a7f.chunk.js.map": "/static/js/395.aec27a7f.chunk.js.map",
- "static/js/396.0074876c.chunk.js": "/static/js/396.0074876c.chunk.js",
- "static/js/396.0074876c.chunk.js.map": "/static/js/396.0074876c.chunk.js.map",
- "static/js/397.a1f33076.chunk.js": "/static/js/397.a1f33076.chunk.js",
- "static/js/397.a1f33076.chunk.js.map": "/static/js/397.a1f33076.chunk.js.map",
- "static/js/398.018f63eb.chunk.js": "/static/js/398.018f63eb.chunk.js",
- "static/js/398.018f63eb.chunk.js.map": "/static/js/398.018f63eb.chunk.js.map",
- "static/js/399.8933c611.chunk.js": "/static/js/399.8933c611.chunk.js",
- "static/js/399.8933c611.chunk.js.map": "/static/js/399.8933c611.chunk.js.map",
- "static/js/400.b20caf20.chunk.js": "/static/js/400.b20caf20.chunk.js",
- "static/js/400.b20caf20.chunk.js.map": "/static/js/400.b20caf20.chunk.js.map",
- "static/js/401.c30204fd.chunk.js": "/static/js/401.c30204fd.chunk.js",
- "static/js/401.c30204fd.chunk.js.map": "/static/js/401.c30204fd.chunk.js.map",
- "static/js/402.7545fed5.chunk.js": "/static/js/402.7545fed5.chunk.js",
- "static/js/402.7545fed5.chunk.js.map": "/static/js/402.7545fed5.chunk.js.map",
- "static/js/403.4504467e.chunk.js": "/static/js/403.4504467e.chunk.js",
- "static/js/403.4504467e.chunk.js.map": "/static/js/403.4504467e.chunk.js.map",
- "static/js/404.0c48c024.chunk.js": "/static/js/404.0c48c024.chunk.js",
- "static/js/404.0c48c024.chunk.js.map": "/static/js/404.0c48c024.chunk.js.map",
- "static/js/405.1efb7d24.chunk.js": "/static/js/405.1efb7d24.chunk.js",
- "static/js/405.1efb7d24.chunk.js.map": "/static/js/405.1efb7d24.chunk.js.map",
- "static/js/406.d05d5cae.chunk.js": "/static/js/406.d05d5cae.chunk.js",
- "static/js/406.d05d5cae.chunk.js.map": "/static/js/406.d05d5cae.chunk.js.map",
- "static/js/407.cc2cdd69.chunk.js": "/static/js/407.cc2cdd69.chunk.js",
- "static/js/407.cc2cdd69.chunk.js.map": "/static/js/407.cc2cdd69.chunk.js.map",
- "static/js/408.206c04bf.chunk.js": "/static/js/408.206c04bf.chunk.js",
- "static/js/408.206c04bf.chunk.js.map": "/static/js/408.206c04bf.chunk.js.map",
- "static/js/409.28a04b5a.chunk.js": "/static/js/409.28a04b5a.chunk.js",
- "static/js/409.28a04b5a.chunk.js.map": "/static/js/409.28a04b5a.chunk.js.map",
- "static/js/410.04cd439b.chunk.js": "/static/js/410.04cd439b.chunk.js",
- "static/js/410.04cd439b.chunk.js.map": "/static/js/410.04cd439b.chunk.js.map",
- "static/js/411.909970a8.chunk.js": "/static/js/411.909970a8.chunk.js",
- "static/js/411.909970a8.chunk.js.map": "/static/js/411.909970a8.chunk.js.map",
- "static/js/412.50da5911.chunk.js": "/static/js/412.50da5911.chunk.js",
- "static/js/412.50da5911.chunk.js.map": "/static/js/412.50da5911.chunk.js.map",
- "static/js/413.cb5d77c0.chunk.js": "/static/js/413.cb5d77c0.chunk.js",
- "static/js/413.cb5d77c0.chunk.js.map": "/static/js/413.cb5d77c0.chunk.js.map",
- "static/js/414.bac81069.chunk.js": "/static/js/414.bac81069.chunk.js",
- "static/js/414.bac81069.chunk.js.map": "/static/js/414.bac81069.chunk.js.map",
- "static/js/415.fb02741d.chunk.js": "/static/js/415.fb02741d.chunk.js",
- "static/js/415.fb02741d.chunk.js.map": "/static/js/415.fb02741d.chunk.js.map",
- "static/js/416.e077865f.chunk.js": "/static/js/416.e077865f.chunk.js",
- "static/js/416.e077865f.chunk.js.map": "/static/js/416.e077865f.chunk.js.map",
- "static/js/417.85f7185c.chunk.js": "/static/js/417.85f7185c.chunk.js",
- "static/js/417.85f7185c.chunk.js.map": "/static/js/417.85f7185c.chunk.js.map",
- "static/js/418.109175bf.chunk.js": "/static/js/418.109175bf.chunk.js",
- "static/js/418.109175bf.chunk.js.map": "/static/js/418.109175bf.chunk.js.map",
- "static/js/419.aaeb5a77.chunk.js": "/static/js/419.aaeb5a77.chunk.js",
- "static/js/419.aaeb5a77.chunk.js.map": "/static/js/419.aaeb5a77.chunk.js.map",
- "static/js/420.c9570acd.chunk.js": "/static/js/420.c9570acd.chunk.js",
- "static/js/420.c9570acd.chunk.js.map": "/static/js/420.c9570acd.chunk.js.map",
- "static/js/421.7162f18a.chunk.js": "/static/js/421.7162f18a.chunk.js",
- "static/js/421.7162f18a.chunk.js.map": "/static/js/421.7162f18a.chunk.js.map",
- "static/js/422.b0bbf3d6.chunk.js": "/static/js/422.b0bbf3d6.chunk.js",
- "static/js/422.b0bbf3d6.chunk.js.map": "/static/js/422.b0bbf3d6.chunk.js.map",
- "static/js/423.93889283.chunk.js": "/static/js/423.93889283.chunk.js",
- "static/js/423.93889283.chunk.js.map": "/static/js/423.93889283.chunk.js.map",
- "static/js/424.d12af8c7.chunk.js": "/static/js/424.d12af8c7.chunk.js",
- "static/js/424.d12af8c7.chunk.js.map": "/static/js/424.d12af8c7.chunk.js.map",
- "static/js/425.5c5c52d7.chunk.js": "/static/js/425.5c5c52d7.chunk.js",
- "static/js/425.5c5c52d7.chunk.js.map": "/static/js/425.5c5c52d7.chunk.js.map",
- "static/js/426.3bba2934.chunk.js": "/static/js/426.3bba2934.chunk.js",
- "static/js/426.3bba2934.chunk.js.map": "/static/js/426.3bba2934.chunk.js.map",
- "static/js/427.203a67da.chunk.js": "/static/js/427.203a67da.chunk.js",
- "static/js/427.203a67da.chunk.js.map": "/static/js/427.203a67da.chunk.js.map",
- "static/js/428.704e2b82.chunk.js": "/static/js/428.704e2b82.chunk.js",
- "static/js/428.704e2b82.chunk.js.map": "/static/js/428.704e2b82.chunk.js.map",
- "static/js/429.f86aec50.chunk.js": "/static/js/429.f86aec50.chunk.js",
- "static/js/429.f86aec50.chunk.js.map": "/static/js/429.f86aec50.chunk.js.map",
- "static/js/430.57498b52.chunk.js": "/static/js/430.57498b52.chunk.js",
- "static/js/430.57498b52.chunk.js.map": "/static/js/430.57498b52.chunk.js.map",
- "static/js/431.385f4970.chunk.js": "/static/js/431.385f4970.chunk.js",
- "static/js/431.385f4970.chunk.js.map": "/static/js/431.385f4970.chunk.js.map",
- "static/js/432.0bc84193.chunk.js": "/static/js/432.0bc84193.chunk.js",
- "static/js/432.0bc84193.chunk.js.map": "/static/js/432.0bc84193.chunk.js.map",
- "static/js/433.74279805.chunk.js": "/static/js/433.74279805.chunk.js",
- "static/js/433.74279805.chunk.js.map": "/static/js/433.74279805.chunk.js.map",
- "static/js/434.bcdad1d7.chunk.js": "/static/js/434.bcdad1d7.chunk.js",
- "static/js/434.bcdad1d7.chunk.js.map": "/static/js/434.bcdad1d7.chunk.js.map",
- "static/js/435.892d697e.chunk.js": "/static/js/435.892d697e.chunk.js",
- "static/js/435.892d697e.chunk.js.map": "/static/js/435.892d697e.chunk.js.map",
- "static/js/436.1bf23e1f.chunk.js": "/static/js/436.1bf23e1f.chunk.js",
- "static/js/436.1bf23e1f.chunk.js.map": "/static/js/436.1bf23e1f.chunk.js.map",
- "static/js/437.2f6d7b2b.chunk.js": "/static/js/437.2f6d7b2b.chunk.js",
- "static/js/437.2f6d7b2b.chunk.js.map": "/static/js/437.2f6d7b2b.chunk.js.map",
- "static/js/438.f6168671.chunk.js": "/static/js/438.f6168671.chunk.js",
- "static/js/438.f6168671.chunk.js.map": "/static/js/438.f6168671.chunk.js.map",
- "static/js/439.e72c0bed.chunk.js": "/static/js/439.e72c0bed.chunk.js",
- "static/js/439.e72c0bed.chunk.js.map": "/static/js/439.e72c0bed.chunk.js.map",
- "static/js/440.95e46915.chunk.js": "/static/js/440.95e46915.chunk.js",
- "static/js/440.95e46915.chunk.js.map": "/static/js/440.95e46915.chunk.js.map",
- "static/js/441.78bd3f71.chunk.js": "/static/js/441.78bd3f71.chunk.js",
- "static/js/441.78bd3f71.chunk.js.map": "/static/js/441.78bd3f71.chunk.js.map",
- "static/js/442.5c6eff26.chunk.js": "/static/js/442.5c6eff26.chunk.js",
- "static/js/442.5c6eff26.chunk.js.map": "/static/js/442.5c6eff26.chunk.js.map",
- "static/js/443.2d7bbcfc.chunk.js": "/static/js/443.2d7bbcfc.chunk.js",
- "static/js/443.2d7bbcfc.chunk.js.map": "/static/js/443.2d7bbcfc.chunk.js.map",
- "static/js/444.f399e7c7.chunk.js": "/static/js/444.f399e7c7.chunk.js",
- "static/js/444.f399e7c7.chunk.js.map": "/static/js/444.f399e7c7.chunk.js.map",
- "static/js/445.004c443c.chunk.js": "/static/js/445.004c443c.chunk.js",
- "static/js/445.004c443c.chunk.js.map": "/static/js/445.004c443c.chunk.js.map",
- "static/js/446.a4421102.chunk.js": "/static/js/446.a4421102.chunk.js",
- "static/js/446.a4421102.chunk.js.map": "/static/js/446.a4421102.chunk.js.map",
- "static/js/447.670ba457.chunk.js": "/static/js/447.670ba457.chunk.js",
- "static/js/447.670ba457.chunk.js.map": "/static/js/447.670ba457.chunk.js.map",
- "static/js/448.b52588b9.chunk.js": "/static/js/448.b52588b9.chunk.js",
- "static/js/448.b52588b9.chunk.js.map": "/static/js/448.b52588b9.chunk.js.map",
- "static/js/449.837cbdda.chunk.js": "/static/js/449.837cbdda.chunk.js",
- "static/js/449.837cbdda.chunk.js.map": "/static/js/449.837cbdda.chunk.js.map",
- "static/js/450.079517c6.chunk.js": "/static/js/450.079517c6.chunk.js",
- "static/js/450.079517c6.chunk.js.map": "/static/js/450.079517c6.chunk.js.map",
- "static/js/451.35c597b8.chunk.js": "/static/js/451.35c597b8.chunk.js",
- "static/js/451.35c597b8.chunk.js.map": "/static/js/451.35c597b8.chunk.js.map",
- "static/js/452.321ca88f.chunk.js": "/static/js/452.321ca88f.chunk.js",
- "static/js/452.321ca88f.chunk.js.map": "/static/js/452.321ca88f.chunk.js.map",
- "static/js/453.50616f07.chunk.js": "/static/js/453.50616f07.chunk.js",
- "static/js/453.50616f07.chunk.js.map": "/static/js/453.50616f07.chunk.js.map",
- "static/js/454.1f7379f2.chunk.js": "/static/js/454.1f7379f2.chunk.js",
- "static/js/454.1f7379f2.chunk.js.map": "/static/js/454.1f7379f2.chunk.js.map",
- "static/js/455.c97dd6f1.chunk.js": "/static/js/455.c97dd6f1.chunk.js",
- "static/js/455.c97dd6f1.chunk.js.map": "/static/js/455.c97dd6f1.chunk.js.map",
- "static/js/456.e9bb06c5.chunk.js": "/static/js/456.e9bb06c5.chunk.js",
- "static/js/456.e9bb06c5.chunk.js.map": "/static/js/456.e9bb06c5.chunk.js.map",
- "index.html": "/index.html",
- "precache-manifest.8d4bd9ab08f63635da71132e5284f29d.js": "/precache-manifest.8d4bd9ab08f63635da71132e5284f29d.js",
- "service-worker.js": "/service-worker.js",
- "static/css/main.06e63d6d.chunk.css.map": "/static/css/main.06e63d6d.chunk.css.map",
- "static/js/2.3b9ab7d4.chunk.js.LICENSE.txt": "/static/js/2.3b9ab7d4.chunk.js.LICENSE.txt",
- "static/js/71.d073535f.chunk.js.LICENSE.txt": "/static/js/71.d073535f.chunk.js.LICENSE.txt",
- "static/media/SplashScreen.css": "/static/media/gitconvex.e136c267.png"
- },
- "entrypoints": [
- "static/js/runtime-main.75b5ed94.js",
- "static/js/2.3b9ab7d4.chunk.js",
- "static/css/main.06e63d6d.chunk.css",
- "static/js/main.599d444d.chunk.js"
- ]
-}
\ No newline at end of file
diff --git a/build/index.html b/build/index.html
deleted file mode 100644
index 9d911a63..00000000
--- a/build/index.html
+++ /dev/null
@@ -1 +0,0 @@
-)\s*)[\s\S]+?(?=\s*<\/\2>)/,lookbehind:!0,inside:{line:{pattern:e,lookbehind:!0,inside:{tag:a.languages.markup.tag,entity:a.languages.markup.entity,code:{pattern:/.+/,inside:a.languages.java,alias:"language-java"}}}}}],tag:a.languages.markup.tag,entity:a.languages.markup.entity}),a.languages.javadoclike.addSupport("java",a.languages.javadoc)}(Prism)}}]);
-//# sourceMappingURL=191.713b7bc1.chunk.js.map
\ No newline at end of file
diff --git a/build/static/js/191.713b7bc1.chunk.js.map b/build/static/js/191.713b7bc1.chunk.js.map
deleted file mode 100644
index bb14c273..00000000
--- a/build/static/js/191.713b7bc1.chunk.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../node_modules/prismjs/components/prism-javadoc.js"],"names":["Prism","codeLinePattern","memberReference","source","reference","replace","languages","javadoc","extend","insertBefore","pattern","RegExp","lookbehind","inside","java","keyword","alias","markup","tag","entity","javadoclike","addSupport"],"mappings":"4FAAC,SAAUA,GAEV,IAAIC,EAAkB,mCAElBC,EAAkB,4BAA4BC,OAC9CC,EAAY,sDAAsDD,OAAOE,QAAQ,UAAU,WAAc,OAAOH,KAEpHF,EAAMM,UAAUC,QAAUP,EAAMM,UAAUE,OAAO,cAAe,IAChER,EAAMM,UAAUG,aAAa,UAAW,UAAW,CAClD,UAAa,CACZC,QAASC,OAAO,gEAAgER,OAAS,MAAQC,EAAY,KAC7GQ,YAAY,EACZC,OAAQ,CACP,SAAY,CACXH,QAAS,qBACTE,YAAY,GAEb,MAAS,CACRF,QAAS,YACTE,YAAY,GAEb,UAAa,CACZF,QAAS,0BACTG,OAAQ,CACP,YAAe,OAGjB,aAAc,aACd,QAAWb,EAAMM,UAAUQ,KAAKC,QAChC,YAAe,eAGjB,aAAc,CAEbL,QAAS,wBACTE,YAAY,EACZC,OAAQ,CACP,YAAe,UAGjB,eAAgB,CACf,CACCH,QAAS,2FACTE,YAAY,EACZC,OAAQ,CACP,KAAQ,CAEPH,QAAST,EACTW,YAAY,EACZC,OAAQb,EAAMM,UAAUQ,KACxBE,MAAO,mBAIV,CACCN,QAAS,sDACTE,YAAY,EACZC,OAAQ,CACP,KAAQ,CACPH,QAAST,EACTW,YAAY,EACZC,OAAQ,CAEP,IAAOb,EAAMM,UAAUW,OAAOC,IAC9B,OAAUlB,EAAMM,UAAUW,OAAOE,OACjC,KAAQ,CAEPT,QAAS,KACTG,OAAQb,EAAMM,UAAUQ,KACxBE,MAAO,sBAOb,IAAOhB,EAAMM,UAAUW,OAAOC,IAC9B,OAAUlB,EAAMM,UAAUW,OAAOE,SAGlCnB,EAAMM,UAAUc,YAAYC,WAAW,OAAQrB,EAAMM,UAAUC,SAhF/D,CAiFCP","file":"static/js/191.713b7bc1.chunk.js","sourcesContent":["(function (Prism) {\n\n\tvar codeLinePattern = /(^(?:\\s*(?:\\*\\s*)*)).*[^*\\s].*$/m;\n\n\tvar memberReference = /#\\s*\\w+(?:\\s*\\([^()]*\\))?/.source;\n\tvar reference = /(?:[a-zA-Z]\\w+\\s*\\.\\s*)*[A-Z]\\w*(?:\\s*
)\\s*)[\\s\\S]+?(?=\\s*<\\/\\2>)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'line': {\n\t\t\t\t\t\tpattern: codeLinePattern,\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\tinside: {\n\t\t\t\t\t\t\t// highlight HTML tags and entities\n\t\t\t\t\t\t\t'tag': Prism.languages.markup.tag,\n\t\t\t\t\t\t\t'entity': Prism.languages.markup.entity,\n\t\t\t\t\t\t\t'code': {\n\t\t\t\t\t\t\t\t// everything else is Java code\n\t\t\t\t\t\t\t\tpattern: /.+/,\n\t\t\t\t\t\t\t\tinside: Prism.languages.java,\n\t\t\t\t\t\t\t\talias: 'language-java'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t],\n\t\t'tag': Prism.languages.markup.tag,\n\t\t'entity': Prism.languages.markup.entity,\n\t});\n\n\tPrism.languages.javadoclike.addSupport('java', Prism.languages.javadoc);\n}(Prism));\n"],"sourceRoot":""}
\ No newline at end of file
diff --git a/build/static/js/192.c3e58b76.chunk.js b/build/static/js/192.c3e58b76.chunk.js
deleted file mode 100644
index 95484542..00000000
--- a/build/static/js/192.c3e58b76.chunk.js
+++ /dev/null
@@ -1,2 +0,0 @@
-(this.webpackJsonpgitconvex=this.webpackJsonpgitconvex||[]).push([[192],{283:function(a,e){!function(a){var e=/(^(?:\s*(?:\*\s*)*)).*[^*\s].*$/m,n="(?:[a-zA-Z]\\w+\\s*\\.\\s*)*[A-Z]\\w*(?:\\s*
)\s*)[\s\S]+?(?=\s*<\/\2>)/,lookbehind:!0,inside:{line:{pattern:e,lookbehind:!0,inside:{tag:a.languages.markup.tag,entity:a.languages.markup.entity,code:{pattern:/.+/,inside:a.languages.java,alias:"language-java"}}}}}],tag:a.languages.markup.tag,entity:a.languages.markup.entity}),a.languages.javadoclike.addSupport("java",a.languages.javadoc)}(Prism)}}]);
-//# sourceMappingURL=192.c3e58b76.chunk.js.map
\ No newline at end of file
diff --git a/build/static/js/192.c3e58b76.chunk.js.map b/build/static/js/192.c3e58b76.chunk.js.map
deleted file mode 100644
index a366e75f..00000000
--- a/build/static/js/192.c3e58b76.chunk.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../node_modules/prismjs/components/prism-javadoc.min.js"],"names":["a","e","n","replace","languages","javadoc","extend","insertBefore","reference","pattern","RegExp","lookbehind","inside","function","field","namespace","punctuation","keyword","java","code","alias","line","tag","markup","entity","javadoclike","addSupport","Prism"],"mappings":"4FAAC,SAASA,GAAG,IAAIC,EAAE,mCAAmCC,EAAE,4DAA4DC,QAAQ,UAAS,WAAW,MAAM,oCAAmCH,EAAEI,UAAUC,QAAQL,EAAEI,UAAUE,OAAO,cAAc,IAAIN,EAAEI,UAAUG,aAAa,UAAU,UAAU,CAACC,UAAU,CAACC,QAAQC,OAAO,sEAAsER,EAAE,KAAKS,YAAW,EAAGC,OAAO,CAACC,SAAS,CAACJ,QAAQ,qBAAqBE,YAAW,GAAIG,MAAM,CAACL,QAAQ,YAAYE,YAAW,GAAII,UAAU,CAACN,QAAQ,0BAA0BG,OAAO,CAACI,YAAY,OAAO,aAAa,aAAaC,QAAQjB,EAAEI,UAAUc,KAAKD,QAAQD,YAAY,eAAe,aAAa,CAACP,QAAQ,wBAAwBE,YAAW,EAAGC,OAAO,CAACI,YAAY,UAAU,eAAe,CAAC,CAACP,QAAQ,2FAA2FE,YAAW,EAAGC,OAAO,CAACO,KAAK,CAACV,QAAQR,EAAEU,YAAW,EAAGC,OAAOZ,EAAEI,UAAUc,KAAKE,MAAM,mBAAmB,CAACX,QAAQ,sDAAsDE,YAAW,EAAGC,OAAO,CAACS,KAAK,CAACZ,QAAQR,EAAEU,YAAW,EAAGC,OAAO,CAACU,IAAItB,EAAEI,UAAUmB,OAAOD,IAAIE,OAAOxB,EAAEI,UAAUmB,OAAOC,OAAOL,KAAK,CAACV,QAAQ,KAAKG,OAAOZ,EAAEI,UAAUc,KAAKE,MAAM,sBAAsBE,IAAItB,EAAEI,UAAUmB,OAAOD,IAAIE,OAAOxB,EAAEI,UAAUmB,OAAOC,SAASxB,EAAEI,UAAUqB,YAAYC,WAAW,OAAO1B,EAAEI,UAAUC,SAA/zC,CAAy0CsB","file":"static/js/192.c3e58b76.chunk.js","sourcesContent":["!function(a){var e=/(^(?:\\s*(?:\\*\\s*)*)).*[^*\\s].*$/m,n=\"(?:[a-zA-Z]\\\\w+\\\\s*\\\\.\\\\s*)*[A-Z]\\\\w*(?:\\\\s*
)\\s*)[\\s\\S]+?(?=\\s*<\\/\\2>)/,lookbehind:!0,inside:{line:{pattern:e,lookbehind:!0,inside:{tag:a.languages.markup.tag,entity:a.languages.markup.entity,code:{pattern:/.+/,inside:a.languages.java,alias:\"language-java\"}}}}}],tag:a.languages.markup.tag,entity:a.languages.markup.entity}),a.languages.javadoclike.addSupport(\"java\",a.languages.javadoc)}(Prism);"],"sourceRoot":""}
\ No newline at end of file
diff --git a/build/static/js/193.05410355.chunk.js b/build/static/js/193.05410355.chunk.js
deleted file mode 100644
index cde40f58..00000000
--- a/build/static/js/193.05410355.chunk.js
+++ /dev/null
@@ -1,2 +0,0 @@
-(this.webpackJsonpgitconvex=this.webpackJsonpgitconvex||[]).push([[193],{284:function(n,e){!function(n){var e=n.languages.javadoclike={parameter:{pattern:/(^\s*(?:\/{3}|\*|\/\*\*)\s*@(?:param|arg|arguments)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^\s*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};Object.defineProperty(e,"addSupport",{value:function(e,a){"string"===typeof e&&(e=[e]),e.forEach((function(e){!function(e,a){var t=n.languages[e];if(t){var o=t["doc-comment"];if(!o){var i={"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"}};o=(t=n.languages.insertBefore(e,"comment",i))["doc-comment"]}if(o instanceof RegExp&&(o=t["doc-comment"]={pattern:o}),Array.isArray(o))for(var r=0,s=o.length;r
void} callback the function called with each doc comment pattern as argument.\n\t */\n\tfunction docCommentSupport(lang, callback) {\n\t\tvar tokenName = 'doc-comment';\n\n\t\tvar grammar = Prism.languages[lang];\n\t\tif (!grammar) {\n\t\t\treturn;\n\t\t}\n\t\tvar token = grammar[tokenName];\n\n\t\tif (!token) {\n\t\t\t// add doc comment: /** */\n\t\t\tvar definition = {};\n\t\t\tdefinition[tokenName] = {\n\t\t\t\tpattern: /(^|[^\\\\])\\/\\*\\*[^/][\\s\\S]*?(?:\\*\\/|$)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'comment'\n\t\t\t};\n\n\t\t\tgrammar = Prism.languages.insertBefore(lang, 'comment', definition);\n\t\t\ttoken = grammar[tokenName];\n\t\t}\n\n\t\tif (token instanceof RegExp) { // convert regex to object\n\t\t\ttoken = grammar[tokenName] = { pattern: token };\n\t\t}\n\n\t\tif (Array.isArray(token)) {\n\t\t\tfor (var i = 0, l = token.length; i < l; i++) {\n\t\t\t\tif (token[i] instanceof RegExp) {\n\t\t\t\t\ttoken[i] = { pattern: token[i] };\n\t\t\t\t}\n\t\t\t\tcallback(token[i]);\n\t\t\t}\n\t\t} else {\n\t\t\tcallback(token);\n\t\t}\n\t}\n\n\t/**\n\t * Adds doc-comment support to the given languages for the given documentation language.\n\t *\n\t * @param {string[]|string} languages\n\t * @param {Object} docLanguage\n\t */\n\tfunction addSupport(languages, docLanguage) {\n\t\tif (typeof languages === 'string') {\n\t\t\tlanguages = [languages];\n\t\t}\n\n\t\tlanguages.forEach(function (lang) {\n\t\t\tdocCommentSupport(lang, function (pattern) {\n\t\t\t\tif (!pattern.inside) {\n\t\t\t\t\tpattern.inside = {};\n\t\t\t\t}\n\t\t\t\tpattern.inside.rest = docLanguage;\n\t\t\t});\n\t\t});\n\t}\n\n\tObject.defineProperty(javaDocLike, 'addSupport', { value: addSupport });\n\n\tjavaDocLike.addSupport(['java', 'javascript', 'php'], javaDocLike);\n\n}(Prism));\n"],"sourceRoot":""}
\ No newline at end of file
diff --git a/build/static/js/194.9370e2cb.chunk.js b/build/static/js/194.9370e2cb.chunk.js
deleted file mode 100644
index 18b64fc8..00000000
--- a/build/static/js/194.9370e2cb.chunk.js
+++ /dev/null
@@ -1,2 +0,0 @@
-(this.webpackJsonpgitconvex=this.webpackJsonpgitconvex||[]).push([[194],{285:function(n,e){!function(n){var e=n.languages.javadoclike={parameter:{pattern:/(^\s*(?:\/{3}|\*|\/\*\*)\s*@(?:param|arg|arguments)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^\s*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};Object.defineProperty(e,"addSupport",{value:function(e,a){"string"==typeof e&&(e=[e]),e.forEach((function(e){!function(e,a){var t="doc-comment",o=n.languages[e];if(o){var i=o[t];if(!i){i=(o=n.languages.insertBefore(e,"comment",{"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"}}))[t]}if(i instanceof RegExp&&(i=o[t]={pattern:i}),Array.isArray(i))for(var r=0,s=i.length;r|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0},"function-variable":{pattern:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.js=Prism.languages.javascript}}]);
-//# sourceMappingURL=195.8c52a197.chunk.js.map
\ No newline at end of file
diff --git a/build/static/js/195.8c52a197.chunk.js.map b/build/static/js/195.8c52a197.chunk.js.map
deleted file mode 100644
index bdd9bfa8..00000000
--- a/build/static/js/195.8c52a197.chunk.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../node_modules/prismjs/components/prism-javascript.js"],"names":["Prism","languages","javascript","extend","clike","pattern","lookbehind","insertBefore","greedy","alias","inside","rest","markup","tag","addInlined","js"],"mappings":"2FAAAA,MAAMC,UAAUC,WAAaF,MAAMC,UAAUE,OAAO,QAAS,CAC5D,aAAc,CACbH,MAAMC,UAAUG,MAAM,cACtB,CACCC,QAAS,0FACTC,YAAY,IAGd,QAAW,CACV,CACCD,QAAS,kCACTC,YAAY,GAEb,CACCD,QAAS,oZACTC,YAAY,IAGd,OAAU,gOAEV,SAAY,oFACZ,SAAY,8FAGbN,MAAMC,UAAUC,WAAW,cAAc,GAAGG,QAAU,uEAEtDL,MAAMC,UAAUM,aAAa,aAAc,UAAW,CACrD,MAAS,CACRF,QAAS,uLACTC,YAAY,EACZE,QAAQ,GAGT,oBAAqB,CACpBH,QAAS,gKACTI,MAAO,YAER,UAAa,CACZ,CACCJ,QAAS,wGACTC,YAAY,EACZI,OAAQV,MAAMC,UAAUC,YAEzB,CACCG,QAAS,gDACTK,OAAQV,MAAMC,UAAUC,YAEzB,CACCG,QAAS,oDACTC,YAAY,EACZI,OAAQV,MAAMC,UAAUC,YAEzB,CACCG,QAAS,gdACTC,YAAY,EACZI,OAAQV,MAAMC,UAAUC,aAG1B,SAAY,8BAGbF,MAAMC,UAAUM,aAAa,aAAc,SAAU,CACpD,kBAAmB,CAClBF,QAAS,oEACTG,QAAQ,EACRE,OAAQ,CACP,uBAAwB,CACvBL,QAAS,QACTI,MAAO,UAER,cAAiB,CAChBJ,QAAS,6DACTC,YAAY,EACZI,OAAQ,CACP,4BAA6B,CAC5BL,QAAS,UACTI,MAAO,eAERE,KAAMX,MAAMC,UAAUC,aAGxB,OAAU,cAKTF,MAAMC,UAAUW,QACnBZ,MAAMC,UAAUW,OAAOC,IAAIC,WAAW,SAAU,cAGjDd,MAAMC,UAAUc,GAAKf,MAAMC,UAAUC","file":"static/js/195.8c52a197.chunk.js","sourcesContent":["Prism.languages.javascript = Prism.languages.extend('clike', {\n\t'class-name': [\n\t\tPrism.languages.clike['class-name'],\n\t\t{\n\t\t\tpattern: /(^|[^$\\w\\xA0-\\uFFFF])[_$A-Z\\xA0-\\uFFFF][$\\w\\xA0-\\uFFFF]*(?=\\.(?:prototype|constructor))/,\n\t\t\tlookbehind: true\n\t\t}\n\t],\n\t'keyword': [\n\t\t{\n\t\t\tpattern: /((?:^|})\\s*)(?:catch|finally)\\b/,\n\t\t\tlookbehind: true\n\t\t},\n\t\t{\n\t\t\tpattern: /(^|[^.]|\\.\\.\\.\\s*)\\b(?:as|async(?=\\s*(?:function\\b|\\(|[$\\w\\xA0-\\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|(?:get|set)(?=\\s*[\\[$\\w\\xA0-\\uFFFF])|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\\b/,\n\t\t\tlookbehind: true\n\t\t},\n\t],\n\t'number': /\\b(?:(?:0[xX](?:[\\dA-Fa-f](?:_[\\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\\d(?:_\\d)?)+n|NaN|Infinity)\\b|(?:\\b(?:\\d(?:_\\d)?)+\\.?(?:\\d(?:_\\d)?)*|\\B\\.(?:\\d(?:_\\d)?)+)(?:[Ee][+-]?(?:\\d(?:_\\d)?)+)?/,\n\t// Allow for all non-ASCII characters (See http://stackoverflow.com/a/2008444)\n\t'function': /#?[_$a-zA-Z\\xA0-\\uFFFF][$\\w\\xA0-\\uFFFF]*(?=\\s*(?:\\.\\s*(?:apply|bind|call)\\s*)?\\()/,\n\t'operator': /--|\\+\\+|\\*\\*=?|=>|&&=?|\\|\\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\\.{3}|\\?\\?=?|\\?\\.?|[~:]/\n});\n\nPrism.languages.javascript['class-name'][0].pattern = /(\\b(?:class|interface|extends|implements|instanceof|new)\\s+)[\\w.\\\\]+/;\n\nPrism.languages.insertBefore('javascript', 'keyword', {\n\t'regex': {\n\t\tpattern: /((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)\\/(?:\\[(?:[^\\]\\\\\\r\\n]|\\\\.)*]|\\\\.|[^/\\\\\\[\\r\\n])+\\/[gimyus]{0,6}(?=(?:\\s|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/)*(?:$|[\\r\\n,.;:})\\]]|\\/\\/))/,\n\t\tlookbehind: true,\n\t\tgreedy: true\n\t},\n\t// This must be declared before keyword because we use \"function\" inside the look-forward\n\t'function-variable': {\n\t\tpattern: /#?[_$a-zA-Z\\xA0-\\uFFFF][$\\w\\xA0-\\uFFFF]*(?=\\s*[=:]\\s*(?:async\\s*)?(?:\\bfunction\\b|(?:\\((?:[^()]|\\([^()]*\\))*\\)|[_$a-zA-Z\\xA0-\\uFFFF][$\\w\\xA0-\\uFFFF]*)\\s*=>))/,\n\t\talias: 'function'\n\t},\n\t'parameter': [\n\t\t{\n\t\t\tpattern: /(function(?:\\s+[_$A-Za-z\\xA0-\\uFFFF][$\\w\\xA0-\\uFFFF]*)?\\s*\\(\\s*)(?!\\s)(?:[^()]|\\([^()]*\\))+?(?=\\s*\\))/,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages.javascript\n\t\t},\n\t\t{\n\t\t\tpattern: /[_$a-z\\xA0-\\uFFFF][$\\w\\xA0-\\uFFFF]*(?=\\s*=>)/i,\n\t\t\tinside: Prism.languages.javascript\n\t\t},\n\t\t{\n\t\t\tpattern: /(\\(\\s*)(?!\\s)(?:[^()]|\\([^()]*\\))+?(?=\\s*\\)\\s*=>)/,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages.javascript\n\t\t},\n\t\t{\n\t\t\tpattern: /((?:\\b|\\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\\w\\xA0-\\uFFFF]))(?:[_$A-Za-z\\xA0-\\uFFFF][$\\w\\xA0-\\uFFFF]*\\s*)\\(\\s*|\\]\\s*\\(\\s*)(?!\\s)(?:[^()]|\\([^()]*\\))+?(?=\\s*\\)\\s*\\{)/,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages.javascript\n\t\t}\n\t],\n\t'constant': /\\b[A-Z](?:[A-Z_]|\\dx?)*\\b/\n});\n\nPrism.languages.insertBefore('javascript', 'string', {\n\t'template-string': {\n\t\tpattern: /`(?:\\\\[\\s\\S]|\\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\\${)[^\\\\`])*`/,\n\t\tgreedy: true,\n\t\tinside: {\n\t\t\t'template-punctuation': {\n\t\t\t\tpattern: /^`|`$/,\n\t\t\t\talias: 'string'\n\t\t\t},\n\t\t\t'interpolation': {\n\t\t\t\tpattern: /((?:^|[^\\\\])(?:\\\\{2})*)\\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'interpolation-punctuation': {\n\t\t\t\t\t\tpattern: /^\\${|}$/,\n\t\t\t\t\t\talias: 'punctuation'\n\t\t\t\t\t},\n\t\t\t\t\trest: Prism.languages.javascript\n\t\t\t\t}\n\t\t\t},\n\t\t\t'string': /[\\s\\S]+/\n\t\t}\n\t}\n});\n\nif (Prism.languages.markup) {\n\tPrism.languages.markup.tag.addInlined('script', 'javascript');\n}\n\nPrism.languages.js = Prism.languages.javascript;\n"],"sourceRoot":""}
\ No newline at end of file
diff --git a/build/static/js/196.e3adbe61.chunk.js b/build/static/js/196.e3adbe61.chunk.js
deleted file mode 100644
index 15f50850..00000000
--- a/build/static/js/196.e3adbe61.chunk.js
+++ /dev/null
@@ -1,2 +0,0 @@
-(this.webpackJsonpgitconvex=this.webpackJsonpgitconvex||[]).push([[196],{287:function(e,a){Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|})\s*)(?:catch|finally)\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|(?:get|set)(?=\s*[\[$\w\xA0-\uFFFF])|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,function:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0},"function-variable":{pattern:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.js=Prism.languages.javascript}}]);
-//# sourceMappingURL=196.e3adbe61.chunk.js.map
\ No newline at end of file
diff --git a/build/static/js/196.e3adbe61.chunk.js.map b/build/static/js/196.e3adbe61.chunk.js.map
deleted file mode 100644
index ea25e78a..00000000
--- a/build/static/js/196.e3adbe61.chunk.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../node_modules/prismjs/components/prism-javascript.min.js"],"names":["Prism","languages","javascript","extend","clike","pattern","lookbehind","keyword","number","function","operator","insertBefore","regex","greedy","alias","parameter","inside","constant","interpolation","rest","string","markup","tag","addInlined","js"],"mappings":"2FAAAA,MAAMC,UAAUC,WAAWF,MAAMC,UAAUE,OAAO,QAAQ,CAAC,aAAa,CAACH,MAAMC,UAAUG,MAAM,cAAc,CAACC,QAAQ,0FAA0FC,YAAW,IAAKC,QAAQ,CAAC,CAACF,QAAQ,kCAAkCC,YAAW,GAAI,CAACD,QAAQ,oZAAoZC,YAAW,IAAKE,OAAO,gOAAgOC,SAAS,oFAAoFC,SAAS,8FAA8FV,MAAMC,UAAUC,WAAW,cAAc,GAAGG,QAAQ,uEAAuEL,MAAMC,UAAUU,aAAa,aAAa,UAAU,CAACC,MAAM,CAACP,QAAQ,uLAAuLC,YAAW,EAAGO,QAAO,GAAI,oBAAoB,CAACR,QAAQ,gKAAgKS,MAAM,YAAYC,UAAU,CAAC,CAACV,QAAQ,wGAAwGC,YAAW,EAAGU,OAAOhB,MAAMC,UAAUC,YAAY,CAACG,QAAQ,gDAAgDW,OAAOhB,MAAMC,UAAUC,YAAY,CAACG,QAAQ,oDAAoDC,YAAW,EAAGU,OAAOhB,MAAMC,UAAUC,YAAY,CAACG,QAAQ,gdAAgdC,YAAW,EAAGU,OAAOhB,MAAMC,UAAUC,aAAae,SAAS,8BAA8BjB,MAAMC,UAAUU,aAAa,aAAa,SAAS,CAAC,kBAAkB,CAACN,QAAQ,oEAAoEQ,QAAO,EAAGG,OAAO,CAAC,uBAAuB,CAACX,QAAQ,QAAQS,MAAM,UAAUI,cAAc,CAACb,QAAQ,6DAA6DC,YAAW,EAAGU,OAAO,CAAC,4BAA4B,CAACX,QAAQ,UAAUS,MAAM,eAAeK,KAAKnB,MAAMC,UAAUC,aAAakB,OAAO,cAAcpB,MAAMC,UAAUoB,QAAQrB,MAAMC,UAAUoB,OAAOC,IAAIC,WAAW,SAAS,cAAcvB,MAAMC,UAAUuB,GAAGxB,MAAMC,UAAUC","file":"static/js/196.e3adbe61.chunk.js","sourcesContent":["Prism.languages.javascript=Prism.languages.extend(\"clike\",{\"class-name\":[Prism.languages.clike[\"class-name\"],{pattern:/(^|[^$\\w\\xA0-\\uFFFF])[_$A-Z\\xA0-\\uFFFF][$\\w\\xA0-\\uFFFF]*(?=\\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|})\\s*)(?:catch|finally)\\b/,lookbehind:!0},{pattern:/(^|[^.]|\\.\\.\\.\\s*)\\b(?:as|async(?=\\s*(?:function\\b|\\(|[$\\w\\xA0-\\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|(?:get|set)(?=\\s*[\\[$\\w\\xA0-\\uFFFF])|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\\b/,lookbehind:!0}],number:/\\b(?:(?:0[xX](?:[\\dA-Fa-f](?:_[\\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\\d(?:_\\d)?)+n|NaN|Infinity)\\b|(?:\\b(?:\\d(?:_\\d)?)+\\.?(?:\\d(?:_\\d)?)*|\\B\\.(?:\\d(?:_\\d)?)+)(?:[Ee][+-]?(?:\\d(?:_\\d)?)+)?/,function:/#?[_$a-zA-Z\\xA0-\\uFFFF][$\\w\\xA0-\\uFFFF]*(?=\\s*(?:\\.\\s*(?:apply|bind|call)\\s*)?\\()/,operator:/--|\\+\\+|\\*\\*=?|=>|&&=?|\\|\\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\\.{3}|\\?\\?=?|\\?\\.?|[~:]/}),Prism.languages.javascript[\"class-name\"][0].pattern=/(\\b(?:class|interface|extends|implements|instanceof|new)\\s+)[\\w.\\\\]+/,Prism.languages.insertBefore(\"javascript\",\"keyword\",{regex:{pattern:/((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)\\/(?:\\[(?:[^\\]\\\\\\r\\n]|\\\\.)*]|\\\\.|[^/\\\\\\[\\r\\n])+\\/[gimyus]{0,6}(?=(?:\\s|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/)*(?:$|[\\r\\n,.;:})\\]]|\\/\\/))/,lookbehind:!0,greedy:!0},\"function-variable\":{pattern:/#?[_$a-zA-Z\\xA0-\\uFFFF][$\\w\\xA0-\\uFFFF]*(?=\\s*[=:]\\s*(?:async\\s*)?(?:\\bfunction\\b|(?:\\((?:[^()]|\\([^()]*\\))*\\)|[_$a-zA-Z\\xA0-\\uFFFF][$\\w\\xA0-\\uFFFF]*)\\s*=>))/,alias:\"function\"},parameter:[{pattern:/(function(?:\\s+[_$A-Za-z\\xA0-\\uFFFF][$\\w\\xA0-\\uFFFF]*)?\\s*\\(\\s*)(?!\\s)(?:[^()]|\\([^()]*\\))+?(?=\\s*\\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/[_$a-z\\xA0-\\uFFFF][$\\w\\xA0-\\uFFFF]*(?=\\s*=>)/i,inside:Prism.languages.javascript},{pattern:/(\\(\\s*)(?!\\s)(?:[^()]|\\([^()]*\\))+?(?=\\s*\\)\\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\\b|\\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\\w\\xA0-\\uFFFF]))(?:[_$A-Za-z\\xA0-\\uFFFF][$\\w\\xA0-\\uFFFF]*\\s*)\\(\\s*|\\]\\s*\\(\\s*)(?!\\s)(?:[^()]|\\([^()]*\\))+?(?=\\s*\\)\\s*\\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\\b[A-Z](?:[A-Z_]|\\dx?)*\\b/}),Prism.languages.insertBefore(\"javascript\",\"string\",{\"template-string\":{pattern:/`(?:\\\\[\\s\\S]|\\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\\${)[^\\\\`])*`/,greedy:!0,inside:{\"template-punctuation\":{pattern:/^`|`$/,alias:\"string\"},interpolation:{pattern:/((?:^|[^\\\\])(?:\\\\{2})*)\\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/,lookbehind:!0,inside:{\"interpolation-punctuation\":{pattern:/^\\${|}$/,alias:\"punctuation\"},rest:Prism.languages.javascript}},string:/[\\s\\S]+/}}}),Prism.languages.markup&&Prism.languages.markup.tag.addInlined(\"script\",\"javascript\"),Prism.languages.js=Prism.languages.javascript;"],"sourceRoot":""}
\ No newline at end of file
diff --git a/build/static/js/197.1229d3f7.chunk.js b/build/static/js/197.1229d3f7.chunk.js
deleted file mode 100644
index 351601c5..00000000
--- a/build/static/js/197.1229d3f7.chunk.js
+++ /dev/null
@@ -1,2 +0,0 @@
-(this.webpackJsonpgitconvex=this.webpackJsonpgitconvex||[]).push([[197],{288:function(e,n){Prism.languages.javastacktrace={summary:{pattern:/^[\t ]*(?:(?:Caused by:|Suppressed:|Exception in thread "[^"]*")[\t ]+)?[\w$.]+(?:\:.*)?$/m,inside:{keyword:{pattern:/^(\s*)(?:(?:Caused by|Suppressed)(?=:)|Exception in thread)/m,lookbehind:!0},string:{pattern:/^(\s*)"[^"]*"/,lookbehind:!0},exceptions:{pattern:/^(:?\s*)[\w$.]+(?=:|$)/,lookbehind:!0,inside:{"class-name":/[\w$]+(?=$|:)/,namespace:/[a-z]\w*/,punctuation:/[.:]/}},message:{pattern:/(:\s*)\S.*/,lookbehind:!0,alias:"string"},punctuation:/[:]/}},"stack-frame":{pattern:/^[\t ]*at [\w$.]+(?: