+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/doc/en-us/common/cloneMethod.md b/doc/en-us/common/cloneMethod.md
new file mode 100644
index 0000000..ad05112
--- /dev/null
+++ b/doc/en-us/common/cloneMethod.md
@@ -0,0 +1,7 @@
+# HTTP(S) or SSH?
+
+When cloning a repository to the local, you generally encounter the problem of choosing to use HTTPS or SSH to connect to the remote repository. CodeFever also provides these two methods for users to choose.
+
+The advantage of the SSH method is that after the user has set the SSH Key in the personal settings of CodeFever, there is no need to perform any manual authentication every time the user uses SSH to connect to the remote repository. However, the use of SSH has certain requirements for the user, and the user must generate the SSH Key and complete the configuration.
+
+In contrast, the HTTPS method is more suitable for novices and users who are not familiar with the operating system, and there is no need to generate and set an SSH Key. However, when using HTTPS to connect to a remote repository, you need to enter your email address and password for identity authentication each time you connect.
diff --git a/doc/en-us/common/history.md b/doc/en-us/common/history.md
new file mode 100644
index 0000000..e025c5a
--- /dev/null
+++ b/doc/en-us/common/history.md
@@ -0,0 +1,13 @@
+# How to retroactively modify files?
+
+CodeFever provides two ways to trace file modification, namely **History** and **Blame**.
+
+**History**: Refers to a list of all the change records of a file from its creation to its current state.
+
+**Blame**: Refers to who edited each line at the end of the current state of the file.
+
+Generally speaking, **History** is used to trace the change process of a file, while **Blame** is used to view the last editor of each line of the current file.
+
+The history and Blame buttons can be found in the title bar of the file content display of the specific file.
+
+
diff --git a/doc/en-us/common/index.md b/doc/en-us/common/index.md
new file mode 100644
index 0000000..9bcd0b8
--- /dev/null
+++ b/doc/en-us/common/index.md
@@ -0,0 +1,13 @@
+[How to get and set SSH Key ?](/doc/en/common/sshKey.md)
+
+[HTTP(S) or SSH?](/doc/en/common/cloneMethod.md)
+
+[How do I choose a member role?](/doc/en/common/memberRole.md)
+
+[Can file changes submitted using multiple email addresses be retroactive?](/doc/en/common/multiEmail.md)
+
+[What is a tag? How is it different from Branch](/doc/en/common/tag.md)
+
+[How do I choose a workflow when using CodeFever?](/doc/en/common/workFlow.md)
+
+[How do I retroactively file modifications?](/doc/en/common/history.md)
diff --git a/doc/en-us/common/memberRole.md b/doc/en-us/common/memberRole.md
new file mode 100644
index 0000000..45635f7
--- /dev/null
+++ b/doc/en-us/common/memberRole.md
@@ -0,0 +1,17 @@
+# How to choose a member role?
+
+CodeFever has five built-in user roles, namely **visitor**, **supervisor**, **developer**, **maintainer** and **owner**. The permissions of these five types of roles are shown in the attached table at the end of the article.
+
+The five types of roles are specifically described as:
+
+**Guest**: The role with the lowest permissions in the repository, which has only read permissions on all items in the entire repository, and is generally used to set members outside the project to read codes.
+
+**Supervisor**: Has read access to the repository and can follow up the progress of the **merge request**, generally used in the role of QA, tester, project manager, etc. in the project team.
+
+**Developer**: Has read and write permissions for the repository code, can push the code, submit and view **merge requests**. Generally used for project developers.
+
+**Maintainer**: Has basic permissions for repository code and repository management, and can merge and close **merge requests**. It is generally used with the technical manager or technical supervisor of the project.
+
+**Owner**: Has all permissions of the repository.
+
+
diff --git a/doc/en-us/common/multiEmail.md b/doc/en-us/common/multiEmail.md
new file mode 100644
index 0000000..a6be601
--- /dev/null
+++ b/doc/en-us/common/multiEmail.md
@@ -0,0 +1,15 @@
+# Can file changes be retrospectively submitted using multiple email addresses?
+
+In general, the email addresses set by each user in all of their **Git clients** are the same. When submitting documents using the same mailbox, the submitted information will be identified as the corresponding user. However, in some cases, when the same user's submission emails in different **Git clients** are inconsistent, the submissions of the same person in the same project may be presented in the form of multiple identities. Case.
+
+When a user has multiple submission mailboxes and hopes that the submissions corresponding to these submission mailboxes are marked with their own identity. You need to set up **multiple mailboxes**.
+
+The specific operation method is as follows:
+
+1\. Open the **Settings** menu on the landing page and click **Multiple Mailbox**
+
+2\. Click the **New Email Address** button.
+
+3\. Fill in the email address that needs to be bound and click the **Confirm** icon button to complete the email address verification.
+
+
diff --git a/doc/en-us/common/sshKey.md b/doc/en-us/common/sshKey.md
new file mode 100644
index 0000000..5f22a04
--- /dev/null
+++ b/doc/en-us/common/sshKey.md
@@ -0,0 +1,25 @@
+# How to obtain and set SSH Key?
+
+SSH Key is used for identity authentication for Git client to communicate with remote repository through SSH protocol. After setting the SSH Key in CodeFever, you do not need to enter the user and password for authentication when using SSH to connect to the repository located on CodeFever.
+
+### Get SSH Key
+
+When using a Linux or MacOS system, the system will install ssh related components by default. At this time, the SSH Key exists in the .ssh directory under the home directory. When using the Windows operating system, you need to install Git Bash, and all the commands mentioned in the article need to be entered in Git Bash.
+
+Enter the following command in the terminal to view the directory.
+
+> ls -al ~/.ssh
+
+If the directory contains **id_rsa.pub** or **id_dsa.pub** files, you do not need to generate a new SSH Key, otherwise, you need to manually generate an SSH Key. Enter the following command in the terminal to generate an SSH Key.
+
+> ssh-keygen -t rsa -C "name_of_id_or_any_comment"
+
+Note: After the parameter **-C**, you can enter any name you want to identify the SSH Key
+
+At this point, a new file named id_rsa.pub should be added to the ~/.ssh directory, and the SSH Key is stored in this file. Enter the following command in the terminal to view the contents of the SSH Key.
+
+> cat ~/.ssh/id_rsa.pub
+
+### Set SSH Key
+
+After copying the SSH Key content displayed in the previous process, go to **Personal Settings** -> **SSH Keys** in CodeFever, and add SSH Key.
diff --git a/doc/en-us/common/tag.md b/doc/en-us/common/tag.md
new file mode 100644
index 0000000..9df6b53
--- /dev/null
+++ b/doc/en-us/common/tag.md
@@ -0,0 +1,9 @@
+# What is a tag? What is the difference with branch (Branch)?
+
+In Git, **tag** and **branch** are essentially references to a **commit node**. The difference is that **label** is a fixed reference, while **branch** is a dynamic reference.
+
+The way Git manages files is closer to an incremental management model. When a file is changed and submitted, a new **submit node** will be generated. When we generate a new **submit node**, the current **branch** will become a reference to the current **submit node**. Because the reference of the **branch** to the **submit node** changes with each submission, the branch cannot be used to fix the state of the files in the repository at a certain time.
+
+At this point, if you want to have a mark to fix the state of the files in the repository at a certain time, then the **label** is the most suitable. When the label is generated, the label points to a reference to a fixed **submit node**. At this time, **label** can be used to indicate the status of the files in the repository.
+
+Generally, **tags** are used to mark the version of the file.
diff --git a/doc/en-us/common/workFlow.md b/doc/en-us/common/workFlow.md
new file mode 100644
index 0000000..0a9a99c
--- /dev/null
+++ b/doc/en-us/common/workFlow.md
@@ -0,0 +1,33 @@
+# How to choose a workflow when using CodeFever?
+
+Choosing CodeFever is equivalent to choosing a distributed Git workflow. Common distributed workflows include **centralized workflow**, **integrated manager workflow** and **supervisor and deputy supervisor workflow** each Each workflow has its own characteristics, and it needs to be judged according to the characteristics of its own project.
+
+CodeFever provides **Branch**, **Merge Request** and **Fork** functions, so these three workflows can be easily supported.
+
+### Centralized workflow
+
+The single point collaboration model-centralized workflow is usually used in centralized systems. A central hub, or **repository**, can accept code, and everyone will synchronize their work with it. Several developers act as nodes, that is, consumers in the central repository synchronize with the central repository.
+
+This means that if two developers clone the code from the central repository and make some modifications at the same time, only the first developer can smoothly push the data back to the shared server. The second developer must merge the work of the first person before pushing the changes, so as not to overwrite the first person's changes. This is the same concept as in Subversion (or any CVCS), and this pattern can also be applied to Git.
+
+If you are used to using this centralized workflow in a company or team, you can continue to use this simple model. You only need to build a central repository and give everyone in the development team permission to push data, and you can start work. Git will not let users overwrite each other's changes.
+
+Of course this is not limited to small teams. Using Git's branch model, by working on multiple branches at the same time, even a development team of hundreds of people can collaborate well on a single project.
+
+### Integrated manager workflow
+
+Git allows multiple remote repositorys to exist, making such a workflow possible: each developer has the write permission of his own repository and the read permission of everyone else's repository. In this case, there is usually an authoritative repository representing the "official" project. To contribute to this project, you need to clone a public repository of your own from the project, and then push your changes to it. Then you can ask the maintainer of the official repository to pull the update and merge it into the main project. Maintainers can add your repository as a remote repository, test your changes locally, merge them into their branch and push back to the official repository.
+
+This is the most commonly used workflow for hub-based tools such as GitHub and GitLab. People can easily send a project into their own public repository, push their own changes to this repository, and make it visible to everyone. One of the main advantages of this is that you can continue to work, and the maintainer of the main repository can pull your changes at any time. Contributors don't have to wait for the maintainer to finish processing the submitted updates-everyone can work at their own pace.
+
+### Supervisor and deputy supervisor workflow
+
+This is actually a variant of the multi-repository workflow. This way of working is usually used in very large projects with hundreds of co-developers, such as the famous Linux kernel project. Each integration manager called **lieutenant** is responsible for a specific part of the integration project. All these deputy directors also have a general integrated manager called **dictator** responsible for overall planning. The repository maintained by the supervisor serves as a reference repository to provide all collaborators with the project codes they need to pull.
+
+This kind of workflow is not commonly used, and only when the project is extremely complex or requires multiple levels of management, it will show its advantages. In this way, the project chief (ie, the supervisor) can delegate a large amount of scattered integration work to different team leaders to handle them separately, and then coordinate the large code subsets at different times for subsequent integration.
+
+For details, please read the article pointed to by the reference source link
+
+Reference source
+
+Distributed Git-distributed workflow
diff --git a/doc/en-us/git/checkout.md b/doc/en-us/git/checkout.md
new file mode 100644
index 0000000..ae9b023
--- /dev/null
+++ b/doc/en-us/git/checkout.md
@@ -0,0 +1,13 @@
+# Roll back the file to the specified version
+
+Roll back a file to the specified version, for example:
+
+> git checkout commit_hash file...
+
+After the command is executed successfully, the file content in the working directory is rolled back to the file content of the specified version, and has been saved to the temporary storage area.
+
+You can also specify the number of rollback versions to perform the rollback operation, for example:
+
+> git checkout master~num file...
+
+After the command is executed successfully, the content of the file in the working directory is rolled back to the content of the latest **num+1** commit of **master** and saved to the temporary storage area.
diff --git a/doc/en-us/git/clone.md b/doc/en-us/git/clone.md
new file mode 100644
index 0000000..547e881
--- /dev/null
+++ b/doc/en-us/git/clone.md
@@ -0,0 +1,13 @@
+# Clone the repository to local
+
+After the repository is created on CodeFever, it needs to be cloned locally to continue.
+
+At this point, click the **Clone** button in the upper right corner of the repository home page. Copy the repository address according to the form you need, the default is **HTTPS**.
+
+Suppose you need to copy the repository whose repository address is url_copied_from_codefever to the local, the command line should be close to the following
+
+> git clone url_copied_from_codefever
+
+
+
+Figure 1 The location of the clone button on the home page of the repository
diff --git a/doc/en-us/git/createBranch.md b/doc/en-us/git/createBranch.md
new file mode 100644
index 0000000..b5d7ec2
--- /dev/null
+++ b/doc/en-us/git/createBranch.md
@@ -0,0 +1,25 @@
+# Create the first branch
+
+The newly created repository in CodeFever has no content. You need to create the first branch of the repository locally and push it to the remote repository.
+
+1. Clone the remote repository to the local (here, use **SSH** to clone, you need to add local **SSH** information in the **SSH Key** setting before cloning), and switch to the root directory of the repository, for example:
+
+> git clone git@codefever.pgyer.com:group_name/project_name.git
+
+> cd project_name
+
+After cloning is complete, the working directory has been switched to the default **master** branch, and other branches can also be created, for example:
+
+> git checkout -b branch_name
+
+2. Add content, create the first commit, for example:
+
+> echo 'init' > readme.md
+
+> git add readme.md
+
+> git commit -m 'init commit'
+
+3. Push to the remote repository, for example:
+
+> git push origin branch_name
diff --git a/doc/en-us/git/index.md b/doc/en-us/git/index.md
new file mode 100644
index 0000000..c7c9157
--- /dev/null
+++ b/doc/en-us/git/index.md
@@ -0,0 +1,13 @@
+[Clone the repository locally](/doc/en/git/clone.md)
+
+[Create the first branch](/doc/en/git/createBranch.md)
+
+[Push a new branch](/doc/en/git/pushBranch.md)
+
+[Revert the committed changes](/doc/en/git/revert.md)
+
+[Roll back a file to the specified version](/doc/en/git/checkout.md)
+
+[Remote repository source management](/doc/en/git/remote.md)
+
+[Local branch merge](/doc/en/git/mergeBranch.md)
diff --git a/doc/en-us/git/mergeBranch.md b/doc/en-us/git/mergeBranch.md
new file mode 100644
index 0000000..e2cc1ba
--- /dev/null
+++ b/doc/en-us/git/mergeBranch.md
@@ -0,0 +1,55 @@
+# Local branch merge
+
+When merging branches on **CodeFever**, you will encounter conflicting changes. Currently, **CodeFever** does not support online conflict resolution for the time being. You can use the following process to complete branch merging in conflict situations. These processes are not limited to resolving conflicts, but can also be used as normal merging branches.
+
+### Merge branches within the same repository
+
+In the same repository, when merging from the **origin_branch** branch to the **target_branch** branch on **CodeFever**, if you encounter a conflict:
+
+1. Locally, switch the working directory to the branch **target_branch**, for example:
+
+> git checkout target_branch
+
+2. Merge the changes of **origin_branch** to the current branch **target_branch**, for example:
+
+> git merge origin_branch
+
+3. Modify the conflicting files and resolve the conflicts.
+
+4. Create a new commit (git add & git commit).
+
+5. Push the conflict resolution changes to the remote repository, for example:
+
+> git push remote_name target_branch
+
+### Merge branches between different repositories
+
+On **CodeFever**, when merging from the **origin_branch** branch of the **origin_repo** repository to the **target_branch** branch of the **target_repo** repository, if you encounter conflict:
+
+1. In the local **target_repo** repository, switch the working directory to the branch **target_branch**, for example:
+
+> git checkout target_branch
+
+2. Add the remote repository **origin_repo** to the local **target_repo** repository, for example:
+
+> git remote add remote_name url_copied_from_codefever
+
+3. Pull the changes of the remote repository branch **origin_branch**, for example:
+
+> git fetch remote_name origin_branch
+
+4. Merge the changes of **remote_name/origin_branch** to the current branch **target_branch**, for example:
+
+> git merge remote_name/origin_branch
+
+5. Modify conflicting files and resolve merge conflicts.
+
+6. Create a new commit (git add & git commit).
+
+7. Push the conflict resolution changes to the remote repository **target_repo**, for example:
+
+> git push target_remote target_branch
+
+8. Delete the remote branch **origin_repo**, for example:
+
+> git remote remove remote_name
diff --git a/doc/en-us/git/pushBranch.md b/doc/en-us/git/pushBranch.md
new file mode 100644
index 0000000..1cc5ece
--- /dev/null
+++ b/doc/en-us/git/pushBranch.md
@@ -0,0 +1,9 @@
+# Push a new branch
+
+If the pushed branch does not exist in the remote repository, it will be considered a new branch.
+
+At this point, the push command needs one more parameter **-u** to complete the push of the new branch
+
+For example: when pushing a new branch named **master** to a remote repository named **origin**, the push command should be close to the following text:
+
+> git push -u origin/master
diff --git a/doc/en-us/git/remote.md b/doc/en-us/git/remote.md
new file mode 100644
index 0000000..8aba5f1
--- /dev/null
+++ b/doc/en-us/git/remote.md
@@ -0,0 +1,15 @@
+# Remote repository source management
+
+Add remote repository
+
+> git remote add remote_name url_copied_from_codefever
+
+After the addition is successful, you can use **git push** to push new changes to the remote repository, and use **git pull** to pull new changes.
+
+List of remote repositories
+
+> git remote \[-v\]
+
+delete remote repository
+
+> git remote remove remote_name
diff --git a/doc/en-us/git/revert.md b/doc/en-us/git/revert.md
new file mode 100644
index 0000000..83b4cfa
--- /dev/null
+++ b/doc/en-us/git/revert.md
@@ -0,0 +1,25 @@
+# Revert the committed changes
+
+Sometimes it is necessary to revert the changes of a commit, which can be achieved by using the **git revert** command, for example:
+
+> git revert commit_hash
+
+After the command is executed successfully, the changes whose commit hash is **commit_hash** are restored. If there is no conflict, a new commit will be automatically created. Add the **-n** option if you do not want the commit to be created automatically.
+
+You can also restore a previous commit based on the current **HEAD**, for example:
+
+> git revert HEAD~num
+
+After the command is executed successfully, the latest **num+1** commit changes are restored. If there is no conflict, a new commit will be created automatically.
+
+You can also specify a range to revert the changes of several commits, for example:
+
+> git revert -n master~num1.. master~num2
+
+After the command is executed successfully, the changes from the most recent **num1** (inclusive) commit to the most recent **num2+1** (inclusive) commit are reverted.
+
+Because the **-n** option is used, the restored result is saved in the staging area, and a new commit needs to be created manually.
+
+When the **-n** option is used, if the result of the revert operation is not as expected, the revert operation can be undone before creating a new commit, for example:
+
+> git revert --abort
diff --git a/doc/en-us/index.md b/doc/en-us/index.md
new file mode 100644
index 0000000..7fbaf91
--- /dev/null
+++ b/doc/en-us/index.md
@@ -0,0 +1,5 @@
+[FAQ](/doc/en/common)
+
+[Git](/doc/en/git)
+
+[Manual](/doc/en/manual)
diff --git a/doc/en-us/manual/codefever.md b/doc/en-us/manual/codefever.md
new file mode 100644
index 0000000..a501671
--- /dev/null
+++ b/doc/en-us/manual/codefever.md
@@ -0,0 +1,39 @@
+# What is CodeFever?
+
+# Introduction
+
+CodeFever is a code repository platform under Dandelion that provides more lightweight, efficient and stable R&D and production. The team can carry out research and development work and plan deployment projects more freely.
+
+# The main function
+
+CodeFever provides users with basic Git code hosting, including code online viewing, historical version viewing, Fork, Merge Request, version control, branch protection, member access, and other functions that facilitate management, development, and collaboration.
+
+# Why use CodeFever?
+
+Self-built code hosting system is the choice of most enterprises in the early stage, which requires some preparations, such as: selecting open source software suitable for development scenarios, preparing some storage hardware devices for hosting code, etc.
+
+When preparing for these tasks, it is necessary to have staff who are very familiar with open source software for construction and daily maintenance. It is necessary to purchase some physical or cloud storage servers, and it is necessary to spend some special costs to improve the overall security and stability. These preparations are a large investment cost for the initial stage of the enterprise, so the cloud code repository is the best choice for most companies at this time.
+
+In terms of code storage, the cloud code repository provides high availability and multiple copies, automatic backup, and supports high-speed access; in terms of code security, it provides a complete permission mechanism to reduce the risk of internal members leaking code data.
+
+CodeFever is a code repository platform created by Dandelion for developers, providing more lightweight, efficient and stable R&D and production. The team can carry out research and development work and plan deployment projects more freely.
+
+CodeFever provides the following functions and guarantees:
+
+Adopt multi-copy high-availability architecture, automatic backup without operation and maintenance, and ensure code security.
+
+Exhaustive logging, leaving no commits behind, makes every step effectively traceable.
+
+Cloud high-availability repositorys are more efficient and faster, and Git code management is easier.
+
+Clear branch authority management, with protected branches, improve overall security, and team collaboration is standardized and smooth.
+
+Automatic scanning of incremental code to improve the efficiency of codereview, and process of team member review and approval before merging to improve code quality.
+
+Use MergeRequest's code review mechanism to improve code quality.
+
+Comprehensive and refined authority management, suitable for different personnel to manage repository content.
+
+repository group member permissions are set, and outsourced teams can also use them safely.
+
+IP access settings can be performed on the repository to improve the security level of the code repository.
diff --git a/doc/en-us/manual/commit.md b/doc/en-us/manual/commit.md
new file mode 100644
index 0000000..4df2d21
--- /dev/null
+++ b/doc/en-us/manual/commit.md
@@ -0,0 +1,19 @@
+# Commit
+
+On the repository details page, you can click the **commit** button to view the history information of the commit code. If the history information of the commit code is too much, you can filter it according to the branch.
+
+
+
+Figure 1 repository commit information details page display
+
+Click **commit information title** to enter the commit code details page.
+
+
+
+Figure 2 Commit code details page display
+
+Click the **Open file number** button to display the file location, which is convenient for viewing and comparing other file information.
+
+
+
+Figure 3 Display of the number of open files on the commit code details page
diff --git a/doc/en-us/manual/createBranch.md b/doc/en-us/manual/createBranch.md
new file mode 100644
index 0000000..05b17e2
--- /dev/null
+++ b/doc/en-us/manual/createBranch.md
@@ -0,0 +1,13 @@
+# Create branch
+
+Enter any repository, click the **Branch** button, and click the **New Branch** button at the top right of the branch list page.
+
+
+
+Figure 1 Location of the new branch button on the branch list page
+
+After filling in the branch information and confirming the new branch page, the branch creation can be completed.
+
+
+
+Figure 2 New branch page
diff --git a/doc/en-us/manual/createGroup.md b/doc/en-us/manual/createGroup.md
new file mode 100644
index 0000000..26d535e
--- /dev/null
+++ b/doc/en-us/manual/createGroup.md
@@ -0,0 +1,25 @@
+# Create a repository group
+
+## Create a repository group on the repository group list page when there is no repository group
+
+After clicking Login, click the New **repository Group** button in the middle of the repository list page on the landing page.
+
+
+
+Figure 1 Location of the new button in the middle of the repository group list page
+
+## Use the navigation bar shortcut button to create a repository group
+
+Click the **+** button on the right side of the navigation bar to select New repository Group
+
+
+
+Figure 1 Shortcut button location
+
+## Create a repository using the Create Repository Group button
+
+After successful login, click the **New repository Group** button at the top right of the repository group list page.
+
+
+
+Figure 3 The location of the Create repository button on the repository group list page
diff --git a/doc/en-us/manual/createRepository.md b/doc/en-us/manual/createRepository.md
new file mode 100644
index 0000000..3b4acce
--- /dev/null
+++ b/doc/en-us/manual/createRepository.md
@@ -0,0 +1,37 @@
+# Create a repository
+
+## Create a repository on the repository list page when there is no repository
+
+After successful login, click the **Create repository** button in the middle of the repository list page.
+
+
+
+Figure 1 Location of the new button in the middle of the repository list page
+
+Note: If it is used for the first time and there is no repository group, the user needs to create a repository group before creating a repository.
+
+## Use the navigation bar shortcut button to create a repository
+
+Click the **+** button on the right side of the navigation bar to select Create a repository
+
+
+
+Figure 2 Shortcut button location
+
+## Use the Create Repository button to create a repository
+
+After successful login, click the **Create repository** button at the top right of the repository list page.
+
+
+
+Figure 3 The location of the Create repository button on the repository list page
+
+## Create a repository in the specified repository group
+
+1\. Enter the home page of the repository group where the repository needs to be created
+
+2\. Click the **Create repository** button in the upper right corner of the page.
+
+
+
+Figure 4 The location of the Create repository button on the home page of the repository group
diff --git a/doc/en-us/manual/file.md b/doc/en-us/manual/file.md
new file mode 100644
index 0000000..c440e3b
--- /dev/null
+++ b/doc/en-us/manual/file.md
@@ -0,0 +1,21 @@
+# File
+
+The CodeFever file page displays code and repository information, supports fork operations, and provides two cloning methods, HTTPS and SSH.
+
+
+
+Figure 1 repository file page display
+
+Enter the file details page to view the file content, historical operations, and blame.
+
+
+
+Figure 2 Display of the file details page
+
+
+
+Figure 3 File submission history display
+
+
+
+Figure 4 File blame information display
diff --git a/doc/en-us/manual/homepage.md b/doc/en-us/manual/homepage.md
new file mode 100644
index 0000000..e3085a1
--- /dev/null
+++ b/doc/en-us/manual/homepage.md
@@ -0,0 +1,59 @@
+# Homepage
+
+# repository list
+
+All the repository information of the user in CodeFever is displayed on the home page in the form of a list, including the repositorys that the user participated in and the repositorys created, which is convenient for users to quickly view some repository data.
+
+
+
+Figure 1 Homepage repository list display
+
+# list of repository groups
+
+All the repository group information of the user in CodeFever is displayed on the home page in the form of a card, including the repository group that the user participated in and the repository group created, which is convenient for the user to quickly view some repository group data.
+
+
+
+Figure 2 Home page repository group list display
+
+# merge request
+
+All merge request data of users in CodeFever is displayed on the home page in the form of a list, including the content of opened, closed and merged merge requests. Users can also quickly create merge requests on this page.
+
+
+
+Figure 3 Home page merge request list page
+
+Click the Merge Request button at the shortcut entry position at the top right corner of any page, and you can also enter the merge request general page.
+
+
+
+Figure 4 Quick entry merge request button location
+
+# set up
+
+# Personal information settings
+
+Users can set user avatars, user names, change email addresses, change mobile phone information, and bind third-party accounts on the personal information settings page.
+
+
+
+Figure 5 Personal Information Settings Page
+
+Note: After changing the email address and mobile phone, it will be updated to the Dandelion account information synchronously.
+
+# Multiple mailboxes
+
+The multi-mailbox function is used for the same user to have multiple different mailboxes for submitting codes. After the user is added, the system can identify and create an association relationship.
+
+
+
+Figure 6 Multi-mailbox management page
+
+# SSH Keys
+
+SSH Key is used for authentication of Git client to communicate with remote repository through SSH protocol. After setting the SSH Key in CodeFever, you do not need to enter the user and password for authentication when using SSH to connect to the repository located on CodeFever.
+
+
+
+Figure 7 SSH Keys configuration page
diff --git a/doc/en-us/manual/index.md b/doc/en-us/manual/index.md
new file mode 100644
index 0000000..4ac285e
--- /dev/null
+++ b/doc/en-us/manual/index.md
@@ -0,0 +1,17 @@
+[What is CodeFever?](/doc/en/manual/codefever.md)
+
+[Homepage](/doc/en/manual/homepage.md)
+
+[Create a repository](/doc/en/manual/createRepository.md)
+
+[Create a repository group](/doc/en/manual/createGroup.md)
+
+[Create a branch](/doc/en/manual/createBranch.md)
+
+[File](/doc/en/manual/file.md)
+
+[Commit](/doc/en/manual/commit.md)
+
+[Merge request](/doc/en/manual/mergeRequest.md)
+
+[SSH key configuration](/doc/en/manual/sshKey.md)
diff --git a/doc/en-us/manual/mergeRequest.md b/doc/en-us/manual/mergeRequest.md
new file mode 100644
index 0000000..0dbd735
--- /dev/null
+++ b/doc/en-us/manual/mergeRequest.md
@@ -0,0 +1,17 @@
+# Merge request
+
+The developer submits a merge request for the code under one branch to another branch. After the request is passed, the merge is successful, which can better protect the security of the branch code and is the most important part of the CodeFever code repository.
+
+
+
+Figure 1 Merge request list page display
+
+Click the **Create Merge Request** button to enter the Select and Compare Branch Code page.
+
+
+
+Figure 2 Create a merge request and select the branch code page to display
+
+Go to the Create Merge Request page
+
+
diff --git a/doc/en-us/manual/sshKey.md b/doc/en-us/manual/sshKey.md
new file mode 100644
index 0000000..f096e0a
--- /dev/null
+++ b/doc/en-us/manual/sshKey.md
@@ -0,0 +1,13 @@
+# Set SSH Key
+
+Go to **Settings** -> **SSH Keys**
+
+
+
+Figure 1 SSH Keys setting button location
+
+Enter the Add SSH Key page, paste the copied SSH Key content, write a name for it, and click the **Add SSH Key** button to add it successfully. You can view the added SSH Key information below.
+
+
+
+Figure 2 New SSH Key content page
diff --git a/doc/zh-cn/common/assets/075a9efc66e0203714829207c20ba491.png b/doc/zh-cn/common/assets/075a9efc66e0203714829207c20ba491.png
new file mode 100644
index 0000000..14b2422
Binary files /dev/null and b/doc/zh-cn/common/assets/075a9efc66e0203714829207c20ba491.png differ
diff --git a/doc/zh-cn/common/assets/f51de0753df4474fa8feeb0b88f1bcdb.png b/doc/zh-cn/common/assets/f51de0753df4474fa8feeb0b88f1bcdb.png
new file mode 100644
index 0000000..8043f26
Binary files /dev/null and b/doc/zh-cn/common/assets/f51de0753df4474fa8feeb0b88f1bcdb.png differ
diff --git a/doc/zh-cn/common/assets/fe7681d81ea92f1356abb4fd672d8978.png b/doc/zh-cn/common/assets/fe7681d81ea92f1356abb4fd672d8978.png
new file mode 100644
index 0000000..208fb82
Binary files /dev/null and b/doc/zh-cn/common/assets/fe7681d81ea92f1356abb4fd672d8978.png differ
diff --git a/doc/zh-cn/common/cloneMethod.md b/doc/zh-cn/common/cloneMethod.md
new file mode 100644
index 0000000..ab9b4cf
--- /dev/null
+++ b/doc/zh-cn/common/cloneMethod.md
@@ -0,0 +1,7 @@
+# HTTP(S) 还是 SSH ?
+
+在克隆仓库到本地时,一般会遇到选择使用 HTTPS 还是 SSH 方式来连接远端仓库的问题。CodeFever 也提供了这两种方式供用户选择。
+
+SSH 方式的优点在于,当用户在 CodeFever 的个人设置中设置好 SSH Key 以后,每次使用 SSH 连接远端仓库均不需要再进行任何人工的认证方式。但是使用 SSH 方式对于用户有一定的要求,用户必须自己生成 SSH Key 并完成配置。
+
+相比之下 HTTPS 方式更适合新手和不熟悉操作系统的用户,不需要生成并设置 SSH Key。但是在使用 HTTPS 方式连接远端仓库时,每次连接都需要输入邮箱和密码进行身份认证。
diff --git a/doc/zh-cn/common/history.md b/doc/zh-cn/common/history.md
new file mode 100644
index 0000000..b62ee33
--- /dev/null
+++ b/doc/zh-cn/common/history.md
@@ -0,0 +1,13 @@
+# 如何追溯文件修改 ?
+
+CodeFever 提供两种方式进行文件修改的追溯, 分别是 **历史** 和 **Blame** 。
+
+**历史**: 是指文件从创建到当前状态所有的变更记录的列表。
+
+**Blame**: 是指文件当前状态每一行最后是有谁编辑的。
+
+一般来说,**历史** 用于追溯文件的变化过程,而 **Blame** 用于查看当前文件每一行的最后编辑者。
+
+历史 和 Blame 按钮可以在具体文件的文件内容展示标题栏找到。
+
+
diff --git a/doc/zh-cn/common/index.md b/doc/zh-cn/common/index.md
new file mode 100644
index 0000000..94a6936
--- /dev/null
+++ b/doc/zh-cn/common/index.md
@@ -0,0 +1,13 @@
+[如何获取并设置 SSH Key ?](/doc/cn/common/sshKey.md)
+
+[HTTP(S) 还是 SSH ?](/doc/cn/common/cloneMethod.md)
+
+[如何选择成员角色 ?](/doc/cn/common/memberRole.md)
+
+[使用了多个邮箱地址提交文件变更是否能被追溯 ?](/doc/cn/common/multiEmail.md)
+
+[标签(Tag)是什么 ?和分支(Branch)有什么不同](/doc/cn/common/tag.md)
+
+[使用 CodeFever 时如何选择工作流程?](/doc/cn/common/workFlow.md)
+
+[如何追溯文件修改?](/doc/cn/common/history.md)
diff --git a/doc/zh-cn/common/memberRole.md b/doc/zh-cn/common/memberRole.md
new file mode 100644
index 0000000..2543a18
--- /dev/null
+++ b/doc/zh-cn/common/memberRole.md
@@ -0,0 +1,17 @@
+# 如何选择成员角色 ?
+
+CodeFever 内置五种用户角色,分别是 **访客**、**监督者**、**开发者**、**维护者** 和 **所有者**。这五类角色分别具有的权限如文末附表所示。
+
+五类角色具体描述为:
+
+**访客**: 仓库中权限最低的角色,对整个仓库所有的项目只有读取权限,一般用于设置给项目外成员读取代码使用。
+
+**监督者**: 对仓库有读取权限,同时可以跟进 **合并请求** 的进度,一般用于项目组内 QA 、测试人员 项目经理 等 角色。
+
+**开发者**: 对于仓库代码有读写权限,可以推送代码,可以提交和查看 **合并请求**。一般用于项目的开发人员。
+
+**维护者**: 对于仓库代码和仓库管理有基础权限,可以合并和关闭 **合并请求**。一般用与项目的技术管理人员或技术主管。
+
+**所有者**: 具有仓库的所有权限。
+
+
diff --git a/doc/zh-cn/common/multiEmail.md b/doc/zh-cn/common/multiEmail.md
new file mode 100644
index 0000000..680344c
--- /dev/null
+++ b/doc/zh-cn/common/multiEmail.md
@@ -0,0 +1,15 @@
+# 使用了多个邮箱地址提交文件变更是否能被追溯 ?
+
+一般情况,每个用户在自己的所有的 **Git 客户端** 中设置的邮箱地址是一致的。当使用一致的邮箱提交文件时,提交信息会被识别成相应的用户。但是,在某些情况下,当同一个用户在不同的 **Git 客户端** 设置的提交邮箱不一致时,则可能出现在同一个项目中同一个人的提交会以多个身份的形式呈现出来的情况。
+
+当有一个用户拥有多个提交邮箱时并且希望这些提交邮箱对应的提交都以自己的身份标记时。则需要进行 **多邮箱** 设置。
+
+具体操作方式如下:
+
+1\. 在落地页点开 **设置** 菜单 点击 **多邮箱**
+
+2\. 点击 **新建邮箱地址** 按钮。
+
+3\. 填写需要绑定的邮箱地址点击 **确认** 图标按钮后完成邮箱地址验证即可。
+
+
diff --git a/doc/zh-cn/common/sshKey.md b/doc/zh-cn/common/sshKey.md
new file mode 100644
index 0000000..ca3fc51
--- /dev/null
+++ b/doc/zh-cn/common/sshKey.md
@@ -0,0 +1,25 @@
+# 如何获取并设置 SSH Key ?
+
+SSH Key 用于 Git 客户端通过 SSH 协议与远端仓库通信的身份认证。当在 CodeFever 中设置 SSH Key 之后,使用 SSH 方式连接位于 CodeFever 上的仓库时不需要再输入用户和密码进行认证。
+
+### 获取 SSH Key
+
+当使用 Linux 或 MacOS 系统时,系统会默认安装 ssh 相关组件。此时,SSH Key 存在于家目录下的 .ssh 目录下。当使用 Windows 操作系统时,需要安装 Git Bash,文中提到的所有命令需要在 Git Bash 中输入。
+
+在终端输入以下命令即可查看该目录。
+
+> ls -al ~/.ssh
+
+如果目录中包含 **id_rsa.pub** 或 **id_dsa.pub** 文件时,则不需要新产生 SSH Key,否则,需要手动生成 SSH Key。在终端输入以下命令可以生成 SSH Key。
+
+> ssh-keygen -t rsa -C “name_of_id_or_any_comment”
+
+注意: 参数 **-C** 后面可以输入任何你希望标识该 SSH Key 的名称
+
+此时,~/.ssh 目录下应该会新增一个名为 id_rsa.pub 的文件,这个文件里面存储的就是 SSH Key。在终端输入以下命令可以查看 SSH Key 内容。
+
+> cat ~/.ssh/id_rsa.pub
+
+### 设置 SSH Key
+
+将上一过程中显示的 SSH Key 内容复制后,到 CodeFever 中 **个人设置** -> **SSH Keys** 中,新增 SSH Key 即可。
diff --git a/doc/zh-cn/common/tag.md b/doc/zh-cn/common/tag.md
new file mode 100644
index 0000000..1cba330
--- /dev/null
+++ b/doc/zh-cn/common/tag.md
@@ -0,0 +1,9 @@
+# 标签(Tag)是什么 ?和分支(Branch)有什么不同 ?
+
+在 Git 中,**标签** 和 **分支** 本质都是对某一 **提交节点** 的引用。不同的地方是 **标签** 是固定不变的引用,而 **分支** 是动态的引用。
+
+Git 管理文件的方式更接近一种增量管理模式,当某个文件发生变化并提交时,一个新的 **提交节点** 将会产生。当我们产生一个新的 **提交节点** 时,当前的 **分支** 将会变为当前 **提交节点** 的引用。因为 **分支** 对于 **提交节点** 的引用是随着每次提交而发生变化的,因此不能使用分支来固定某时刻仓库内文件的状态。
+
+此时,如果希望有一个什么标记来固定某时刻仓库内文件的状态,那么 **标签** 就最合适不过了。当标签产生时,标签指向了一个固定的 **提交节点** 的引用。则此时可以用 **标签** 来表示仓库内文件的状态。
+
+一般通常使用 **标签** 来标记文件的版本。
diff --git a/doc/zh-cn/common/workFlow.md b/doc/zh-cn/common/workFlow.md
new file mode 100644
index 0000000..400bced
--- /dev/null
+++ b/doc/zh-cn/common/workFlow.md
@@ -0,0 +1,33 @@
+# 使用 CodeFever 时如何选择工作流程?
+
+选择了 CodeFever 则相当于选择了分布式 Git 工作流程,常见的分布式流程有 **集中式工作流**、**集成管理者工作流** 和 **主管副主管工作流** 每一种工作流都有自己的特点,这里需要根据自己项目的特点来判断。
+
+CodeFever 提供了 **分支**、**合并请求** 及 **Fork** 功能,因此可以轻松支持这三种工作流。
+
+### 集中式工作流
+
+集中式系统中通常使用的是单点协作模型——集中式工作流。 一个中心集线器,或者说 **仓库**,可以接受代码,所有人将自己的工作与之同步。 若干个开发者则作为节点,即中心仓库的消费者与中心仓库同步。
+
+这意味着如果两个开发者从中心仓库克隆代码下来,同时作了一些修改,那么只有第一个开发者可以顺利地把数据推送回共享服务器。 第二个开发者在推送修改之前,必须先将第一个人的工作合并进来,这样才不会覆盖第一个人的修改。 这和 Subversion (或任何 CVCS)中的概念一样,而且这个模式也可以很好地运用到 Git 中。
+
+如果在公司或者团队中,你已经习惯了使用这种集中式工作流程,完全可以继续采用这种简单的模式。 只需要搭建好一个中心仓库,并给开发团队中的每个人推送数据的权限,就可以开展工作了。Git 不会让用户覆盖彼此的修改。
+
+当然这并不局限于小团队。 利用 Git 的分支模型,通过同时在多个分支上工作的方式,即使是上百人的开发团队也可以很好地在单个项目上协作。
+
+### 集成管理者工作流
+
+Git 允许多个远程仓库存在,使得这样一种工作流成为可能:每个开发者拥有自己仓库的写权限和其他所有人仓库的读权限。 这种情形下通常会有个代表“官方”项目的权威的仓库。 要为这个项目做贡献,你需要从该项目克隆出一个自己的公开仓库,然后将自己的修改推送上去。 接着你可以请求官方仓库的维护者拉取更新合并到主项目。 维护者可以将你的仓库作为远程仓库添加进来,在本地测试你的变更,将其合并入他们的分支并推送回官方仓库。
+
+这是 GitHub 和 GitLab 等集线器式(hub-based)工具最常用的工作流程。人们可以容易地将某个项目派生成为自己的公开仓库,向这个仓库推送自己的修改,并为每个人所见。 这么做最主要的优点之一是你可以持续地工作,而主仓库的维护者可以随时拉取你的修改。 贡献者不必等待维护者处理完提交的更新——每一方都可以按照自己的节奏工作。
+
+### 主管与副主管工作流
+
+这其实是多仓库工作流程的变种。 一般拥有数百位协作开发者的超大型项目才会用到这样的工作方式,例如著名的 Linux 内核项目。 被称为 **副主管(lieutenant)** 的各个集成管理者分别负责集成项目中的特定部分。 所有这些副主管头上还有一位称为 **主管(dictator)** 的总集成管理者负责统筹。 主管维护的仓库作为参考仓库,为所有协作者提供他们需要拉取的项目代码。
+
+这种工作流程并不常用,只有当项目极为庞杂,或者需要多级别管理时,才会体现出优势。 利用这种方式,项目总负责人(即主管)可以把大量分散的集成工作委托给不同的小组负责人分别处理,然后在不同时刻将大块的代码子集统筹起来,用于之后的整合。
+
+详细请阅读参考来源链接指向的文章
+
+参考来源
+
+分布式 Git - 分布式工作流程
diff --git a/doc/zh-cn/git/assets/4bc4bc348c38513890c05295ae0f1730.png b/doc/zh-cn/git/assets/4bc4bc348c38513890c05295ae0f1730.png
new file mode 100644
index 0000000..2273294
Binary files /dev/null and b/doc/zh-cn/git/assets/4bc4bc348c38513890c05295ae0f1730.png differ
diff --git a/doc/zh-cn/git/checkout.md b/doc/zh-cn/git/checkout.md
new file mode 100644
index 0000000..ef6951f
--- /dev/null
+++ b/doc/zh-cn/git/checkout.md
@@ -0,0 +1,13 @@
+# 回退文件到指定版本
+
+回退某个文件到指定版本,例如:
+
+> git checkout commit_hash file...
+
+命令执行成功后,工作目录的文件内容回退到指定版本的文件内容,同时已保存至暂存区。
+
+还可以指定回退的版本数来进行回退操作,例如:
+
+> git checkout master~num file...
+
+命令执行成功后,工作目录中的文件内容回退到 **master** 最近的 **第num+1** 次提交的内容,并保存至暂存区。
diff --git a/doc/zh-cn/git/clone.md b/doc/zh-cn/git/clone.md
new file mode 100644
index 0000000..3793850
--- /dev/null
+++ b/doc/zh-cn/git/clone.md
@@ -0,0 +1,13 @@
+# 克隆仓库到本地
+
+当仓库在 CodeFever 上创建完成后,需要克隆到本地才能继续操作。
+
+此时,在仓库首页右上角点击 **克隆** 按钮。根据你需要的形式来复制仓库地址,默认为 **HTTPS**。
+
+假设你需要复制仓库地址为 url_copied_from_codefever 的仓库到本地,则命令行应该接近于如下
+
+> git clone url_copied_from_codefever
+
+
+
+图1 克隆按钮在仓库首页中的位置
diff --git a/doc/zh-cn/git/createBranch.md b/doc/zh-cn/git/createBranch.md
new file mode 100644
index 0000000..2ae92b7
--- /dev/null
+++ b/doc/zh-cn/git/createBranch.md
@@ -0,0 +1,26 @@
+
+# 创建第一个分支
+
+在 CodeFever 新建的仓库没有任何内容,需要在本地创建仓库的第一个分支,并推送到远程仓库。
+
+1、克隆远程仓库到本地(这里使用 **SSH** 的方式克隆,克隆前需要在 **SSH Key** 设置中添加本地 **SSH** 信息),并切换到仓库根目录,例如:
+
+> git clone git@codefever.pgyer.com:group_name/project_name.git
+
+> cd project_name
+
+克隆完成后,工作目录已经切换到默认的 **master** 分支,也可以创建其他的分支,例如:
+
+> git checkout -b branch_name
+
+2、添加内容,创建第一次提交,例如:
+
+> echo 'init' > readme.md
+
+> git add readme.md
+
+> git commit -m 'init commit'
+
+3、推送到远程仓库,例如:
+
+> git push origin branch_name
diff --git a/doc/zh-cn/git/index.md b/doc/zh-cn/git/index.md
new file mode 100644
index 0000000..e7f1170
--- /dev/null
+++ b/doc/zh-cn/git/index.md
@@ -0,0 +1,13 @@
+[克隆仓库到本地](/doc/cn/git/clone.md)
+
+[创建第一个分支](/doc/cn/git/createBranch.md)
+
+[推送一个新分支](/doc/cn/git/pushBranch.md)
+
+[还原提交的改动](/doc/cn/git/revert.md)
+
+[回退文件到指定版本](/doc/cn/git/checkout.md)
+
+[远程仓库源管理](/doc/cn/git/remote.md)
+
+[本地的分支合并](/doc/cn/git/mergeBranch.md)
diff --git a/doc/zh-cn/git/mergeBranch.md b/doc/zh-cn/git/mergeBranch.md
new file mode 100644
index 0000000..89e21a3
--- /dev/null
+++ b/doc/zh-cn/git/mergeBranch.md
@@ -0,0 +1,55 @@
+# 本地的分支合并
+
+在 **CodeFever** 上合并分支时,会遇到改动冲突的情况,目前 **CodeFever** 暂时不支持在线解决冲突,可以使用下面的流程完成冲突情况下的分支合并。这些流程不局限于解决冲突,也可以作为正常合并分支的流程。
+
+### 同一个仓库内的分支合并
+
+在同一个仓库内,在 **CodeFever** 上从 **origin_branch** 分支往 **target_branch** 分支合并时,如果遇到冲突:
+
+1、在本地,先切换工作目录到分支 **target_branch**,例如:
+
+> git checkout target_branch
+
+2、合并 **origin_branch** 的改动到当前分支 **target_branch**,例如:
+
+> git merge origin_branch
+
+3、修改有冲突的文件,解决冲突。
+
+4、创建新提交(git add & git commit)。
+
+5、将解决冲突的改动推送到远程仓库,例如:
+
+> git push remote_name target_branch
+
+### 在不同仓库间进行分支合并
+
+在 **CodeFever** 上,从 **origin_repo** 仓库的 **origin_branch** 分支往 **target_repo** 仓库的 **target_branch** 分支合并时,如果遇到冲突:
+
+1、在 **target_repo** 仓库的本地,切换工作目录到分支 **target_branch**,例如:
+
+> git checkout target_branch
+
+2、为本地的 **target_repo** 仓库添加远程仓库 **origin_repo**,例如:
+
+> git remote add remote_name url_copied_from_codefever
+
+3、拉取远程仓库分支 **origin_branch** 的改动,例如:
+
+> git fetch remote_name origin_branch
+
+4、合并 **remote_name/origin_branch** 的改动到当前分支 **target_branch**,例如:
+
+> git merge remote_name/origin_branch
+
+5、修改有冲突的文件,解决合并冲突。
+
+6、创建新提交(git add & git commit)。
+
+7、将解决冲突的改动推送到远程仓库 **target_repo**,例如:
+
+> git push target_remote target_branch
+
+8、删除远程分支 **origin_repo**,例如:
+
+> git remote remove remote_name
diff --git a/doc/zh-cn/git/pushBranch.md b/doc/zh-cn/git/pushBranch.md
new file mode 100644
index 0000000..b9a13aa
--- /dev/null
+++ b/doc/zh-cn/git/pushBranch.md
@@ -0,0 +1,9 @@
+# 推送一个新分支
+
+如果推送的分支在远端仓库中不存在,则会被认定为一个新分支。
+
+此时,推送的命令需要多一个 **-u** 的参数来完成新分支的推送
+
+例如:当推送一个名为 **master** 的新分支到名为 **origin** 的远端仓库中时,推送命令应该接近于以下文本:
+
+> git push -u origin/master
diff --git a/doc/zh-cn/git/remote.md b/doc/zh-cn/git/remote.md
new file mode 100644
index 0000000..69a79bb
--- /dev/null
+++ b/doc/zh-cn/git/remote.md
@@ -0,0 +1,15 @@
+# 远程仓库源管理
+
+添加远程仓库
+
+> git remote add remote_name url_copied_from_codefever
+
+添加成功后,可以使用 **git push** 向远程仓库推送新改动,使用 **git pull** 拉取新的改动。
+
+远程仓库列表
+
+> git remote \[-v\]
+
+删除远程仓库
+
+> git remote remove remote_name
diff --git a/doc/zh-cn/git/revert.md b/doc/zh-cn/git/revert.md
new file mode 100644
index 0000000..6c76eaf
--- /dev/null
+++ b/doc/zh-cn/git/revert.md
@@ -0,0 +1,25 @@
+# 还原提交的改动
+
+有时需要还原某一次提交的改动,可以使用 **git revert** 命令实现,例如:
+
+> git revert commit_hash
+
+命令执行成功后,还原了提交哈希为 **commit_hash** 的改动,如果没有冲突,会自动创建一次新的提交。如果不希望自动创建提交,加上 **-n** 选项。
+
+还可以以当前 **HEAD** 为基准,还原之前的某次提交,例如:
+
+> git revert HEAD~num
+
+命令执行成功后,还原了最近的 **第num+1** 次提交的改动,如果没有冲突,会自动创建一次新的提交。
+
+还可以指定一个范围还原某几次提交的改动,例如:
+
+> git revert -n mater~num1.. master~num2
+
+命令执行成功后,还原了最近的 **第num1** 次(包括)提交到最近的 **第num2+1** 次(包括)提交的改动。
+
+因为使用了**-n** 选项,还原的结果保存到了暂存区中,需要手动创建新的提交。
+
+在使用了 **-n** 选项时,如果还原操作的结果不符合预期,在创建新的提交之前,可以撤销本次还原操作,例如:
+
+> git revert --abort
diff --git a/doc/zh-cn/index.md b/doc/zh-cn/index.md
new file mode 100644
index 0000000..e92df1b
--- /dev/null
+++ b/doc/zh-cn/index.md
@@ -0,0 +1,5 @@
+[常见问题](/doc/cn/common)
+
+[Git 基本操作](/doc/cn/git)
+
+[用户手册](/doc/cn/manual)
\ No newline at end of file
diff --git a/doc/zh-cn/manual/assets/04a8205286f6d7f1800685d797b6189d.png b/doc/zh-cn/manual/assets/04a8205286f6d7f1800685d797b6189d.png
new file mode 100644
index 0000000..6dfee86
Binary files /dev/null and b/doc/zh-cn/manual/assets/04a8205286f6d7f1800685d797b6189d.png differ
diff --git a/doc/zh-cn/manual/assets/0d448a0e9ef8b37fae81f247b32ec819.png b/doc/zh-cn/manual/assets/0d448a0e9ef8b37fae81f247b32ec819.png
new file mode 100644
index 0000000..00faa9a
Binary files /dev/null and b/doc/zh-cn/manual/assets/0d448a0e9ef8b37fae81f247b32ec819.png differ
diff --git a/doc/zh-cn/manual/assets/1035fd7d3fc6df318e2c9f01781ae19e.png b/doc/zh-cn/manual/assets/1035fd7d3fc6df318e2c9f01781ae19e.png
new file mode 100644
index 0000000..be941bb
Binary files /dev/null and b/doc/zh-cn/manual/assets/1035fd7d3fc6df318e2c9f01781ae19e.png differ
diff --git a/doc/zh-cn/manual/assets/1862adfaf0ccec35da3fb2eeae0555f8.png b/doc/zh-cn/manual/assets/1862adfaf0ccec35da3fb2eeae0555f8.png
new file mode 100644
index 0000000..e33c389
Binary files /dev/null and b/doc/zh-cn/manual/assets/1862adfaf0ccec35da3fb2eeae0555f8.png differ
diff --git a/doc/zh-cn/manual/assets/1ff91081f273e7cfa8032f4a15104856.png b/doc/zh-cn/manual/assets/1ff91081f273e7cfa8032f4a15104856.png
new file mode 100644
index 0000000..1c27fe2
Binary files /dev/null and b/doc/zh-cn/manual/assets/1ff91081f273e7cfa8032f4a15104856.png differ
diff --git a/doc/zh-cn/manual/assets/257266eb7aeb768e2dbb29b40c6f657b.png b/doc/zh-cn/manual/assets/257266eb7aeb768e2dbb29b40c6f657b.png
new file mode 100644
index 0000000..d6ec1c0
Binary files /dev/null and b/doc/zh-cn/manual/assets/257266eb7aeb768e2dbb29b40c6f657b.png differ
diff --git a/doc/zh-cn/manual/assets/25a710552a2ab7020a7705a60bfbbe91.png b/doc/zh-cn/manual/assets/25a710552a2ab7020a7705a60bfbbe91.png
new file mode 100644
index 0000000..dc92778
Binary files /dev/null and b/doc/zh-cn/manual/assets/25a710552a2ab7020a7705a60bfbbe91.png differ
diff --git a/doc/zh-cn/manual/assets/3257613c2cda1a286bd30a37d1a39b16.png b/doc/zh-cn/manual/assets/3257613c2cda1a286bd30a37d1a39b16.png
new file mode 100644
index 0000000..c5c35ee
Binary files /dev/null and b/doc/zh-cn/manual/assets/3257613c2cda1a286bd30a37d1a39b16.png differ
diff --git a/doc/zh-cn/manual/assets/35f7b13e1b3c9b6befb3e115fb5127ed.png b/doc/zh-cn/manual/assets/35f7b13e1b3c9b6befb3e115fb5127ed.png
new file mode 100644
index 0000000..5a4dda6
Binary files /dev/null and b/doc/zh-cn/manual/assets/35f7b13e1b3c9b6befb3e115fb5127ed.png differ
diff --git a/doc/zh-cn/manual/assets/3f3e6a68d0cb7cd35b8a73f8cc8e56af.png b/doc/zh-cn/manual/assets/3f3e6a68d0cb7cd35b8a73f8cc8e56af.png
new file mode 100644
index 0000000..36cf1be
Binary files /dev/null and b/doc/zh-cn/manual/assets/3f3e6a68d0cb7cd35b8a73f8cc8e56af.png differ
diff --git a/doc/zh-cn/manual/assets/42187a33182093239b940f4e539146ed.png b/doc/zh-cn/manual/assets/42187a33182093239b940f4e539146ed.png
new file mode 100644
index 0000000..45c3a13
Binary files /dev/null and b/doc/zh-cn/manual/assets/42187a33182093239b940f4e539146ed.png differ
diff --git a/doc/zh-cn/manual/assets/480525f70e842a7ce1792148c340570e.png b/doc/zh-cn/manual/assets/480525f70e842a7ce1792148c340570e.png
new file mode 100644
index 0000000..5a650c5
Binary files /dev/null and b/doc/zh-cn/manual/assets/480525f70e842a7ce1792148c340570e.png differ
diff --git a/doc/zh-cn/manual/assets/6d483ce697250b630d0833f231258862.png b/doc/zh-cn/manual/assets/6d483ce697250b630d0833f231258862.png
new file mode 100644
index 0000000..d86ced1
Binary files /dev/null and b/doc/zh-cn/manual/assets/6d483ce697250b630d0833f231258862.png differ
diff --git a/doc/zh-cn/manual/assets/884b38da92fe3ec82e390bfee4f49e8a.png b/doc/zh-cn/manual/assets/884b38da92fe3ec82e390bfee4f49e8a.png
new file mode 100644
index 0000000..cb77b0d
Binary files /dev/null and b/doc/zh-cn/manual/assets/884b38da92fe3ec82e390bfee4f49e8a.png differ
diff --git a/doc/zh-cn/manual/assets/94464f920ad9e2f18e829d3e250db0ff.png b/doc/zh-cn/manual/assets/94464f920ad9e2f18e829d3e250db0ff.png
new file mode 100644
index 0000000..dfe034a
Binary files /dev/null and b/doc/zh-cn/manual/assets/94464f920ad9e2f18e829d3e250db0ff.png differ
diff --git a/doc/zh-cn/manual/assets/969b4eb190832348f2fde02a003d28e9.png b/doc/zh-cn/manual/assets/969b4eb190832348f2fde02a003d28e9.png
new file mode 100644
index 0000000..a40ca2d
Binary files /dev/null and b/doc/zh-cn/manual/assets/969b4eb190832348f2fde02a003d28e9.png differ
diff --git a/doc/zh-cn/manual/assets/9a26dde4c8f295f50895a748a93a2388.png b/doc/zh-cn/manual/assets/9a26dde4c8f295f50895a748a93a2388.png
new file mode 100644
index 0000000..a16a242
Binary files /dev/null and b/doc/zh-cn/manual/assets/9a26dde4c8f295f50895a748a93a2388.png differ
diff --git a/doc/zh-cn/manual/assets/b6b2a677e09aa5de0b2c2bae989785f1.png b/doc/zh-cn/manual/assets/b6b2a677e09aa5de0b2c2bae989785f1.png
new file mode 100644
index 0000000..44fc260
Binary files /dev/null and b/doc/zh-cn/manual/assets/b6b2a677e09aa5de0b2c2bae989785f1.png differ
diff --git a/doc/zh-cn/manual/assets/c696d4d2670a187df350ebc7898762c7.png b/doc/zh-cn/manual/assets/c696d4d2670a187df350ebc7898762c7.png
new file mode 100644
index 0000000..05593f4
Binary files /dev/null and b/doc/zh-cn/manual/assets/c696d4d2670a187df350ebc7898762c7.png differ
diff --git a/doc/zh-cn/manual/assets/ca8ec34ffff873089bfa92ab1aefef16.png b/doc/zh-cn/manual/assets/ca8ec34ffff873089bfa92ab1aefef16.png
new file mode 100644
index 0000000..96cc7b5
Binary files /dev/null and b/doc/zh-cn/manual/assets/ca8ec34ffff873089bfa92ab1aefef16.png differ
diff --git a/doc/zh-cn/manual/assets/ccc2dbcdd748d3bc9b7a4a33922ebab1.png b/doc/zh-cn/manual/assets/ccc2dbcdd748d3bc9b7a4a33922ebab1.png
new file mode 100644
index 0000000..3b98ed6
Binary files /dev/null and b/doc/zh-cn/manual/assets/ccc2dbcdd748d3bc9b7a4a33922ebab1.png differ
diff --git a/doc/zh-cn/manual/assets/ce2bf4be7a61d1918d37a212f179f9f9.png b/doc/zh-cn/manual/assets/ce2bf4be7a61d1918d37a212f179f9f9.png
new file mode 100644
index 0000000..d4867c8
Binary files /dev/null and b/doc/zh-cn/manual/assets/ce2bf4be7a61d1918d37a212f179f9f9.png differ
diff --git a/doc/zh-cn/manual/assets/d76e2fefcb4278c5b6df2cccb2503861.png b/doc/zh-cn/manual/assets/d76e2fefcb4278c5b6df2cccb2503861.png
new file mode 100644
index 0000000..16866a8
Binary files /dev/null and b/doc/zh-cn/manual/assets/d76e2fefcb4278c5b6df2cccb2503861.png differ
diff --git a/doc/zh-cn/manual/assets/e5bad99d9463c75b8fd7c691916bdc4e.png b/doc/zh-cn/manual/assets/e5bad99d9463c75b8fd7c691916bdc4e.png
new file mode 100644
index 0000000..64664ac
Binary files /dev/null and b/doc/zh-cn/manual/assets/e5bad99d9463c75b8fd7c691916bdc4e.png differ
diff --git a/doc/zh-cn/manual/assets/f33cebb57a4f92c744dedd8a1341d3e5.png b/doc/zh-cn/manual/assets/f33cebb57a4f92c744dedd8a1341d3e5.png
new file mode 100644
index 0000000..416c87f
Binary files /dev/null and b/doc/zh-cn/manual/assets/f33cebb57a4f92c744dedd8a1341d3e5.png differ
diff --git a/doc/zh-cn/manual/assets/f6e60a8e330e952e839b6273dc0a3c98.png b/doc/zh-cn/manual/assets/f6e60a8e330e952e839b6273dc0a3c98.png
new file mode 100644
index 0000000..c8e98e3
Binary files /dev/null and b/doc/zh-cn/manual/assets/f6e60a8e330e952e839b6273dc0a3c98.png differ
diff --git a/doc/zh-cn/manual/assets/ffb47cc3c181d7910489db104ea21fe6.png b/doc/zh-cn/manual/assets/ffb47cc3c181d7910489db104ea21fe6.png
new file mode 100644
index 0000000..04048fb
Binary files /dev/null and b/doc/zh-cn/manual/assets/ffb47cc3c181d7910489db104ea21fe6.png differ
diff --git a/doc/zh-cn/manual/codefever.md b/doc/zh-cn/manual/codefever.md
new file mode 100644
index 0000000..c58ec7f
--- /dev/null
+++ b/doc/zh-cn/manual/codefever.md
@@ -0,0 +1,39 @@
+# 什么是CodeFever?
+
+# 简介
+
+CodeFever 是一款蒲公英旗下的代码仓库平台,提供更加轻便、高效、稳定的研发生产。团队可以更自由的开展研发工作及规划部署项目等。
+
+# 主要功能
+
+CodeFever 为用户提供基础的 Git 代码托管,其中包括代码在线查看、历史版本查看、Fork、Merge Request、版本控制、保护分支、成员使用权限等方便管理、开发、协作的功能。
+
+# 为什么使用CodeFever?
+
+自建代码托管系统是多数企业在初期都会选择的,其中需要准备一些工作,比如:选择适合的开发场景的开源软件,准备一些托管代码的存储硬件设备等。
+
+在准备这些工作时,需要有对开源软件非常熟悉的工作人员进行搭建和日常维护,需要购买一些实体或者云端存储服务器,并且需要专门花费一些成本来提高整体的安全和稳定性。这些准备工作对于企业初期是一笔不小的投资成本,因此云端代码仓库此时就是多数企业初期的最优选择。
+
+云端代码仓库在代码存储方面,提供了高可用多副本,自动备份,支持高速访问;在代码安全方面提供了完善的权限机制,降低内部成员泄露代码数据的风险。
+
+CodeFever 是一款蒲公英为开发者打造的代码仓库平台,提供更加轻便、高效、稳定的研发生产。团队可以更自由的开展研发工作及规划部署项目等。
+
+CodeFever提供以下功能及保障:
+
+采用多副本高可用架构,自动备份免运维,保障代码安全。
+
+详尽的日志记录,不落下任何提交记录,使每一步都有效可追溯。
+
+云端高可用仓库,更加高效快捷,Git代码管理更加轻松。
+
+清晰的分支权限管理,设有保护分支,提高整体安全性,团队协作规范有序且流畅。
+
+增量代码自动扫描,提高 codereview 效率,合并前进行组员评审、审批等流程,提高代码质量。
+
+采用MergeRequest的代码审查机制,提高代码质量。
+
+全面精细的权限管理,适用不同人员管理仓库内容。
+
+仓库组成员权限设置,外包团队也可以安全使用。
+
+可对仓库进行IP访问设置,提升代码仓库安全等级。
diff --git a/doc/zh-cn/manual/commit.md b/doc/zh-cn/manual/commit.md
new file mode 100644
index 0000000..f179050
--- /dev/null
+++ b/doc/zh-cn/manual/commit.md
@@ -0,0 +1,19 @@
+# 提交
+
+仓库详情页面可点击 **提交** 按钮查看提交代码历史信息,若提交代码的历史信息过多,可根据分支筛选。
+
+
+
+图1 仓库提交信息详情页面显示
+
+点击 **提交信息标题** 可进入提交代码详情页面。
+
+
+
+图2 提交代码详情页面显示
+
+点击 **打开文件数** 按钮,可显示该文件位置, 方便查看与对比其他文件信息。
+
+
+
+图3 提交代码详情页面打开文件数显示
diff --git a/doc/zh-cn/manual/createBranch.md b/doc/zh-cn/manual/createBranch.md
new file mode 100644
index 0000000..fe184ce
--- /dev/null
+++ b/doc/zh-cn/manual/createBranch.md
@@ -0,0 +1,13 @@
+# 创建分支
+
+进入任意一个仓库中,点击 **分支** 按钮,在分支列表页面右上方点击 **新建分支** 按钮。
+
+
+
+图1 分支列表页新建分支按钮位置
+
+在新建分支页面填写分支信息并确认后即可完成分支创建。
+
+
+
+图2 新建分支页面
diff --git a/doc/zh-cn/manual/createGroup.md b/doc/zh-cn/manual/createGroup.md
new file mode 100644
index 0000000..9246230
--- /dev/null
+++ b/doc/zh-cn/manual/createGroup.md
@@ -0,0 +1,25 @@
+# 创建一个仓库组
+
+## 无仓库组时仓库组列表页创建仓库组
+
+点击登录后,落地页的仓库列表页中部 点击 新建**仓库组** 按钮。
+
+
+
+图1 仓库组列表页中部新建按钮位置
+
+## 使用导航栏快捷按钮创建仓库组
+
+点击导航栏右侧 **+** 按钮选择新建仓库组即可
+
+
+
+图1 快捷按钮位置
+
+## 使用创建仓库组按钮创建仓库
+
+登录成功后,在仓库组列表页右上方 **新建仓库组** 按钮即可
+
+
+
+图3 仓库组列表页创建仓库按钮位置
diff --git a/doc/zh-cn/manual/createRepository.md b/doc/zh-cn/manual/createRepository.md
new file mode 100644
index 0000000..1dfa3f8
--- /dev/null
+++ b/doc/zh-cn/manual/createRepository.md
@@ -0,0 +1,37 @@
+# 创建一个仓库
+
+## 无仓库时仓库列表页创建仓库
+
+登录成功后,在仓库列表页中部 点击 **创建仓库** 按钮。
+
+
+
+图1 仓库列表页中部新建按钮位置
+
+注:如果是第一次使用且无仓库组时,用户需先创建仓库组后再创建仓库。
+
+## 使用导航栏快捷按钮创建仓库
+
+点击导航栏右侧 **+** 按钮选择创建仓库即可
+
+
+
+图2 快捷按钮位置
+
+## 使用创建仓库按钮创建仓库
+
+登录成功后,在仓库列表页右上方 **创建仓库** 按钮即可
+
+
+
+图3 仓库列表页创建仓库按钮位置
+
+## 在指定仓库组中创建仓库
+
+1\. 进入需要创建仓库的仓库组首页
+
+2\. 点击页面右上角 **创建仓库** 按钮即可
+
+
+
+图4 仓库组首页中创建仓库按钮位置
diff --git a/doc/zh-cn/manual/file.md b/doc/zh-cn/manual/file.md
new file mode 100644
index 0000000..34fe996
--- /dev/null
+++ b/doc/zh-cn/manual/file.md
@@ -0,0 +1,21 @@
+# 文件
+
+CodeFever文件页面展示代码与仓库信息,支持fork操作,且提供HTTPS与SSH两种克隆方式。
+
+
+
+图1 仓库文件页面显示
+
+进入文件详情页面可以查看文件内容,历史操作,与blame。
+
+
+
+图2 文件详情页面显示
+
+
+
+图3 文件提交历史显示
+
+
+
+图4 文件blame信息显示
diff --git a/doc/zh-cn/manual/homepage.md b/doc/zh-cn/manual/homepage.md
new file mode 100644
index 0000000..811c747
--- /dev/null
+++ b/doc/zh-cn/manual/homepage.md
@@ -0,0 +1,59 @@
+# 首页
+
+# 仓库列表
+
+用户在CodeFever中的所有仓库信息以列表形式在首页中显示,包含用户参与的仓库与创建的仓库,方便用户快捷查看一些仓库数据。
+
+
+
+图1 首页仓库列表显示
+
+# 仓库组列表
+
+用户在CodeFever中的所有仓库组信息以卡片形式在首页中显示,包含用户参与的仓库组与创建的仓库组,方便用户快捷查看一些仓库组数据。
+
+
+
+图2 首页仓库组列表显示
+
+# 合并请求
+
+用户在CodeFever中所有合并请求数据以列表形式在首页中显示,包含已打开,已关闭,已合并的合并请求内容,用户也可在此页面快速创建合并请求。
+
+
+
+图3 首页合并请求列表页面
+
+任意页面顶部右上角快捷入口位置 点击 合并请求 按钮,也可进入合并请求总页面。
+
+
+
+图4 快捷入口合并请求按钮位置
+
+# 设置
+
+# 个人信息设置
+
+用户可在个人信息设置页面设置用户头像,用户名称,更改邮箱地址,更改手机信息,绑定第三方账号。
+
+
+
+图5 个人信息设置页面
+
+注:更改邮箱地址与手机后,会同步更新到蒲公英的账号信息中。
+
+# 多邮箱
+
+多邮箱功能用于同一用户有多个不同邮箱用于提交代码,用户添加后,系统可识别并创建关联关系。
+
+
+
+图6 多邮箱管理页面
+
+# SSH Keys
+
+SSH Key 用于 Git 客户端通过 SSH 协议与远端仓库通信的身份认证。当在 CodeFever 中设置 SSH Key 之后,使用 SSH 方式连接位于 CodeFever 上的仓库时不需要再输入用户和密码进行认证。
+
+
+
+图7 SSH Keys配置页面
diff --git a/doc/zh-cn/manual/index.md b/doc/zh-cn/manual/index.md
new file mode 100644
index 0000000..e9f6683
--- /dev/null
+++ b/doc/zh-cn/manual/index.md
@@ -0,0 +1,17 @@
+[什么是CodeFever?](/doc/cn/manual/codefever.md)
+
+[首页](/doc/cn/manual/homepage.md)
+
+[创建一个仓库](/doc/cn/manual/createRepository.md)
+
+[创建一个仓库组](/doc/cn/manual/createGroup.md)
+
+[创建一个分支](/doc/cn/manual/createBranch.md)
+
+[文件](/doc/cn/manual/file.md)
+
+[提交](/doc/cn/manual/commit.md)
+
+[合并请求](/doc/cn/manual/mergeRequest.md)
+
+[SSH密钥配置](/doc/cn/manual/sshKey.md)
diff --git a/doc/zh-cn/manual/mergeRequest.md b/doc/zh-cn/manual/mergeRequest.md
new file mode 100644
index 0000000..8b898ed
--- /dev/null
+++ b/doc/zh-cn/manual/mergeRequest.md
@@ -0,0 +1,17 @@
+# 合并请求
+
+开发人员将某分支下的代码提交合并请求到另一分支下,待请求通过后合并成功,可更好的保护分支代码安全,是CodeFever代码仓库中最重要的一环。
+
+
+
+图1 合并请求列表页面显示
+
+点击 **创建合并请求** 按钮,进入选择对比分支代码页面。
+
+
+
+图2 创建合并请求,选择分支代码页面显示
+
+进入创建合并请求页面
+
+
diff --git a/doc/zh-cn/manual/sshKey.md b/doc/zh-cn/manual/sshKey.md
new file mode 100644
index 0000000..6e2c473
--- /dev/null
+++ b/doc/zh-cn/manual/sshKey.md
@@ -0,0 +1,13 @@
+# 设置 SSH Key
+
+进入到 **设置** -> **SSH Keys** 中
+
+
+
+图1 SSH Keys设置按钮位置
+
+进入新增SSH Key页面,将复制的SSH Key内容粘贴,并为其编写名称后,点击 **新增SSH Key** 按钮即可添加成功,可在下方查看已添加SSH Key信息。
+
+
+
+图2 新增SSH Key内容页面
diff --git a/misc/create_db.sh b/misc/create_db.sh
index 997b615..2d92bea 100644
--- a/misc/create_db.sh
+++ b/misc/create_db.sh
@@ -31,4 +31,4 @@ echo -e "\n\n\n"
echo '=== IMPORTANT NOTICE ==='
echo '1. Codefever community version is installed.'
echo '2. Type http://127.0.0.1 OR http:// to login.'
-echo '3. Default login email: admin@codefever.cn, password: 123456 .'
+echo '3. Default login email: root@codefever.cn, password: 123456 .'
diff --git a/www/static/css/markdown.css b/www/static/css/markdown.css
new file mode 100644
index 0000000..1cca61d
--- /dev/null
+++ b/www/static/css/markdown.css
@@ -0,0 +1,4 @@
+@media(prefers-color-scheme:dark){.markdown-body{color-scheme:dark;--color-prettylights-syntax-comment:#8b949e;--color-prettylights-syntax-constant:#79c0ff;--color-prettylights-syntax-entity:#d2a8ff;--color-prettylights-syntax-storage-modifier-import:#c9d1d9;--color-prettylights-syntax-entity-tag:#7ee787;--color-prettylights-syntax-keyword:#ff7b72;--color-prettylights-syntax-string:#a5d6ff;--color-prettylights-syntax-variable:#ffa657;--color-prettylights-syntax-brackethighlighter-unmatched:#f85149;--color-prettylights-syntax-invalid-illegal-text:#f0f6fc;--color-prettylights-syntax-invalid-illegal-bg:#8e1519;--color-prettylights-syntax-carriage-return-text:#f0f6fc;--color-prettylights-syntax-carriage-return-bg:#b62324;--color-prettylights-syntax-string-regexp:#7ee787;--color-prettylights-syntax-markup-list:#f2cc60;--color-prettylights-syntax-markup-heading:#1f6feb;--color-prettylights-syntax-markup-italic:#c9d1d9;--color-prettylights-syntax-markup-bold:#c9d1d9;--color-prettylights-syntax-markup-deleted-text:#ffdcd7;--color-prettylights-syntax-markup-deleted-bg:#67060c;--color-prettylights-syntax-markup-inserted-text:#aff5b4;--color-prettylights-syntax-markup-inserted-bg:#033a16;--color-prettylights-syntax-markup-changed-text:#ffdfb6;--color-prettylights-syntax-markup-changed-bg:#5a1e02;--color-prettylights-syntax-markup-ignored-text:#c9d1d9;--color-prettylights-syntax-markup-ignored-bg:#1158c7;--color-prettylights-syntax-meta-diff-range:#d2a8ff;--color-prettylights-syntax-brackethighlighter-angle:#8b949e;--color-prettylights-syntax-sublimelinter-gutter-mark:#484f58;--color-prettylights-syntax-constant-other-reference-link:#a5d6ff;--color-fg-default:#c9d1d9;--color-fg-muted:#8b949e;--color-fg-subtle:#484f58;--color-canvas-default:#0d1117;--color-canvas-subtle:#161b22;--color-border-default:#30363d;--color-border-muted:#21262d;--color-neutral-muted:rgba(110,118,129,0.4);--color-accent-fg:#58a6ff;--color-accent-emphasis:#1f6feb;--color-attention-subtle:rgba(187,128,9,0.15);--color-danger-fg:#f85149}}@media(prefers-color-scheme:light){.markdown-body{color-scheme:light;--color-prettylights-syntax-comment:#6e7781;--color-prettylights-syntax-constant:#0550ae;--color-prettylights-syntax-entity:#8250df;--color-prettylights-syntax-storage-modifier-import:#24292f;--color-prettylights-syntax-entity-tag:#116329;--color-prettylights-syntax-keyword:#cf222e;--color-prettylights-syntax-string:#0a3069;--color-prettylights-syntax-variable:#953800;--color-prettylights-syntax-brackethighlighter-unmatched:#82071e;--color-prettylights-syntax-invalid-illegal-text:#f6f8fa;--color-prettylights-syntax-invalid-illegal-bg:#82071e;--color-prettylights-syntax-carriage-return-text:#f6f8fa;--color-prettylights-syntax-carriage-return-bg:#cf222e;--color-prettylights-syntax-string-regexp:#116329;--color-prettylights-syntax-markup-list:#3b2300;--color-prettylights-syntax-markup-heading:#0550ae;--color-prettylights-syntax-markup-italic:#24292f;--color-prettylights-syntax-markup-bold:#24292f;--color-prettylights-syntax-markup-deleted-text:#82071e;--color-prettylights-syntax-markup-deleted-bg:#ffebe9;--color-prettylights-syntax-markup-inserted-text:#116329;--color-prettylights-syntax-markup-inserted-bg:#dafbe1;--color-prettylights-syntax-markup-changed-text:#953800;--color-prettylights-syntax-markup-changed-bg:#ffd8b5;--color-prettylights-syntax-markup-ignored-text:#eaeef2;--color-prettylights-syntax-markup-ignored-bg:#0550ae;--color-prettylights-syntax-meta-diff-range:#8250df;--color-prettylights-syntax-brackethighlighter-angle:#57606a;--color-prettylights-syntax-sublimelinter-gutter-mark:#8c959f;--color-prettylights-syntax-constant-other-reference-link:#0a3069;--color-fg-default:#24292f;--color-fg-muted:#57606a;--color-fg-subtle:#6e7781;--color-canvas-default:#fff;--color-canvas-subtle:#f6f8fa;--color-border-default:#d0d7de;--color-border-muted:hsla(210,18%,87%,1);--color-neutral-muted:rgba(175,184,193,0.2);--color-accent-fg:#0969da;--color-accent-emphasis:#0969da;--color-attention-subtle:#fff8c5;--color-danger-fg:#cf222e}}.markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0;color:var(--color-fg-default);background-color:var(--color-canvas-default);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:16px;line-height:1.5;word-wrap:break-word}.markdown-body .octicon{display:inline-block;fill:currentColor;vertical-align:text-bottom}.markdown-body h1:hover .anchor .octicon-link:before,.markdown-body h2:hover .anchor .octicon-link:before,.markdown-body h3:hover .anchor .octicon-link:before,.markdown-body h4:hover .anchor .octicon-link:before,.markdown-body h5:hover .anchor .octicon-link:before,.markdown-body h6:hover .anchor .octicon-link:before{width:16px;height:16px;content:' ';display:inline-block;background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml,");mask-image:url("data:image/svg+xml,")}
+.markdown-body details,.markdown-body figcaption,.markdown-body figure{display:block}.markdown-body summary{display:list-item}.markdown-body [hidden]{display:none!important}.markdown-body a{background-color:transparent;color:var(--color-accent-fg);text-decoration:none}.markdown-body a:active,.markdown-body a:hover{outline-width:0}.markdown-body abbr[title]{border-bottom:0;text-decoration:underline dotted}.markdown-body b,.markdown-body strong{font-weight:600}.markdown-body dfn{font-style:italic}.markdown-body h1{margin:.67em 0;font-weight:600;padding-bottom:.3em;font-size:2em;border-bottom:1px solid var(--color-border-muted)}.markdown-body mark{background-color:var(--color-attention-subtle);color:var(--color-text-primary)}.markdown-body small{font-size:90%}.markdown-body sub,.markdown-body sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.markdown-body sub{bottom:-0.25em}.markdown-body sup{top:-0.5em}.markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:var(--color-canvas-default)}.markdown-body code,.markdown-body kbd,.markdown-body pre,.markdown-body samp{font-family:monospace,monospace;font-size:1em}.markdown-body figure{margin:1em 40px}.markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-border-muted);height:.25em;padding:0;margin:24px 0;background-color:var(--color-border-default);border:0}.markdown-body input{font:inherit;margin:0;overflow:visible;font-family:inherit;font-size:inherit;line-height:inherit}.markdown-body [type=button],.markdown-body [type=reset],.markdown-body [type=submit]{-webkit-appearance:button}.markdown-body [type=button]::-moz-focus-inner,.markdown-body [type=reset]::-moz-focus-inner,.markdown-body [type=submit]::-moz-focus-inner{border-style:none;padding:0}.markdown-body [type=button]:-moz-focusring,.markdown-body [type=reset]:-moz-focusring,.markdown-body [type=submit]:-moz-focusring{outline:1px dotted ButtonText}.markdown-body [type=checkbox],.markdown-body [type=radio]{box-sizing:border-box;padding:0}.markdown-body [type=number]::-webkit-inner-spin-button,.markdown-body [type=number]::-webkit-outer-spin-button{height:auto}.markdown-body [type=search]{-webkit-appearance:textfield;outline-offset:-2px}.markdown-body [type=search]::-webkit-search-cancel-button,.markdown-body [type=search]::-webkit-search-decoration{-webkit-appearance:none}.markdown-body ::-webkit-input-placeholder{color:inherit;opacity:.54}.markdown-body ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.markdown-body a:hover{text-decoration:underline}.markdown-body hr::before{display:table;content:""}.markdown-body hr::after{display:table;clear:both;content:""}.markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto}.markdown-body td,.markdown-body th{padding:0}.markdown-body details summary{cursor:pointer}.markdown-body details:not([open])>*:not(summary){display:none!important}.markdown-body kbd{display:inline-block;padding:3px 5px;font:11px ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;line-height:10px;color:var(--color-fg-default);vertical-align:middle;background-color:var(--color-canvas-subtle);border:solid 1px var(--color-neutral-muted);border-bottom-color:var(--color-neutral-muted);border-radius:6px;box-shadow:inset 0 -1px 0 var(--color-neutral-muted)}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-top:24px;margin-bottom:16px;font-weight:600;line-height:1.25}.markdown-body h2{font-weight:600;padding-bottom:.3em;font-size:1.5em;border-bottom:1px solid var(--color-border-muted)}.markdown-body h3{font-weight:600;font-size:1.25em}.markdown-body h4{font-weight:600;font-size:1em}.markdown-body h5{font-weight:600;font-size:.875em}.markdown-body h6{font-weight:600;font-size:.85em;color:var(--color-fg-muted)}.markdown-body p{margin-top:0;margin-bottom:10px}.markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-fg-muted);border-left:.25em solid var(--color-border-default)}.markdown-body ul,.markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em}.markdown-body ol ol,.markdown-body ul ol{list-style-type:lower-roman}.markdown-body ul ul ol,.markdown-body ul ol ol,.markdown-body ol ul ol,.markdown-body ol ol ol{list-style-type:lower-alpha}.markdown-body dd{margin-left:0}.markdown-body tt,.markdown-body code{font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:12px}.markdown-body pre{margin-top:0;margin-bottom:0;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:12px;word-wrap:normal}.markdown-body .octicon{display:inline-block;overflow:visible!important;vertical-align:text-bottom;fill:currentColor}.markdown-body ::placeholder{color:var(--color-fg-subtle);opacity:1}
+.markdown-body input::-webkit-outer-spin-button,.markdown-body input::-webkit-inner-spin-button{margin:0;-webkit-appearance:none;appearance:none}.markdown-body .pl-c{color:var(--color-prettylights-syntax-comment)}.markdown-body .pl-c1,.markdown-body .pl-s .pl-v{color:var(--color-prettylights-syntax-constant)}.markdown-body .pl-e,.markdown-body .pl-en{color:var(--color-prettylights-syntax-entity)}.markdown-body .pl-smi,.markdown-body .pl-s .pl-s1{color:var(--color-prettylights-syntax-storage-modifier-import)}.markdown-body .pl-ent{color:var(--color-prettylights-syntax-entity-tag)}.markdown-body .pl-k{color:var(--color-prettylights-syntax-keyword)}.markdown-body .pl-s,.markdown-body .pl-pds,.markdown-body .pl-s .pl-pse .pl-s1,.markdown-body .pl-sr,.markdown-body .pl-sr .pl-cce,.markdown-body .pl-sr .pl-sre,.markdown-body .pl-sr .pl-sra{color:var(--color-prettylights-syntax-string)}.markdown-body .pl-v,.markdown-body .pl-smw{color:var(--color-prettylights-syntax-variable)}.markdown-body .pl-bu{color:var(--color-prettylights-syntax-brackethighlighter-unmatched)}.markdown-body .pl-ii{color:var(--color-prettylights-syntax-invalid-illegal-text);background-color:var(--color-prettylights-syntax-invalid-illegal-bg)}.markdown-body .pl-c2{color:var(--color-prettylights-syntax-carriage-return-text);background-color:var(--color-prettylights-syntax-carriage-return-bg)}.markdown-body .pl-sr .pl-cce{font-weight:bold;color:var(--color-prettylights-syntax-string-regexp)}.markdown-body .pl-ml{color:var(--color-prettylights-syntax-markup-list)}.markdown-body .pl-mh,.markdown-body .pl-mh .pl-en,.markdown-body .pl-ms{font-weight:bold;color:var(--color-prettylights-syntax-markup-heading)}.markdown-body .pl-mi{font-style:italic;color:var(--color-prettylights-syntax-markup-italic)}.markdown-body .pl-mb{font-weight:bold;color:var(--color-prettylights-syntax-markup-bold)}.markdown-body .pl-md{color:var(--color-prettylights-syntax-markup-deleted-text);background-color:var(--color-prettylights-syntax-markup-deleted-bg)}.markdown-body .pl-mi1{color:var(--color-prettylights-syntax-markup-inserted-text);background-color:var(--color-prettylights-syntax-markup-inserted-bg)}.markdown-body .pl-mc{color:var(--color-prettylights-syntax-markup-changed-text);background-color:var(--color-prettylights-syntax-markup-changed-bg)}.markdown-body .pl-mi2{color:var(--color-prettylights-syntax-markup-ignored-text);background-color:var(--color-prettylights-syntax-markup-ignored-bg)}.markdown-body .pl-mdr{font-weight:bold;color:var(--color-prettylights-syntax-meta-diff-range)}.markdown-body .pl-ba{color:var(--color-prettylights-syntax-brackethighlighter-angle)}.markdown-body .pl-sg{color:var(--color-prettylights-syntax-sublimelinter-gutter-mark)}.markdown-body .pl-corl{text-decoration:underline;color:var(--color-prettylights-syntax-constant-other-reference-link)}.markdown-body [data-catalyst]{display:block}.markdown-body g-emoji{font-family:"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:1em;font-style:normal!important;font-weight:400;line-height:1;vertical-align:-0.075em}.markdown-body g-emoji img{width:1em;height:1em}.markdown-body::before{display:table;content:""}.markdown-body::after{display:table;clear:both;content:""}.markdown-body>*:first-child{margin-top:0!important}.markdown-body>*:last-child{margin-bottom:0!important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body .absent{color:var(--color-danger-fg)}.markdown-body .anchor{float:left;padding-right:4px;margin-left:-20px;line-height:1}.markdown-body .anchor:focus{outline:0}.markdown-body p,.markdown-body blockquote,.markdown-body ul,.markdown-body ol,.markdown-body dl,.markdown-body table,.markdown-body pre,.markdown-body details{margin-top:0;margin-bottom:16px}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body sup>a::before{content:"["}.markdown-body sup>a::after{content:"]"}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{color:var(--color-fg-default);vertical-align:middle;visibility:hidden}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{visibility:visible}.markdown-body h1 tt,.markdown-body h1 code,.markdown-body h2 tt,.markdown-body h2 code,.markdown-body h3 tt,.markdown-body h3 code,.markdown-body h4 tt,.markdown-body h4 code,.markdown-body h5 tt,.markdown-body h5 code,.markdown-body h6 tt,.markdown-body h6 code{padding:0 .2em;font-size:inherit}
+.markdown-body ul.no-list,.markdown-body ol.no-list{padding:0;list-style-type:none}.markdown-body ol[type="1"]{list-style-type:decimal}.markdown-body ol[type=a]{list-style-type:lower-alpha}.markdown-body ol[type=i]{list-style-type:lower-roman}.markdown-body div>ol:not([type]){list-style-type:decimal}.markdown-body ul ul,.markdown-body ul ol,.markdown-body ol ol,.markdown-body ol ul{margin-top:0;margin-bottom:0}.markdown-body li>p{margin-top:16px}.markdown-body li+li{margin-top:.25em}.markdown-body dl{padding:0}.markdown-body dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:600}.markdown-body dl dd{padding:0 16px;margin-bottom:16px}.markdown-body table th{font-weight:600}.markdown-body table th,.markdown-body table td{padding:6px 13px;border:1px solid var(--color-border-default)}.markdown-body table tr{background-color:var(--color-canvas-default);border-top:1px solid var(--color-border-muted)}.markdown-body table tr:nth-child(2n){background-color:var(--color-canvas-subtle)}.markdown-body table img{background-color:transparent}.markdown-body img[align=right]{padding-left:20px}.markdown-body img[align=left]{padding-right:20px}.markdown-body .emoji{max-width:none;vertical-align:text-top;background-color:transparent}.markdown-body span.frame{display:block;overflow:hidden}.markdown-body span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid var(--color-border-default)}.markdown-body span.frame span img{display:block;float:left}.markdown-body span.frame span span{display:block;padding:5px 0 0;clear:both;color:var(--color-fg-default)}.markdown-body span.align-center{display:block;overflow:hidden;clear:both}.markdown-body span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown-body span.align-center span img{margin:0 auto;text-align:center}.markdown-body span.align-right{display:block;overflow:hidden;clear:both}.markdown-body span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown-body span.align-right span img{margin:0;text-align:right}.markdown-body span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown-body span.float-left span{margin:13px 0 0}.markdown-body span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown-body span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown-body code,.markdown-body tt{padding:.2em .4em;margin:0;font-size:85%;background-color:var(--color-neutral-muted);border-radius:6px}.markdown-body code br,.markdown-body tt br{display:none}.markdown-body del code{text-decoration:inherit}.markdown-body pre code{font-size:100%}.markdown-body pre>code{padding:0;margin:0;word-break:normal;white-space:pre;background:transparent;border:0}.markdown-body .highlight{margin-bottom:16px}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body .highlight pre,.markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:var(--color-canvas-subtle);border-radius:6px}.markdown-body pre code,.markdown-body pre tt{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown-body .csv-data td,.markdown-body .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.markdown-body .csv-data .blob-num{padding:10px 8px 9px;text-align:right;background:var(--color-canvas-default);border:0}.markdown-body .csv-data tr{border-top:0}.markdown-body .csv-data th{font-weight:600;background:var(--color-canvas-subtle);border-top:0}.markdown-body .footnotes{font-size:12px;color:var(--color-fg-muted);border-top:1px solid var(--color-border-default)}.markdown-body .footnotes ol{padding-left:16px}.markdown-body .footnotes li{position:relative}.markdown-body .footnotes li:target::before{position:absolute;top:-8px;right:-8px;bottom:-8px;left:-24px;pointer-events:none;content:"";border:2px solid var(--color-accent-emphasis);border-radius:6px}.markdown-body .footnotes li:target{color:var(--color-fg-default)}.markdown-body .footnotes .data-footnote-backref g-emoji{font-family:monospace}.markdown-body .task-list-item{list-style-type:none}.markdown-body .task-list-item label{font-weight:400}.markdown-body .task-list-item.enabled label{cursor:pointer}.markdown-body .task-list-item+.task-list-item{margin-top:3px}.markdown-body .task-list-item .handle{display:none}.markdown-body .task-list-item-checkbox{margin:0 .2em .25em -1.6em;vertical-align:middle}.markdown-body .contains-task-list:dir(rtl) .task-list-item-checkbox{margin:0 -1.6em .25em .2em}.markdown-body ::-webkit-calendar-picker-indicator{filter:invert(50%)}
\ No newline at end of file
diff --git a/www/static/script/marked.min.js b/www/static/script/marked.min.js
new file mode 100644
index 0000000..be35490
--- /dev/null
+++ b/www/static/script/marked.min.js
@@ -0,0 +1,6 @@
+/**
+ * marked - a markdown parser
+ * Copyright (c) 2011-2022, Christopher Jeffrey. (MIT Licensed)
+ * https://github.com/markedjs/marked
+ */
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).marked={})}(this,function(r){"use strict";function i(e,t){for(var u=0;ue.length)&&(t=e.length);for(var u=0,n=new Array(t);u=e.length?{done:!0}:{done:!1,value:e[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function e(){return{baseUrl:null,breaks:!1,extensions:null,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:null,sanitize:!1,sanitizer:null,silent:!1,smartLists:!1,smartypants:!1,tokenizer:null,walkTokens:null,xhtml:!1}}r.defaults=e();function u(e){return t[e]}var n=/[&<>"']/,l=/[&<>"']/g,a=/[<>"']|&(?!#?\w+;)/,o=/[<>"']|&(?!#?\w+;)/g,t={"&":"&","<":"<",">":">",'"':""","'":"'"};function D(e,t){if(t){if(n.test(e))return e.replace(l,u)}else if(a.test(e))return e.replace(o,u);return e}var c=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi;function m(e){return e.replace(c,function(e,t){return"colon"===(t=t.toLowerCase())?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""})}var h=/(^|[^\[])\^/g;function p(u,e){u=u.source||u,e=e||"";var n={replace:function(e,t){return t=(t=t.source||t).replace(h,"$1"),u=u.replace(e,t),n},getRegex:function(){return new RegExp(u,e)}};return n}var f=/[^\w:]/g,g=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;function F(e,t,u){if(e){var n;try{n=decodeURIComponent(m(u)).replace(f,"").toLowerCase()}catch(e){return null}if(0===n.indexOf("javascript:")||0===n.indexOf("vbscript:")||0===n.indexOf("data:"))return null}t&&!g.test(u)&&(u=function(e,t){A[" "+e]||(d.test(e)?A[" "+e]=e+"/":A[" "+e]=w(e,"/",!0));var u=-1===(e=A[" "+e]).indexOf(":");return"//"===t.substring(0,2)?u?t:e.replace(C,"$1")+t:"/"===t.charAt(0)?u?t:e.replace(k,"$1")+t:e+t}(t,u));try{u=encodeURI(u).replace(/%25/g,"%")}catch(e){return null}return u}var A={},d=/^[^:]+:\/*[^/]*$/,C=/^([^:]+:)[\s\S]*$/,k=/^([^:]+:\/*[^/]*)[\s\S]*$/;var E={exec:function(){}};function b(e){for(var t,u,n=1;nt)u.splice(t);else for(;u.length>=1,e+=e;return u+e}function _(e,t,u,n){var r=t.href,i=t.title?D(t.title):null,t=e[1].replace(/\\([\[\]])/g,"$1");if("!"===e[0].charAt(0))return{type:"image",raw:u,href:r,title:i,text:D(t)};n.state.inLink=!0;t={type:"link",raw:u,href:r,title:i,text:t,tokens:n.inlineTokens(t,[])};return n.state.inLink=!1,t}var z=function(){function e(e){this.options=e||r.defaults}var t=e.prototype;return t.space=function(e){e=this.rules.block.newline.exec(e);if(e&&0=u.length?e.slice(u.length):e}).join("\n")}(u,t[3]||"");return{type:"code",raw:u,lang:t[2]&&t[2].trim(),text:e}}},t.heading=function(e){var t=this.rules.block.heading.exec(e);if(t){var u=t[2].trim();/#$/.test(u)&&(e=w(u,"#"),!this.options.pedantic&&e&&!/ $/.test(e)||(u=e.trim()));u={type:"heading",raw:t[0],depth:t[1].length,text:u,tokens:[]};return this.lexer.inline(u.text,u.tokens),u}},t.hr=function(e){e=this.rules.block.hr.exec(e);if(e)return{type:"hr",raw:e[0]}},t.blockquote=function(e){var t=this.rules.block.blockquote.exec(e);if(t){e=t[0].replace(/^ *> ?/gm,"");return{type:"blockquote",raw:t[0],tokens:this.lexer.blockTokens(e,[]),text:e}}},t.list=function(e){var t=this.rules.block.list.exec(e);if(t){var u,n,r,i,s,l,a,o,D,c,h,p=1<(g=t[1].trim()).length,f={type:"list",raw:"",ordered:p,start:p?+g.slice(0,-1):"",loose:!1,items:[]},g=p?"\\d{1,9}\\"+g.slice(-1):"\\"+g;this.options.pedantic&&(g=p?g:"[*+-]");for(var F=new RegExp("^( {0,3}"+g+")((?: [^\\n]*)?(?:\\n|$))");e&&(h=!1,t=F.exec(e))&&!this.rules.block.hr.test(e);){if(u=t[0],e=e.substring(u.length),a=t[2].split("\n",1)[0],o=e.split("\n",1)[0],this.options.pedantic?(i=2,c=a.trimLeft()):(i=t[2].search(/[^ ]/),c=a.slice(i=4=i||!a.trim())c+="\n"+a.slice(i);else{if(s)break;c+="\n"+a}s||a.trim()||(s=!0),u+=D+"\n",e=e.substring(D.length+1)}f.loose||(l?f.loose=!0:/\n *\n *$/.test(u)&&(l=!0)),this.options.gfm&&(n=/^\[[ xX]\] /.exec(c))&&(r="[ ] "!==n[0],c=c.replace(/^\[[ xX]\] +/,"")),f.items.push({type:"list_item",raw:u,task:!!n,checked:r,loose:!1,text:c}),f.raw+=u}f.items[f.items.length-1].raw=u.trimRight(),f.items[f.items.length-1].text=c.trimRight(),f.raw=f.raw.trimRight();for(var d=f.items.length,C=0;C/i.test(e[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(e[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(e[0])&&(this.lexer.state.inRawBlock=!1),{type:this.options.sanitize?"text":"html",raw:e[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(e[0]):D(e[0]):e[0]}},t.link=function(e){var t=this.rules.inline.link.exec(e);if(t){e=t[2].trim();if(!this.options.pedantic&&/^$/.test(e))return;var u=w(e.slice(0,-1),"\\");if((e.length-u.length)%2==0)return}else{var n=function(e,t){if(-1===e.indexOf(t[1]))return-1;for(var u=e.length,n=0,r=0;r$/.test(e)?u.slice(1):u.slice(1,-1):u)&&u.replace(this.rules.inline._escapes,"$1"),title:n&&n.replace(this.rules.inline._escapes,"$1")},t[0],this.lexer)}},t.reflink=function(e,t){if((u=this.rules.inline.reflink.exec(e))||(u=this.rules.inline.nolink.exec(e))){var e=(u[2]||u[1]).replace(/\s+/g," ");if((e=t[e.toLowerCase()])&&e.href)return _(u,e,u[0],this.lexer);var u=u[0].charAt(0);return{type:"text",raw:u,text:u}}},t.emStrong=function(e,t,u){void 0===u&&(u="");var n=this.rules.inline.emStrong.lDelim.exec(e);if(n&&(!n[3]||!u.match(/(?:[0-9A-Za-z\xAA\xB2\xB3\xB5\xB9\xBA\xBC-\xBE\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u0660-\u0669\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07C0-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0966-\u096F\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09E6-\u09F1\u09F4-\u09F9\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A66-\u0A6F\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B66-\u0B6F\u0B71-\u0B77\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0BE6-\u0BF2\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C66-\u0C6F\u0C78-\u0C7E\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CE6-\u0CEF\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D58-\u0D61\u0D66-\u0D78\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DE6-\u0DEF\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F20-\u0F33\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F-\u1049\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u1090-\u1099\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1369-\u137C\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A16\u1A20-\u1A54\u1A80-\u1A89\u1A90-\u1A99\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B50-\u1B59\u1B83-\u1BA0\u1BAE-\u1BE5\u1C00-\u1C23\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2070\u2071\u2074-\u2079\u207F-\u2089\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2150-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2CFD\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u3192-\u3195\u31A0-\u31BF\u31F0-\u31FF\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA830-\uA835\uA840-\uA873\uA882-\uA8B3\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA900-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF-\uA9D9\uA9E0-\uA9E4\uA9E6-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDE80-\uDE9C\uDEA0-\uDED0\uDEE1-\uDEFB\uDF00-\uDF23\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC58-\uDC76\uDC79-\uDC9E\uDCA7-\uDCAF\uDCE0-\uDCF2\uDCF4\uDCF5\uDCFB-\uDD1B\uDD20-\uDD39\uDD80-\uDDB7\uDDBC-\uDDCF\uDDD2-\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE40-\uDE48\uDE60-\uDE7E\uDE80-\uDE9F\uDEC0-\uDEC7\uDEC9-\uDEE4\uDEEB-\uDEEF\uDF00-\uDF35\uDF40-\uDF55\uDF58-\uDF72\uDF78-\uDF91\uDFA9-\uDFAF]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDCFA-\uDD23\uDD30-\uDD39\uDE60-\uDE7E\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF27\uDF30-\uDF45\uDF51-\uDF54\uDF70-\uDF81\uDFB0-\uDFCB\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC52-\uDC6F\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD03-\uDD26\uDD36-\uDD3F\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDD0-\uDDDA\uDDDC\uDDE1-\uDDF4\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDEF0-\uDEF9\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC50-\uDC59\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE50-\uDE59\uDE80-\uDEAA\uDEB8\uDEC0-\uDEC9\uDF00-\uDF1A\uDF30-\uDF3B\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCF2\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC50-\uDC6C\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF2\uDFB0\uDFC0-\uDFD4]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDE70-\uDEBE\uDEC0-\uDEC9\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE96\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD834[\uDEE0-\uDEF3\uDF60-\uDF78]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD837[\uDF00-\uDF1E]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD40-\uDD49\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB\uDEF0-\uDEF9]|\uD839[\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDCC7-\uDCCF\uDD00-\uDD43\uDD4B\uDD50-\uDD59]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83C[\uDD00-\uDD0C]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF38\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A])/))){var r=n[1]||n[2]||"";if(!r||""===u||this.rules.inline.punctuation.exec(u)){var i,s=n[0].length-1,l=s,a=0,o="*"===n[0][0]?this.rules.inline.emStrong.rDelimAst:this.rules.inline.emStrong.rDelimUnd;for(o.lastIndex=0,t=t.slice(-1*e.length+s);null!=(n=o.exec(t));)if(i=n[1]||n[2]||n[3]||n[4]||n[5]||n[6])if(i=i.length,n[3]||n[4])l+=i;else if(!((n[5]||n[6])&&s%3)||(s+i)%3){if(!(0<(l-=i))){if(i=Math.min(i,i+l+a),Math.min(s,i)%2){var D=e.slice(1,s+n.index+i);return{type:"em",raw:e.slice(0,s+n.index+i+1),text:D,tokens:this.lexer.inlineTokens(D,[])}}D=e.slice(2,s+n.index+i-1);return{type:"strong",raw:e.slice(0,s+n.index+i+1),text:D,tokens:this.lexer.inlineTokens(D,[])}}}else a+=i}}},t.codespan=function(e){var t=this.rules.inline.code.exec(e);if(t){var u=t[2].replace(/\n/g," "),n=/[^ ]/.test(u),e=/^ /.test(u)&&/ $/.test(u),u=D(u=n&&e?u.substring(1,u.length-1):u,!0);return{type:"codespan",raw:t[0],text:u}}},t.br=function(e){e=this.rules.inline.br.exec(e);if(e)return{type:"br",raw:e[0]}},t.del=function(e){e=this.rules.inline.del.exec(e);if(e)return{type:"del",raw:e[0],text:e[2],tokens:this.lexer.inlineTokens(e[2],[])}},t.autolink=function(e,t){e=this.rules.inline.autolink.exec(e);if(e){var u,t="@"===e[2]?"mailto:"+(u=D(this.options.mangle?t(e[1]):e[1])):u=D(e[1]);return{type:"link",raw:e[0],text:u,href:t,tokens:[{type:"text",raw:u,text:u}]}}},t.url=function(e,t){var u,n,r,i;if(u=this.rules.inline.url.exec(e)){if("@"===u[2])r="mailto:"+(n=D(this.options.mangle?t(u[0]):u[0]));else{for(;i=u[0],u[0]=this.rules.inline._backpedal.exec(u[0])[0],i!==u[0];);n=D(u[0]),r="www."===u[1]?"http://"+n:n}return{type:"link",raw:u[0],text:n,href:r,tokens:[{type:"text",raw:n,text:n}]}}},t.inlineText=function(e,t){e=this.rules.inline.text.exec(e);if(e){t=this.lexer.state.inRawBlock?this.options.sanitize?this.options.sanitizer?this.options.sanitizer(e[0]):D(e[0]):e[0]:D(this.options.smartypants?t(e[0]):e[0]);return{type:"text",raw:e[0],text:t}}},e}(),$={newline:/^(?: *(?:\n|$))+/,code:/^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,fences:/^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?=\n|$)|$)/,hr:/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,heading:/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3}bull)( [^\n]+?)?(?:\n|$)/,html:"^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))",def:/^ {0,3}\[(label)\]: *\n? *([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,table:E,lheading:/^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,_paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,text:/^[^\n]+/,_label:/(?!\s*\])(?:\\[\[\]]|[^\[\]])+/,_title:/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/};$.def=p($.def).replace("label",$._label).replace("title",$._title).getRegex(),$.bullet=/(?:[*+-]|\d{1,9}[.)])/,$.listItemStart=p(/^( *)(bull) */).replace("bull",$.bullet).getRegex(),$.list=p($.list).replace(/bull/g,$.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+$.def.source+")").getRegex(),$._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",$._comment=/|$)/,$.html=p($.html,"i").replace("comment",$._comment).replace("tag",$._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),$.paragraph=p($._paragraph).replace("hr",$.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",$._tag).getRegex(),$.blockquote=p($.blockquote).replace("paragraph",$.paragraph).getRegex(),$.normal=b({},$),$.gfm=b({},$.normal,{table:"^ *([^\\n ].*\\|.*)\\n {0,3}(?:\\| *)?(:?-+:? *(?:\\| *:?-+:? *)*)(?:\\| *)?(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"}),$.gfm.table=p($.gfm.table).replace("hr",$.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",$._tag).getRegex(),$.gfm.paragraph=p($._paragraph).replace("hr",$.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("table",$.gfm.table).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",$._tag).getRegex(),$.pedantic=b({},$.normal,{html:p("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?\\1> *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",$._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:E,paragraph:p($.normal._paragraph).replace("hr",$.hr).replace("heading"," *#{1,6} *[^\n]").replace("lheading",$.lheading).replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").getRegex()});var S={escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:E,tag:"^comment|^[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^",link:/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,nolink:/^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,reflinkSearch:"reflink|nolink(?!\\()",emStrong:{lDelim:/^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/,rDelimAst:/^[^_*]*?\_\_[^_*]*?\*[^_*]*?(?=\_\_)|[punct_](\*+)(?=[\s]|$)|[^punct*_\s](\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|[^punct*_\s](\*+)(?=[^punct*_\s])/,rDelimUnd:/^[^_*]*?\*\*[^_*]*?\_[^_*]*?(?=\*\*)|[punct*](\_+)(?=[\s]|$)|[^punct*_\s](\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/},code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:E,text:/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\?@\\[\\]`^{|}~",S.punctuation=p(S.punctuation).replace(/punctuation/g,S._punctuation).getRegex(),S.blockSkip=/\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g,S.escapedEmSt=/\\\*|\\_/g,S._comment=p($._comment).replace("(?:--\x3e|$)","--\x3e").getRegex(),S.emStrong.lDelim=p(S.emStrong.lDelim).replace(/punct/g,S._punctuation).getRegex(),S.emStrong.rDelimAst=p(S.emStrong.rDelimAst,"g").replace(/punct/g,S._punctuation).getRegex(),S.emStrong.rDelimUnd=p(S.emStrong.rDelimUnd,"g").replace(/punct/g,S._punctuation).getRegex(),S._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g,S._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,S._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,S.autolink=p(S.autolink).replace("scheme",S._scheme).replace("email",S._email).getRegex(),S._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,S.tag=p(S.tag).replace("comment",S._comment).replace("attribute",S._attribute).getRegex(),S._label=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,S._href=/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/,S._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,S.link=p(S.link).replace("label",S._label).replace("href",S._href).replace("title",S._title).getRegex(),S.reflink=p(S.reflink).replace("label",S._label).getRegex(),S.reflinkSearch=p(S.reflinkSearch,"g").replace("reflink",S.reflink).replace("nolink",S.nolink).getRegex(),S.normal=b({},S),S.pedantic=b({},S.normal,{strong:{start:/^__|\*\*/,middle:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,endAst:/\*\*(?!\*)/g,endUnd:/__(?!_)/g},em:{start:/^_|\*/,middle:/^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,endAst:/\*(?!\*)/g,endUnd:/_(?!_)/g},link:p(/^!?\[(label)\]\((.*?)\)/).replace("label",S._label).getRegex(),reflink:p(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",S._label).getRegex()}),S.gfm=b({},S.normal,{escape:p(S.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\'+(u?e:D(e,!0))+"\n":"
";throw e}},j.Parser=L,j.parser=L.parse,j.Renderer=Z,j.TextRenderer=O,j.Lexer=I,j.lexer=I.lex,j.Tokenizer=z,j.Slugger=q;var P=(j.parse=j).options,Q=j.setOptions,U=j.use,M=j.walkTokens,N=j.parseInline,X=j,G=L.parse,E=I.lex;r.Lexer=I,r.Parser=L,r.Renderer=Z,r.Slugger=q,r.TextRenderer=O,r.Tokenizer=z,r.getDefaults=e,r.lexer=E,r.marked=j,r.options=P,r.parse=X,r.parseInline=N,r.parser=G,r.setOptions=Q,r.use=U,r.walkTokens=M,Object.defineProperty(r,"__esModule",{value:!0})});
\ No newline at end of file